From f0dfbfc3d79677736ba33797e702f9de57d63a01 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 13:18:32 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .github/ISSUE_TEMPLATE/bug_report.md | 38 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/workflows/codeql.yml | 70 + .github/workflows/greetings.yml | 16 + .github/workflows/pylint.yml | 25 + .github/workflows/requirementsTest.yml | 22 + .gitignore | 7 + CODE_OF_CONDUCT.md | 128 + CONTRIBUTING.md | 27 + Dockerfile | 9 + LICENSE | 201 + Procfile | 1 + README.md | 130 + README.wehub.md | 7 + UserGuide.md | 72 + _config.yml | 1 + app.py | 78 + assets/custom-script.js | 0 assets/favicon.ico | Bin 0 -> 4286 bytes assets/style.css | 33 + libs/dashboard.py | 2127 ++ libs/dataframe_visualizer.py | 24 + libs/util.py | 31 + media/DatasetView.png | Bin 0 -> 59470 bytes media/DownloadView.png | Bin 0 -> 24368 bytes media/IrisRandomForest.png | Bin 0 -> 84724 bytes media/blocklyML_Banner.png | Bin 0 -> 11308 bytes media/blocklyML_icon.png | Bin 0 -> 28222 bytes media/blocklyML_logo.png | Bin 0 -> 39768 bytes media/blocklyML_upload.png | Bin 0 -> 36455 bytes media/butttons.png | Bin 0 -> 1456 bytes media/upload_buttton.png | Bin 0 -> 3688 bytes requirements.txt | 30 + .../Pycaret/Pycaret_LR_IRIS.xml | 1 + .../Pycaret/Pycaret_RF_IRIS.xml | 1 + .../sk learn/blocklyML_RF_IRIS.xml | 1 + .../sk learn/blocklyML_RF_TITANIC.xml | 1 + static/css/icon.png | Bin 0 -> 3262 bytes static/css/icons.png | Bin 0 -> 546 bytes static/css/style.css | 526 + static/images/blocklyML_logo.png | Bin 0 -> 39175 bytes static/images/favicon.ico | Bin 0 -> 4286 bytes static/js/blockly.js | 728 + static/js/blockly_ML.js | 233 + static/js/blockly_compressed.js | 1484 ++ static/js/blockly_compressed.js.map | 1 + static/js/blockly_uncompressed.js | 232 + static/js/blocks/colour.js | 122 + static/js/blocks/lists.js | 862 + static/js/blocks/logic.js | 635 + static/js/blocks/loops.js | 356 + static/js/blocks/math.js | 566 + static/js/blocks/procedures.js | 1080 + static/js/blocks/text.js | 923 + static/js/blocks/variables.js | 163 + static/js/blocks/variables_dynamic.js | 180 + static/js/blocks_ML.js | 3461 +++ static/js/blocks_compressed.js | 182 + static/js/closure/goog/base.js | 531 + static/js/core/block.js | 1995 ++ static/js/core/block_animations.js | 203 + static/js/core/block_drag_surface.js | 212 + static/js/core/block_dragger.js | 379 + static/js/core/block_svg.js | 1755 ++ static/js/core/blockly.js | 629 + static/js/core/blocks.js | 23 + static/js/core/bubble.js | 934 + static/js/core/bubble_dragger.js | 275 + static/js/core/comment.js | 403 + static/js/core/connection.js | 683 + static/js/core/connection_checker.js | 286 + static/js/core/connection_db.js | 296 + static/js/core/constants.js | 277 + static/js/core/contextmenu.js | 308 + static/js/core/contextmenu_items.js | 536 + static/js/core/contextmenu_registry.js | 165 + static/js/core/css.js | 552 + static/js/core/dropdowndiv.js | 776 + static/js/core/events/block_events.js | 570 + static/js/core/events/events.js | 447 + static/js/core/events/events_abstract.js | 112 + static/js/core/events/events_block_drag.js | 80 + static/js/core/events/events_bubble_open.js | 80 + static/js/core/events/events_click.js | 75 + static/js/core/events/events_marker_move.js | 100 + static/js/core/events/events_selected.js | 77 + static/js/core/events/events_theme_change.js | 65 + .../core/events/events_toolbox_item_select.js | 78 + static/js/core/events/events_trashcan_open.js | 66 + static/js/core/events/events_viewport.js | 90 + static/js/core/events/ui_events.js | 116 + static/js/core/events/variable_events.js | 248 + static/js/core/events/workspace_events.js | 93 + static/js/core/events/ws_comment_events.js | 417 + static/js/core/extensions.js | 450 + static/js/core/field.js | 1082 + static/js/core/field_angle.js | 562 + static/js/core/field_checkbox.js | 220 + static/js/core/field_colour.js | 668 + static/js/core/field_dropdown.js | 765 + static/js/core/field_image.js | 286 + static/js/core/field_label.js | 130 + static/js/core/field_label_serializable.js | 69 + static/js/core/field_multilineinput.js | 297 + static/js/core/field_number.js | 317 + static/js/core/field_registry.js | 66 + static/js/core/field_textinput.js | 579 + static/js/core/field_variable.js | 464 + static/js/core/flyout_base.js | 1084 + static/js/core/flyout_button.js | 325 + static/js/core/flyout_dragger.js | 76 + static/js/core/flyout_horizontal.js | 418 + static/js/core/flyout_vertical.js | 428 + static/js/core/generator.js | 497 + static/js/core/gesture.js | 993 + static/js/core/grid.js | 222 + static/js/core/icon.js | 206 + static/js/core/inject.js | 482 + static/js/core/input.js | 297 + static/js/core/insertion_marker_manager.js | 701 + static/js/core/interfaces/i_accessibility.js | 73 + .../js/core/interfaces/i_bounded_element.js | 31 + static/js/core/interfaces/i_bubble.js | 83 + .../core/interfaces/i_connection_checker.js | 94 + static/js/core/interfaces/i_contextmenu.js | 26 + static/js/core/interfaces/i_copyable.js | 40 + static/js/core/interfaces/i_deletable.js | 27 + static/js/core/interfaces/i_deletearea.js | 28 + static/js/core/interfaces/i_flyout.js | 190 + static/js/core/interfaces/i_movable.js | 27 + static/js/core/interfaces/i_registrable.js | 22 + .../js/core/interfaces/i_registrable_field.js | 31 + static/js/core/interfaces/i_selectable.js | 43 + static/js/core/interfaces/i_styleable.js | 33 + static/js/core/interfaces/i_toolbox.js | 131 + static/js/core/interfaces/i_toolbox_item.js | 157 + static/js/core/keyboard_nav/ast_node.js | 685 + static/js/core/keyboard_nav/basic_cursor.js | 208 + static/js/core/keyboard_nav/cursor.js | 170 + static/js/core/keyboard_nav/flyout_cursor.js | 108 + static/js/core/keyboard_nav/marker.js | 120 + static/js/core/keyboard_nav/navigation.js | 1224 + .../core/keyboard_nav/tab_navigate_cursor.js | 48 + static/js/core/marker_manager.js | 183 + static/js/core/menu.js | 465 + static/js/core/menuitem.js | 280 + static/js/core/msg.js | 31 + static/js/core/mutator.js | 562 + static/js/core/names.js | 187 + static/js/core/options.js | 376 + static/js/core/procedures.js | 404 + static/js/core/registry.js | 265 + static/js/core/rendered_connection.js | 566 + .../core/renderers/common/block_rendering.js | 81 + static/js/core/renderers/common/constants.js | 1257 + static/js/core/renderers/common/debugger.js | 432 + static/js/core/renderers/common/drawer.js | 468 + .../js/core/renderers/common/i_path_object.js | 151 + static/js/core/renderers/common/info.js | 776 + static/js/core/renderers/common/marker_svg.js | 685 + .../js/core/renderers/common/path_object.js | 279 + static/js/core/renderers/common/renderer.js | 302 + static/js/core/renderers/geras/constants.js | 69 + static/js/core/renderers/geras/drawer.js | 205 + .../renderers/geras/highlight_constants.js | 311 + static/js/core/renderers/geras/highlighter.js | 256 + static/js/core/renderers/geras/info.js | 484 + .../renderers/geras/measurables/inputs.js | 67 + static/js/core/renderers/geras/path_object.js | 177 + static/js/core/renderers/geras/renderer.js | 138 + static/js/core/renderers/measurables/base.js | 44 + .../core/renderers/measurables/connections.js | 114 + .../js/core/renderers/measurables/inputs.js | 160 + .../renderers/measurables/row_elements.js | 185 + static/js/core/renderers/measurables/rows.js | 532 + static/js/core/renderers/measurables/types.js | 349 + .../js/core/renderers/minimalist/constants.js | 29 + static/js/core/renderers/minimalist/drawer.js | 32 + static/js/core/renderers/minimalist/info.js | 45 + .../js/core/renderers/minimalist/renderer.js | 70 + static/js/core/renderers/thrasos/info.js | 338 + static/js/core/renderers/thrasos/renderer.js | 45 + static/js/core/renderers/zelos/constants.js | 1003 + static/js/core/renderers/zelos/drawer.js | 233 + static/js/core/renderers/zelos/info.js | 588 + static/js/core/renderers/zelos/marker_svg.js | 148 + .../renderers/zelos/measurables/inputs.js | 47 + .../zelos/measurables/row_elements.js | 37 + .../core/renderers/zelos/measurables/rows.js | 108 + static/js/core/renderers/zelos/path_object.js | 244 + static/js/core/renderers/zelos/renderer.js | 131 + static/js/core/requires.js | 84 + static/js/core/scrollbar.js | 880 + static/js/core/shortcut_items.js | 263 + static/js/core/shortcut_registry.js | 357 + static/js/core/theme.js | 236 + static/js/core/theme/classic.js | 87 + static/js/core/theme/dark.js | 33 + static/js/core/theme/deuteranopia.js | 104 + static/js/core/theme/highcontrast.js | 119 + static/js/core/theme/modern.js | 108 + static/js/core/theme/tritanopia.js | 103 + static/js/core/theme/zelos.js | 106 + static/js/core/theme_manager.js | 197 + static/js/core/toolbox/category.js | 708 + .../js/core/toolbox/collapsible_category.js | 298 + static/js/core/toolbox/separator.js | 123 + static/js/core/toolbox/toolbox.js | 991 + static/js/core/toolbox/toolbox_item.js | 145 + static/js/core/tooltip.js | 387 + static/js/core/touch.js | 256 + static/js/core/touch_gesture.js | 325 + static/js/core/trashcan.js | 678 + static/js/core/utils.js | 652 + static/js/core/utils/aria.js | 167 + static/js/core/utils/colour.js | 208 + static/js/core/utils/coordinate.js | 125 + static/js/core/utils/deprecation.js | 34 + static/js/core/utils/dom.js | 391 + static/js/core/utils/global.js | 37 + static/js/core/utils/idgenerator.js | 33 + static/js/core/utils/keycodes.js | 164 + static/js/core/utils/math.js | 56 + static/js/core/utils/metrics.js | 124 + static/js/core/utils/object.js | 73 + static/js/core/utils/rect.js | 54 + static/js/core/utils/size.js | 58 + static/js/core/utils/string.js | 284 + static/js/core/utils/style.js | 281 + static/js/core/utils/svg.js | 181 + static/js/core/utils/svg_paths.js | 142 + static/js/core/utils/toolbox.js | 404 + static/js/core/utils/useragent.js | 110 + static/js/core/utils/xml.js | 79 + static/js/core/variable_map.js | 414 + static/js/core/variable_model.js | 95 + static/js/core/variables.js | 572 + static/js/core/variables_dynamic.js | 100 + static/js/core/warning.js | 156 + static/js/core/widgetdiv.js | 241 + static/js/core/workspace.js | 786 + static/js/core/workspace_audio.js | 154 + static/js/core/workspace_comment.js | 373 + .../js/core/workspace_comment_render_svg.js | 461 + static/js/core/workspace_comment_svg.js | 706 + static/js/core/workspace_drag_surface_svg.js | 176 + static/js/core/workspace_dragger.js | 85 + static/js/core/workspace_svg.js | 2665 ++ static/js/core/xml.js | 828 + static/js/core/zoom_controls.js | 447 + static/js/dart_compressed.js | 114 + static/js/dist/README.md | 77 + static/js/dist/blockly.d.ts | 21951 ++++++++++++++++ static/js/dist/blockly.js | 25 + static/js/dist/blockly.min.js | 2217 ++ static/js/dist/blockly_compressed.js | 1484 ++ static/js/dist/blockly_compressed.js.map | 1 + static/js/dist/blocks.d.ts | 15 + static/js/dist/blocks.js | 27 + static/js/dist/blocks/colour.js | 122 + static/js/dist/blocks/lists.js | 862 + static/js/dist/blocks/logic.js | 635 + static/js/dist/blocks/loops.js | 356 + static/js/dist/blocks/math.js | 566 + static/js/dist/blocks/procedures.js | 1080 + static/js/dist/blocks/text.js | 923 + static/js/dist/blocks/variables.js | 163 + static/js/dist/blocks/variables_dynamic.js | 180 + static/js/dist/blocks_compressed.js | 182 + static/js/dist/blocks_compressed.js.map | 1 + static/js/dist/browser.js | 36 + static/js/dist/core-browser.js | 34 + static/js/dist/core.d.ts | 15 + static/js/dist/core.js | 38 + static/js/dist/core/block.js | 1995 ++ static/js/dist/core/block_animations.js | 203 + static/js/dist/core/block_drag_surface.js | 212 + static/js/dist/core/block_dragger.js | 379 + static/js/dist/core/block_svg.js | 1755 ++ static/js/dist/core/blockly.js | 629 + static/js/dist/core/blocks.js | 23 + static/js/dist/core/bubble.js | 934 + static/js/dist/core/bubble_dragger.js | 275 + static/js/dist/core/comment.js | 403 + static/js/dist/core/connection.js | 683 + static/js/dist/core/connection_checker.js | 286 + static/js/dist/core/connection_db.js | 296 + static/js/dist/core/constants.js | 277 + static/js/dist/core/contextmenu.js | 308 + static/js/dist/core/contextmenu_items.js | 536 + static/js/dist/core/contextmenu_registry.js | 165 + static/js/dist/core/css.js | 552 + static/js/dist/core/dropdowndiv.js | 776 + static/js/dist/core/events/block_events.js | 570 + static/js/dist/core/events/events.js | 447 + static/js/dist/core/events/events_abstract.js | 112 + .../js/dist/core/events/events_block_drag.js | 80 + .../js/dist/core/events/events_bubble_open.js | 80 + static/js/dist/core/events/events_click.js | 75 + .../js/dist/core/events/events_marker_move.js | 100 + static/js/dist/core/events/events_selected.js | 77 + .../dist/core/events/events_theme_change.js | 65 + .../core/events/events_toolbox_item_select.js | 78 + .../dist/core/events/events_trashcan_open.js | 66 + static/js/dist/core/events/events_viewport.js | 90 + static/js/dist/core/events/ui_events.js | 116 + static/js/dist/core/events/variable_events.js | 248 + .../js/dist/core/events/workspace_events.js | 93 + .../js/dist/core/events/ws_comment_events.js | 417 + static/js/dist/core/extensions.js | 450 + static/js/dist/core/field.js | 1082 + static/js/dist/core/field_angle.js | 562 + static/js/dist/core/field_checkbox.js | 220 + static/js/dist/core/field_colour.js | 668 + static/js/dist/core/field_dropdown.js | 765 + static/js/dist/core/field_image.js | 286 + static/js/dist/core/field_label.js | 130 + .../js/dist/core/field_label_serializable.js | 69 + static/js/dist/core/field_multilineinput.js | 297 + static/js/dist/core/field_number.js | 317 + static/js/dist/core/field_registry.js | 66 + static/js/dist/core/field_textinput.js | 579 + static/js/dist/core/field_variable.js | 464 + static/js/dist/core/flyout_base.js | 1084 + static/js/dist/core/flyout_button.js | 325 + static/js/dist/core/flyout_dragger.js | 76 + static/js/dist/core/flyout_horizontal.js | 418 + static/js/dist/core/flyout_vertical.js | 428 + static/js/dist/core/generator.js | 497 + static/js/dist/core/gesture.js | 993 + static/js/dist/core/grid.js | 222 + static/js/dist/core/icon.js | 206 + static/js/dist/core/inject.js | 482 + static/js/dist/core/input.js | 297 + .../js/dist/core/insertion_marker_manager.js | 701 + .../dist/core/interfaces/i_accessibility.js | 73 + .../dist/core/interfaces/i_bounded_element.js | 31 + static/js/dist/core/interfaces/i_bubble.js | 83 + .../core/interfaces/i_connection_checker.js | 94 + .../js/dist/core/interfaces/i_contextmenu.js | 26 + static/js/dist/core/interfaces/i_copyable.js | 40 + static/js/dist/core/interfaces/i_deletable.js | 27 + .../js/dist/core/interfaces/i_deletearea.js | 28 + static/js/dist/core/interfaces/i_flyout.js | 190 + static/js/dist/core/interfaces/i_movable.js | 27 + .../js/dist/core/interfaces/i_registrable.js | 22 + .../core/interfaces/i_registrable_field.js | 31 + .../js/dist/core/interfaces/i_selectable.js | 43 + static/js/dist/core/interfaces/i_styleable.js | 33 + static/js/dist/core/interfaces/i_toolbox.js | 131 + .../js/dist/core/interfaces/i_toolbox_item.js | 157 + static/js/dist/core/keyboard_nav/ast_node.js | 685 + .../js/dist/core/keyboard_nav/basic_cursor.js | 208 + static/js/dist/core/keyboard_nav/cursor.js | 170 + .../dist/core/keyboard_nav/flyout_cursor.js | 108 + static/js/dist/core/keyboard_nav/marker.js | 120 + .../js/dist/core/keyboard_nav/navigation.js | 1224 + .../core/keyboard_nav/tab_navigate_cursor.js | 48 + static/js/dist/core/marker_manager.js | 183 + static/js/dist/core/menu.js | 465 + static/js/dist/core/menuitem.js | 280 + static/js/dist/core/msg.js | 31 + static/js/dist/core/mutator.js | 562 + static/js/dist/core/names.js | 187 + static/js/dist/core/options.js | 376 + static/js/dist/core/procedures.js | 404 + static/js/dist/core/registry.js | 265 + static/js/dist/core/rendered_connection.js | 566 + .../core/renderers/common/block_rendering.js | 81 + .../dist/core/renderers/common/constants.js | 1257 + .../js/dist/core/renderers/common/debugger.js | 432 + .../js/dist/core/renderers/common/drawer.js | 468 + .../core/renderers/common/i_path_object.js | 151 + static/js/dist/core/renderers/common/info.js | 776 + .../dist/core/renderers/common/marker_svg.js | 685 + .../dist/core/renderers/common/path_object.js | 279 + .../js/dist/core/renderers/common/renderer.js | 302 + .../js/dist/core/renderers/geras/constants.js | 69 + static/js/dist/core/renderers/geras/drawer.js | 205 + .../renderers/geras/highlight_constants.js | 311 + .../dist/core/renderers/geras/highlighter.js | 256 + static/js/dist/core/renderers/geras/info.js | 484 + .../renderers/geras/measurables/inputs.js | 67 + .../dist/core/renderers/geras/path_object.js | 177 + .../js/dist/core/renderers/geras/renderer.js | 138 + .../dist/core/renderers/measurables/base.js | 44 + .../core/renderers/measurables/connections.js | 114 + .../dist/core/renderers/measurables/inputs.js | 160 + .../renderers/measurables/row_elements.js | 185 + .../dist/core/renderers/measurables/rows.js | 532 + .../dist/core/renderers/measurables/types.js | 349 + .../core/renderers/minimalist/constants.js | 29 + .../dist/core/renderers/minimalist/drawer.js | 32 + .../js/dist/core/renderers/minimalist/info.js | 45 + .../core/renderers/minimalist/renderer.js | 70 + static/js/dist/core/renderers/thrasos/info.js | 338 + .../dist/core/renderers/thrasos/renderer.js | 45 + .../js/dist/core/renderers/zelos/constants.js | 1003 + static/js/dist/core/renderers/zelos/drawer.js | 233 + static/js/dist/core/renderers/zelos/info.js | 588 + .../dist/core/renderers/zelos/marker_svg.js | 148 + .../renderers/zelos/measurables/inputs.js | 47 + .../zelos/measurables/row_elements.js | 37 + .../core/renderers/zelos/measurables/rows.js | 108 + .../dist/core/renderers/zelos/path_object.js | 244 + .../js/dist/core/renderers/zelos/renderer.js | 131 + static/js/dist/core/requires.js | 84 + static/js/dist/core/scrollbar.js | 880 + static/js/dist/core/shortcut_items.js | 263 + static/js/dist/core/shortcut_registry.js | 357 + static/js/dist/core/theme.js | 236 + static/js/dist/core/theme/classic.js | 87 + static/js/dist/core/theme/dark.js | 33 + static/js/dist/core/theme/deuteranopia.js | 104 + static/js/dist/core/theme/highcontrast.js | 119 + static/js/dist/core/theme/modern.js | 108 + static/js/dist/core/theme/tritanopia.js | 103 + static/js/dist/core/theme/zelos.js | 106 + static/js/dist/core/theme_manager.js | 197 + static/js/dist/core/toolbox/category.js | 708 + .../dist/core/toolbox/collapsible_category.js | 298 + static/js/dist/core/toolbox/separator.js | 123 + static/js/dist/core/toolbox/toolbox.js | 991 + static/js/dist/core/toolbox/toolbox_item.js | 145 + static/js/dist/core/tooltip.js | 387 + static/js/dist/core/touch.js | 256 + static/js/dist/core/touch_gesture.js | 325 + static/js/dist/core/trashcan.js | 678 + static/js/dist/core/utils.js | 652 + static/js/dist/core/utils/aria.js | 167 + static/js/dist/core/utils/colour.js | 208 + static/js/dist/core/utils/coordinate.js | 125 + static/js/dist/core/utils/deprecation.js | 34 + static/js/dist/core/utils/dom.js | 391 + static/js/dist/core/utils/global.js | 37 + static/js/dist/core/utils/idgenerator.js | 33 + static/js/dist/core/utils/keycodes.js | 164 + static/js/dist/core/utils/math.js | 56 + static/js/dist/core/utils/metrics.js | 124 + static/js/dist/core/utils/object.js | 73 + static/js/dist/core/utils/rect.js | 54 + static/js/dist/core/utils/size.js | 58 + static/js/dist/core/utils/string.js | 284 + static/js/dist/core/utils/style.js | 281 + static/js/dist/core/utils/svg.js | 181 + static/js/dist/core/utils/svg_paths.js | 142 + static/js/dist/core/utils/toolbox.js | 404 + static/js/dist/core/utils/useragent.js | 110 + static/js/dist/core/utils/xml.js | 79 + static/js/dist/core/variable_map.js | 414 + static/js/dist/core/variable_model.js | 95 + static/js/dist/core/variables.js | 572 + static/js/dist/core/variables_dynamic.js | 100 + static/js/dist/core/warning.js | 156 + static/js/dist/core/widgetdiv.js | 241 + static/js/dist/core/workspace.js | 786 + static/js/dist/core/workspace_audio.js | 154 + static/js/dist/core/workspace_comment.js | 373 + .../dist/core/workspace_comment_render_svg.js | 461 + static/js/dist/core/workspace_comment_svg.js | 706 + .../dist/core/workspace_drag_surface_svg.js | 176 + static/js/dist/core/workspace_dragger.js | 85 + static/js/dist/core/workspace_svg.js | 2665 ++ static/js/dist/core/xml.js | 828 + static/js/dist/core/zoom_controls.js | 447 + static/js/dist/dart.d.ts | 15 + static/js/dist/dart.js | 27 + static/js/dist/dart_compressed.js | 114 + static/js/dist/dart_compressed.js.map | 1 + static/js/dist/generators/dart.js | 296 + static/js/dist/generators/dart/colour.js | 114 + static/js/dist/generators/dart/lists.js | 447 + static/js/dist/generators/dart/logic.js | 127 + static/js/dist/generators/dart/loops.js | 169 + static/js/dist/generators/dart/math.js | 485 + static/js/dist/generators/dart/procedures.js | 111 + static/js/dist/generators/dart/text.js | 343 + static/js/dist/generators/dart/variables.js | 32 + .../dist/generators/dart/variables_dynamic.js | 21 + static/js/dist/generators/javascript.js | 324 + .../js/dist/generators/javascript/colour.js | 89 + static/js/dist/generators/javascript/lists.js | 388 + static/js/dist/generators/javascript/logic.js | 129 + static/js/dist/generators/javascript/loops.js | 184 + static/js/dist/generators/javascript/math.js | 409 + .../dist/generators/javascript/procedures.js | 113 + static/js/dist/generators/javascript/text.js | 372 + .../dist/generators/javascript/variables.js | 32 + .../javascript/variables_dynamic.js | 23 + static/js/dist/generators/lua.js | 205 + static/js/dist/generators/lua/colour.js | 76 + static/js/dist/generators/lua/lists.js | 368 + static/js/dist/generators/lua/logic.js | 127 + static/js/dist/generators/lua/loops.js | 173 + static/js/dist/generators/lua/math.js | 423 + static/js/dist/generators/lua/procedures.js | 113 + static/js/dist/generators/lua/text.js | 355 + static/js/dist/generators/lua/variables.js | 32 + .../dist/generators/lua/variables_dynamic.js | 21 + static/js/dist/generators/php.js | 324 + static/js/dist/generators/php/colour.js | 91 + static/js/dist/generators/php/lists.js | 498 + static/js/dist/generators/php/logic.js | 128 + static/js/dist/generators/php/loops.js | 170 + static/js/dist/generators/php/math.js | 370 + static/js/dist/generators/php/procedures.js | 132 + static/js/dist/generators/php/text.js | 274 + static/js/dist/generators/php/variables.js | 32 + .../dist/generators/php/variables_dynamic.js | 21 + static/js/dist/generators/python.js | 329 + static/js/dist/generators/python/colour.js | 72 + static/js/dist/generators/python/lists.js | 349 + static/js/dist/generators/python/logic.js | 127 + static/js/dist/generators/python/loops.js | 214 + static/js/dist/generators/python/math.js | 385 + .../js/dist/generators/python/procedures.js | 134 + static/js/dist/generators/python/text.js | 297 + static/js/dist/generators/python/variables.js | 32 + .../generators/python/variables_dynamic.js | 21 + static/js/dist/index.d.ts | 22 + static/js/dist/index.js | 24 + static/js/dist/javascript.d.ts | 15 + static/js/dist/javascript.js | 27 + static/js/dist/javascript_compressed.js | 115 + static/js/dist/javascript_compressed.js.map | 1 + static/js/dist/lua.d.ts | 15 + static/js/dist/lua.js | 27 + static/js/dist/lua_compressed.js | 94 + static/js/dist/lua_compressed.js.map | 1 + static/js/dist/media/1x1.gif | Bin 0 -> 43 bytes static/js/dist/media/click.mp3 | Bin 0 -> 2304 bytes static/js/dist/media/click.ogg | Bin 0 -> 4865 bytes static/js/dist/media/click.wav | Bin 0 -> 3782 bytes static/js/dist/media/delete.mp3 | Bin 0 -> 3123 bytes static/js/dist/media/delete.ogg | Bin 0 -> 5731 bytes static/js/dist/media/delete.wav | Bin 0 -> 9164 bytes static/js/dist/media/disconnect.mp3 | Bin 0 -> 1586 bytes static/js/dist/media/disconnect.ogg | Bin 0 -> 4404 bytes static/js/dist/media/disconnect.wav | Bin 0 -> 1492 bytes static/js/dist/media/dropdown-arrow.svg | 1 + static/js/dist/media/handclosed.cur | Bin 0 -> 326 bytes static/js/dist/media/handdelete.cur | Bin 0 -> 766 bytes static/js/dist/media/handopen.cur | Bin 0 -> 198 bytes static/js/dist/media/pilcrow.png | Bin 0 -> 1010 bytes static/js/dist/media/quote0.png | Bin 0 -> 771 bytes static/js/dist/media/quote1.png | Bin 0 -> 738 bytes static/js/dist/media/sprites.png | Bin 0 -> 2595 bytes static/js/dist/media/sprites.svg | 74 + static/js/dist/msg/ab.d.ts | 16 + static/js/dist/msg/ab.js | 447 + static/js/dist/msg/ar.d.ts | 16 + static/js/dist/msg/ar.js | 447 + static/js/dist/msg/az.d.ts | 16 + static/js/dist/msg/az.js | 447 + static/js/dist/msg/ba.d.ts | 16 + static/js/dist/msg/ba.js | 447 + static/js/dist/msg/bcc.d.ts | 16 + static/js/dist/msg/bcc.js | 447 + static/js/dist/msg/be-tarask.d.ts | 16 + static/js/dist/msg/be-tarask.js | 447 + static/js/dist/msg/be.d.ts | 16 + static/js/dist/msg/be.js | 447 + static/js/dist/msg/bg.d.ts | 16 + static/js/dist/msg/bg.js | 447 + static/js/dist/msg/bn.d.ts | 16 + static/js/dist/msg/bn.js | 447 + static/js/dist/msg/br.d.ts | 16 + static/js/dist/msg/br.js | 447 + static/js/dist/msg/ca.d.ts | 16 + static/js/dist/msg/ca.js | 447 + static/js/dist/msg/constants.d.ts | 16 + static/js/dist/msg/cs.d.ts | 16 + static/js/dist/msg/cs.js | 447 + static/js/dist/msg/da.d.ts | 16 + static/js/dist/msg/da.js | 447 + static/js/dist/msg/de.d.ts | 16 + static/js/dist/msg/de.js | 447 + static/js/dist/msg/diq.d.ts | 16 + static/js/dist/msg/diq.js | 447 + static/js/dist/msg/dty.d.ts | 16 + static/js/dist/msg/dty.js | 447 + static/js/dist/msg/ee.d.ts | 16 + static/js/dist/msg/ee.js | 447 + static/js/dist/msg/el.d.ts | 16 + static/js/dist/msg/el.js | 447 + static/js/dist/msg/en-gb.d.ts | 16 + static/js/dist/msg/en-gb.js | 447 + static/js/dist/msg/en.d.ts | 16 + static/js/dist/msg/en.js | 447 + static/js/dist/msg/eo.d.ts | 16 + static/js/dist/msg/eo.js | 447 + static/js/dist/msg/es.d.ts | 16 + static/js/dist/msg/es.js | 447 + static/js/dist/msg/et.d.ts | 16 + static/js/dist/msg/et.js | 447 + static/js/dist/msg/eu.d.ts | 16 + static/js/dist/msg/eu.js | 447 + static/js/dist/msg/fa.d.ts | 16 + static/js/dist/msg/fa.js | 447 + static/js/dist/msg/fi.d.ts | 16 + static/js/dist/msg/fi.js | 447 + static/js/dist/msg/fr.d.ts | 16 + static/js/dist/msg/fr.js | 447 + static/js/dist/msg/gl.d.ts | 16 + static/js/dist/msg/gl.js | 447 + static/js/dist/msg/gor.d.ts | 16 + static/js/dist/msg/gor.js | 447 + static/js/dist/msg/ha.d.ts | 16 + static/js/dist/msg/ha.js | 447 + static/js/dist/msg/he.d.ts | 16 + static/js/dist/msg/he.js | 447 + static/js/dist/msg/hi.d.ts | 16 + static/js/dist/msg/hi.js | 447 + static/js/dist/msg/hrx.d.ts | 16 + static/js/dist/msg/hrx.js | 447 + static/js/dist/msg/hu.d.ts | 16 + static/js/dist/msg/hu.js | 447 + static/js/dist/msg/hy.d.ts | 16 + static/js/dist/msg/hy.js | 447 + static/js/dist/msg/ia.d.ts | 16 + static/js/dist/msg/ia.js | 447 + static/js/dist/msg/id.d.ts | 16 + static/js/dist/msg/id.js | 447 + static/js/dist/msg/ig.d.ts | 16 + static/js/dist/msg/ig.js | 447 + static/js/dist/msg/is.d.ts | 16 + static/js/dist/msg/is.js | 447 + static/js/dist/msg/it.d.ts | 16 + static/js/dist/msg/it.js | 447 + static/js/dist/msg/ja.d.ts | 16 + static/js/dist/msg/ja.js | 447 + static/js/dist/msg/kab.d.ts | 16 + static/js/dist/msg/kab.js | 447 + static/js/dist/msg/kn.d.ts | 16 + static/js/dist/msg/kn.js | 447 + static/js/dist/msg/ko.d.ts | 16 + static/js/dist/msg/ko.js | 447 + static/js/dist/msg/lb.d.ts | 16 + static/js/dist/msg/lb.js | 447 + static/js/dist/msg/lki.d.ts | 16 + static/js/dist/msg/lki.js | 447 + static/js/dist/msg/lo.d.ts | 16 + static/js/dist/msg/lo.js | 447 + static/js/dist/msg/lrc.d.ts | 16 + static/js/dist/msg/lrc.js | 447 + static/js/dist/msg/lt.d.ts | 16 + static/js/dist/msg/lt.js | 447 + static/js/dist/msg/lv.d.ts | 16 + static/js/dist/msg/lv.js | 447 + static/js/dist/msg/mk.d.ts | 16 + static/js/dist/msg/mk.js | 447 + static/js/dist/msg/mnw.d.ts | 16 + static/js/dist/msg/mnw.js | 447 + static/js/dist/msg/ms.d.ts | 16 + static/js/dist/msg/ms.js | 447 + static/js/dist/msg/msg.d.ts | 444 + static/js/dist/msg/nb.d.ts | 16 + static/js/dist/msg/nb.js | 447 + static/js/dist/msg/nl.d.ts | 16 + static/js/dist/msg/nl.js | 447 + static/js/dist/msg/oc.d.ts | 16 + static/js/dist/msg/oc.js | 447 + static/js/dist/msg/pl.d.ts | 16 + static/js/dist/msg/pl.js | 447 + static/js/dist/msg/pms.d.ts | 16 + static/js/dist/msg/pms.js | 447 + static/js/dist/msg/pt-br.d.ts | 16 + static/js/dist/msg/pt-br.js | 447 + static/js/dist/msg/pt.d.ts | 16 + static/js/dist/msg/pt.js | 447 + static/js/dist/msg/qqq.d.ts | 16 + static/js/dist/msg/ro.d.ts | 16 + static/js/dist/msg/ro.js | 448 + static/js/dist/msg/ru.d.ts | 16 + static/js/dist/msg/ru.js | 447 + static/js/dist/msg/sc.d.ts | 16 + static/js/dist/msg/sc.js | 447 + static/js/dist/msg/sd.d.ts | 16 + static/js/dist/msg/sd.js | 447 + static/js/dist/msg/shn.d.ts | 16 + static/js/dist/msg/shn.js | 447 + static/js/dist/msg/sk.d.ts | 16 + static/js/dist/msg/sk.js | 447 + static/js/dist/msg/skr-arab.d.ts | 16 + static/js/dist/msg/skr-arab.js | 447 + static/js/dist/msg/sl.d.ts | 16 + static/js/dist/msg/sl.js | 447 + static/js/dist/msg/sq.d.ts | 16 + static/js/dist/msg/sq.js | 447 + static/js/dist/msg/sr-latn.d.ts | 16 + static/js/dist/msg/sr-latn.js | 447 + static/js/dist/msg/sr.d.ts | 16 + static/js/dist/msg/sr.js | 447 + static/js/dist/msg/sv.d.ts | 16 + static/js/dist/msg/sv.js | 447 + static/js/dist/msg/synonyms.d.ts | 16 + static/js/dist/msg/ta.d.ts | 16 + static/js/dist/msg/ta.js | 447 + static/js/dist/msg/tcy.d.ts | 16 + static/js/dist/msg/tcy.js | 447 + static/js/dist/msg/te.d.ts | 16 + static/js/dist/msg/te.js | 447 + static/js/dist/msg/th.d.ts | 16 + static/js/dist/msg/th.js | 447 + static/js/dist/msg/tl.d.ts | 16 + static/js/dist/msg/tl.js | 447 + static/js/dist/msg/tlh.d.ts | 16 + static/js/dist/msg/tlh.js | 447 + static/js/dist/msg/tr.d.ts | 16 + static/js/dist/msg/tr.js | 447 + static/js/dist/msg/ug-arab.d.ts | 16 + static/js/dist/msg/ug-arab.js | 447 + static/js/dist/msg/uk.d.ts | 16 + static/js/dist/msg/uk.js | 447 + static/js/dist/msg/ur.d.ts | 16 + static/js/dist/msg/ur.js | 447 + static/js/dist/msg/vi.d.ts | 16 + static/js/dist/msg/vi.js | 447 + static/js/dist/msg/xmf.d.ts | 16 + static/js/dist/msg/xmf.js | 447 + static/js/dist/msg/yo.d.ts | 16 + static/js/dist/msg/yo.js | 447 + static/js/dist/msg/zgh.d.ts | 16 + static/js/dist/msg/zh-hans.d.ts | 16 + static/js/dist/msg/zh-hans.js | 447 + static/js/dist/msg/zh-hant.d.ts | 16 + static/js/dist/msg/zh-hant.js | 447 + static/js/dist/node.js | 35 + static/js/dist/package.json | 63 + static/js/dist/php.d.ts | 15 + static/js/dist/php.js | 27 + static/js/dist/php_compressed.js | 103 + static/js/dist/php_compressed.js.map | 1 + static/js/dist/python.d.ts | 15 + static/js/dist/python.js | 27 + static/js/dist/python_compressed.js | 101 + static/js/dist/python_compressed.js.map | 1 + static/js/externs/block-externs.js | 27 + static/js/externs/generator-externs.js | 17 + static/js/externs/goog-externs.js | 15 + static/js/externs/svg-externs.js | 10232 +++++++ static/js/generators/dart.js | 296 + static/js/generators/dart/colour.js | 114 + static/js/generators/dart/lists.js | 447 + static/js/generators/dart/logic.js | 127 + static/js/generators/dart/loops.js | 169 + static/js/generators/dart/math.js | 485 + static/js/generators/dart/procedures.js | 111 + static/js/generators/dart/text.js | 343 + static/js/generators/dart/variables.js | 32 + .../js/generators/dart/variables_dynamic.js | 21 + static/js/generators/javascript.js | 324 + static/js/generators/javascript/colour.js | 89 + static/js/generators/javascript/lists.js | 388 + static/js/generators/javascript/logic.js | 129 + static/js/generators/javascript/loops.js | 184 + static/js/generators/javascript/math.js | 409 + static/js/generators/javascript/procedures.js | 113 + static/js/generators/javascript/text.js | 372 + static/js/generators/javascript/variables.js | 32 + .../javascript/variables_dynamic.js | 23 + static/js/generators/lua.js | 205 + static/js/generators/lua/colour.js | 76 + static/js/generators/lua/lists.js | 368 + static/js/generators/lua/logic.js | 127 + static/js/generators/lua/loops.js | 173 + static/js/generators/lua/math.js | 423 + static/js/generators/lua/procedures.js | 113 + static/js/generators/lua/text.js | 355 + static/js/generators/lua/variables.js | 32 + static/js/generators/lua/variables_dynamic.js | 21 + static/js/generators/php.js | 324 + static/js/generators/php/colour.js | 91 + static/js/generators/php/lists.js | 498 + static/js/generators/php/logic.js | 128 + static/js/generators/php/loops.js | 170 + static/js/generators/php/math.js | 370 + static/js/generators/php/procedures.js | 132 + static/js/generators/php/text.js | 274 + static/js/generators/php/variables.js | 32 + static/js/generators/php/variables_dynamic.js | 21 + static/js/generators/python.js | 329 + static/js/generators/python/colour.js | 72 + static/js/generators/python/lists.js | 349 + static/js/generators/python/logic.js | 127 + static/js/generators/python/loops.js | 214 + static/js/generators/python/math.js | 385 + static/js/generators/python/procedures.js | 134 + static/js/generators/python/text.js | 297 + static/js/generators/python/variables.js | 32 + .../js/generators/python/variables_dynamic.js | 21 + static/js/gulpfile.js | 39 + static/js/javascript_compressed.js | 115 + static/js/media/1x1.gif | Bin 0 -> 43 bytes static/js/media/click.mp3 | Bin 0 -> 2304 bytes static/js/media/click.ogg | Bin 0 -> 4865 bytes static/js/media/click.wav | Bin 0 -> 3782 bytes static/js/media/delete.mp3 | Bin 0 -> 3123 bytes static/js/media/delete.ogg | Bin 0 -> 5731 bytes static/js/media/delete.wav | Bin 0 -> 9164 bytes static/js/media/disconnect.mp3 | Bin 0 -> 1586 bytes static/js/media/disconnect.ogg | Bin 0 -> 4404 bytes static/js/media/disconnect.wav | Bin 0 -> 1492 bytes static/js/media/dropdown-arrow.svg | 1 + static/js/media/handclosed.cur | Bin 0 -> 326 bytes static/js/media/handdelete.cur | Bin 0 -> 766 bytes static/js/media/handopen.cur | Bin 0 -> 198 bytes static/js/media/pilcrow.png | Bin 0 -> 1010 bytes static/js/media/quote0.png | Bin 0 -> 771 bytes static/js/media/quote1.png | Bin 0 -> 738 bytes static/js/media/sprites.png | Bin 0 -> 2595 bytes static/js/media/sprites.svg | 74 + static/js/msg/js/ab.js | 434 + static/js/msg/js/ar.js | 434 + static/js/msg/js/az.js | 434 + static/js/msg/js/ba.js | 434 + static/js/msg/js/bcc.js | 434 + static/js/msg/js/be-tarask.js | 434 + static/js/msg/js/be.js | 434 + static/js/msg/js/bg.js | 434 + static/js/msg/js/bn.js | 434 + static/js/msg/js/br.js | 434 + static/js/msg/js/ca.js | 434 + static/js/msg/js/cs.js | 434 + static/js/msg/js/da.js | 434 + static/js/msg/js/de.js | 434 + static/js/msg/js/diq.js | 434 + static/js/msg/js/dty.js | 434 + static/js/msg/js/ee.js | 434 + static/js/msg/js/el.js | 434 + static/js/msg/js/en-gb.js | 434 + static/js/msg/js/en.js | 434 + static/js/msg/js/eo.js | 434 + static/js/msg/js/es.js | 434 + static/js/msg/js/et.js | 434 + static/js/msg/js/eu.js | 434 + static/js/msg/js/fa.js | 434 + static/js/msg/js/fi.js | 434 + static/js/msg/js/fr.js | 434 + static/js/msg/js/gl.js | 434 + static/js/msg/js/gor.js | 434 + static/js/msg/js/ha.js | 434 + static/js/msg/js/he.js | 434 + static/js/msg/js/hi.js | 434 + static/js/msg/js/hrx.js | 434 + static/js/msg/js/hu.js | 434 + static/js/msg/js/hy.js | 434 + static/js/msg/js/ia.js | 434 + static/js/msg/js/id.js | 434 + static/js/msg/js/ig.js | 434 + static/js/msg/js/is.js | 434 + static/js/msg/js/it.js | 434 + static/js/msg/js/ja.js | 434 + static/js/msg/js/kab.js | 434 + static/js/msg/js/kn.js | 434 + static/js/msg/js/ko.js | 434 + static/js/msg/js/lb.js | 434 + static/js/msg/js/lki.js | 434 + static/js/msg/js/lo.js | 434 + static/js/msg/js/lrc.js | 434 + static/js/msg/js/lt.js | 434 + static/js/msg/js/lv.js | 434 + static/js/msg/js/mk.js | 434 + static/js/msg/js/mnw.js | 434 + static/js/msg/js/ms.js | 434 + static/js/msg/js/nb.js | 434 + static/js/msg/js/nl.js | 434 + static/js/msg/js/oc.js | 434 + static/js/msg/js/pl.js | 434 + static/js/msg/js/pms.js | 434 + static/js/msg/js/pt-br.js | 434 + static/js/msg/js/pt.js | 434 + static/js/msg/js/ro.js | 434 + static/js/msg/js/ru.js | 434 + static/js/msg/js/sc.js | 434 + static/js/msg/js/sd.js | 434 + static/js/msg/js/shn.js | 434 + static/js/msg/js/sk.js | 434 + static/js/msg/js/skr-arab.js | 434 + static/js/msg/js/sl.js | 434 + static/js/msg/js/sq.js | 434 + static/js/msg/js/sr-latn.js | 434 + static/js/msg/js/sr.js | 434 + static/js/msg/js/sv.js | 434 + static/js/msg/js/ta.js | 434 + static/js/msg/js/tcy.js | 434 + static/js/msg/js/te.js | 434 + static/js/msg/js/th.js | 434 + static/js/msg/js/tl.js | 434 + static/js/msg/js/tlh.js | 434 + static/js/msg/js/tr.js | 434 + static/js/msg/js/ug-arab.js | 434 + static/js/msg/js/uk.js | 434 + static/js/msg/js/ur.js | 434 + static/js/msg/js/vi.js | 434 + static/js/msg/js/xmf.js | 434 + static/js/msg/js/yo.js | 434 + static/js/msg/js/zh-hans.js | 434 + static/js/msg/js/zh-hant.js | 434 + static/js/msg/json/ab.json | 231 + static/js/msg/json/ar.json | 374 + static/js/msg/json/az.json | 358 + static/js/msg/json/ba.json | 208 + static/js/msg/json/bcc.json | 288 + static/js/msg/json/be-tarask.json | 353 + static/js/msg/json/be.json | 333 + static/js/msg/json/bg.json | 357 + static/js/msg/json/bn.json | 195 + static/js/msg/json/br.json | 355 + static/js/msg/json/ca.json | 353 + static/js/msg/json/constants.json | 1 + static/js/msg/json/cs.json | 345 + static/js/msg/json/da.json | 351 + static/js/msg/json/de.json | 391 + static/js/msg/json/diq.json | 270 + static/js/msg/json/dty.json | 107 + static/js/msg/json/ee.json | 172 + static/js/msg/json/el.json | 405 + static/js/msg/json/en-gb.json | 225 + static/js/msg/json/en.json | 408 + static/js/msg/json/eo.json | 350 + static/js/msg/json/es.json | 365 + static/js/msg/json/et.json | 348 + static/js/msg/json/eu.json | 232 + static/js/msg/json/fa.json | 350 + static/js/msg/json/fi.json | 372 + static/js/msg/json/fr.json | 372 + static/js/msg/json/gl.json | 157 + static/js/msg/json/gor.json | 94 + static/js/msg/json/ha.json | 342 + static/js/msg/json/he.json | 368 + static/js/msg/json/hi.json | 345 + static/js/msg/json/hrx.json | 287 + static/js/msg/json/hu.json | 363 + static/js/msg/json/hy.json | 337 + static/js/msg/json/ia.json | 337 + static/js/msg/json/id.json | 358 + static/js/msg/json/ig.json | 343 + static/js/msg/json/is.json | 374 + static/js/msg/json/it.json | 360 + static/js/msg/json/ja.json | 386 + static/js/msg/json/kab.json | 350 + static/js/msg/json/kn.json | 352 + static/js/msg/json/ko.json | 422 + static/js/msg/json/lb.json | 145 + static/js/msg/json/lki.json | 294 + static/js/msg/json/lo.json | 93 + static/js/msg/json/lrc.json | 136 + static/js/msg/json/lt.json | 323 + static/js/msg/json/lv.json | 321 + static/js/msg/json/mk.json | 188 + static/js/msg/json/mnw.json | 105 + static/js/msg/json/ms.json | 311 + static/js/msg/json/nb.json | 373 + static/js/msg/json/nl.json | 405 + static/js/msg/json/oc.json | 210 + static/js/msg/json/pl.json | 391 + static/js/msg/json/pms.json | 352 + static/js/msg/json/pt-br.json | 390 + static/js/msg/json/pt.json | 384 + static/js/msg/json/qqq.json | 402 + static/js/msg/json/ro.json | 368 + static/js/msg/json/ru.json | 368 + static/js/msg/json/sc.json | 297 + static/js/msg/json/sd.json | 158 + static/js/msg/json/shn.json | 109 + static/js/msg/json/sk.json | 357 + static/js/msg/json/skr-arab.json | 112 + static/js/msg/json/sl.json | 401 + static/js/msg/json/sq.json | 359 + static/js/msg/json/sr-latn.json | 357 + static/js/msg/json/sr.json | 384 + static/js/msg/json/sv.json | 378 + static/js/msg/json/synonyms.json | 1 + static/js/msg/json/ta.json | 314 + static/js/msg/json/tcy.json | 328 + static/js/msg/json/te.json | 98 + static/js/msg/json/th.json | 352 + static/js/msg/json/tl.json | 130 + static/js/msg/json/tlh.json | 180 + static/js/msg/json/tr.json | 394 + static/js/msg/json/ug-arab.json | 143 + static/js/msg/json/uk.json | 372 + static/js/msg/json/ur.json | 119 + static/js/msg/json/vi.json | 357 + static/js/msg/json/xmf.json | 94 + static/js/msg/json/yo.json | 342 + static/js/msg/json/zgh.json | 102 + static/js/msg/json/zh-hans.json | 382 + static/js/msg/json/zh-hant.json | 363 + static/js/msg/messages.js | 1630 ++ static/js/navigation.js | 349 + static/js/package-lock.json | 2078 ++ static/js/package.json | 9 + static/js/python_ML.js | 2101 ++ static/js/python_compressed.js | 101 + static/js/screenshot.js | 108 + static/js/scripts/gulpfiles/build_tasks.js | 525 + static/js/scripts/gulpfiles/git_tasks.js | 129 + static/js/scripts/gulpfiles/license_tasks.js | 21 + static/js/scripts/gulpfiles/package_tasks.js | 397 + static/js/scripts/gulpfiles/typings.js | 104 + static/js/scripts/package/README.md | 77 + static/js/scripts/package/blockly.js | 12 + static/js/scripts/package/blocks.js | 14 + static/js/scripts/package/browser/core.js | 21 + static/js/scripts/package/browser/index.js | 24 + static/js/scripts/package/dart.js | 14 + static/js/scripts/package/index.js | 12 + static/js/scripts/package/javascript.js | 14 + static/js/scripts/package/lua.js | 14 + static/js/scripts/package/node/core.js | 33 + static/js/scripts/package/node/index.js | 31 + static/js/scripts/package/php.js | 14 + static/js/scripts/package/python.js | 14 + .../scripts/package/templates/node.template | 5 + .../js/scripts/package/templates/umd.template | 13 + static/js/tests/compile/compile.sh | 114 + static/js/tests/compile/index.html | 44 + static/js/tests/compile/main.js | 30 + static/js/tests/media/200px.png | Bin 0 -> 1709 bytes static/js/tests/media/30px.png | Bin 0 -> 683 bytes static/js/tests/media/50px.png | Bin 0 -> 949 bytes static/js/tests/media/a.png | Bin 0 -> 580 bytes static/js/tests/media/arrow.png | Bin 0 -> 363 bytes static/js/tests/media/b.png | Bin 0 -> 563 bytes static/js/tests/media/c.png | Bin 0 -> 606 bytes static/js/tests/media/d.png | Bin 0 -> 564 bytes static/js/tests/media/e.png | Bin 0 -> 393 bytes static/js/tests/media/f.png | Bin 0 -> 343 bytes static/js/tests/media/g.png | Bin 0 -> 676 bytes static/js/tests/media/h.png | Bin 0 -> 313 bytes static/js/tests/media/i.png | Bin 0 -> 200 bytes static/js/tests/media/j.png | Bin 0 -> 453 bytes static/js/tests/media/k.png | Bin 0 -> 513 bytes static/js/tests/media/l.png | Bin 0 -> 254 bytes static/js/tests/media/m.png | Bin 0 -> 663 bytes static/js/tests/mocha/.eslintrc.json | 77 + static/js/tests/mocha/.mocharc.js | 7 + static/js/tests/mocha/astnode_test.js | 802 + static/js/tests/mocha/block_test.js | 1786 ++ static/js/tests/mocha/comment_test.js | 138 + .../js/tests/mocha/connection_checker_test.js | 270 + static/js/tests/mocha/connection_db_test.js | 266 + static/js/tests/mocha/connection_test.js | 787 + .../js/tests/mocha/contextmenu_items_test.js | 407 + static/js/tests/mocha/cursor_test.js | 120 + static/js/tests/mocha/dropdowndiv_test.js | 75 + static/js/tests/mocha/event_test.js | 1196 + static/js/tests/mocha/extensions_test.js | 488 + static/js/tests/mocha/field_angle_test.js | 313 + static/js/tests/mocha/field_checkbox_test.js | 207 + static/js/tests/mocha/field_colour_test.js | 280 + static/js/tests/mocha/field_dropdown_test.js | 155 + static/js/tests/mocha/field_image_test.js | 194 + .../mocha/field_label_serializable_test.js | 184 + static/js/tests/mocha/field_label_test.js | 185 + .../tests/mocha/field_multilineinput_test.js | 156 + static/js/tests/mocha/field_number_test.js | 335 + static/js/tests/mocha/field_registry_test.js | 104 + static/js/tests/mocha/field_test.js | 513 + static/js/tests/mocha/field_textinput_test.js | 218 + static/js/tests/mocha/field_variable_test.js | 380 + static/js/tests/mocha/flyout_test.js | 274 + static/js/tests/mocha/generator_test.js | 150 + static/js/tests/mocha/gesture_test.js | 103 + static/js/tests/mocha/index.html | 181 + static/js/tests/mocha/input_test.js | 291 + .../js/tests/mocha/insertion_marker_test.js | 380 + static/js/tests/mocha/json_test.js | 281 + static/js/tests/mocha/keydown_test.js | 277 + static/js/tests/mocha/logic_ternary_test.js | 246 + static/js/tests/mocha/metrics_test.js | 113 + static/js/tests/mocha/names_test.js | 62 + .../js/tests/mocha/navigation_modify_test.js | 420 + static/js/tests/mocha/navigation_test.js | 803 + static/js/tests/mocha/procedures_test.js | 1159 + .../js/tests/mocha/procedures_test_helpers.js | 135 + static/js/tests/mocha/registry_test.js | 96 + .../tests/mocha/run_mocha_tests_in_browser.js | 76 + .../js/tests/mocha/shortcut_registry_test.js | 355 + static/js/tests/mocha/test_helpers.js | 625 + static/js/tests/mocha/theme_test.js | 275 + static/js/tests/mocha/toolbox_helper.js | 185 + static/js/tests/mocha/toolbox_test.js | 642 + static/js/tests/mocha/tooltip_test.js | 230 + static/js/tests/mocha/trashcan_test.js | 328 + static/js/tests/mocha/utils_test.js | 352 + static/js/tests/mocha/variable_map_test.js | 250 + static/js/tests/mocha/variable_model_test.js | 59 + static/js/tests/mocha/variables_test.js | 137 + static/js/tests/mocha/widget_div_test.js | 167 + .../js/tests/mocha/workspace_comment_test.js | 198 + static/js/tests/mocha/workspace_svg_test.js | 345 + static/js/tests/mocha/workspace_test.js | 1542 ++ static/js/tests/mocha/xml_test.js | 816 + static/js/tests/mocha/zoom_controls_test.js | 58 + static/js/tests/msg/ar.js | 24 + static/js/tests/msg/be-tarask.js | 24 + static/js/tests/msg/br.js | 24 + static/js/tests/msg/ca.js | 24 + static/js/tests/msg/cs.js | 24 + static/js/tests/msg/da.js | 24 + static/js/tests/msg/de.js | 24 + static/js/tests/msg/el.js | 24 + static/js/tests/msg/en.js | 24 + static/js/tests/msg/es.js | 24 + static/js/tests/msg/et.js | 24 + static/js/tests/msg/fa.js | 24 + static/js/tests/msg/fr.js | 24 + static/js/tests/msg/he.js | 24 + static/js/tests/msg/hrx.js | 24 + static/js/tests/msg/hu.js | 24 + static/js/tests/msg/ia.js | 24 + static/js/tests/msg/is.js | 24 + static/js/tests/msg/it.js | 24 + static/js/tests/msg/ja.js | 24 + static/js/tests/msg/kab.js | 24 + static/js/tests/msg/ko.js | 24 + static/js/tests/msg/mk.js | 24 + static/js/tests/msg/ms.js | 24 + static/js/tests/msg/nb.js | 24 + static/js/tests/msg/nl.js | 24 + static/js/tests/msg/oc.js | 24 + static/js/tests/msg/pl.js | 24 + static/js/tests/msg/pms.js | 24 + static/js/tests/msg/pt-br.js | 24 + static/js/tests/msg/ro.js | 24 + static/js/tests/msg/ru.js | 24 + static/js/tests/msg/sc.js | 24 + static/js/tests/msg/sk.js | 24 + static/js/tests/msg/sr.js | 24 + static/js/tests/msg/sv.js | 24 + static/js/tests/msg/ta.js | 24 + static/js/tests/msg/th.js | 24 + static/js/tests/msg/tlh.js | 24 + static/js/tests/msg/tr.js | 24 + static/js/tests/msg/uk.js | 24 + static/js/tests/msg/vi.js | 24 + static/js/tests/msg/zh-hans.js | 24 + static/js/tests/msg/zh-hant.js | 24 + static/js/tests/multi_playground.html | 477 + static/js/tests/node/.eslintrc.json | 14 + static/js/tests/node/.mocharc.js | 6 + static/js/tests/node/run_node_test.js | 57 + static/js/tests/playground.html | 1172 + .../playgrounds/advanced_playground.html | 225 + static/js/tests/playgrounds/iframe.html | 39 + static/js/tests/playgrounds/screenshot.js | 108 + static/js/tests/rendering/svg_paths.html | 98 + static/js/tests/rendering/zelos/README.md | 19 + static/js/tests/rendering/zelos/index.html | 247 + .../js/tests/rendering/zelos/pxtblockly.html | 66 + .../rendering/zelos/pxtblockly/index.html | 166 + .../zelos/pxtblockly/pxtblockly.html | 68 + .../rendering/zelos/pxtblockly/zelos.html | 79 + .../rendering/zelos/scratchblocks/index.html | 166 + .../zelos/scratchblocks/scratchblocks.html | 70 + .../rendering/zelos/scratchblocks/zelos.html | 105 + static/js/tests/rendering/zelos/zelos.html | 79 + static/js/tests/run_all_tests.sh | 88 + static/js/tests/scripts/check_metadata.sh | 85 + static/js/tests/scripts/compile_typings.sh | 29 + static/js/tests/scripts/run_generators.sh | 57 + static/js/tests/scripts/selenium-config.js | 27 + static/js/tests/scripts/setup_linux_env.sh | 8 + static/js/tests/scripts/setup_osx_env.sh | 9 + static/js/tests/themes/test_themes.js | 64 + static/js/tests/xml/README.txt | 11 + static/js/tests/xml/blockly.xsd | 178 + static/js/tests/xml/invalid.xml | 6 + static/js/tests/xml/toolbox.xml | 313 + static/js/typings/README.md | 13 + static/js/typings/blockly.d.ts | 21951 ++++++++++++++++ static/js/typings/blocks.d.ts | 15 + static/js/typings/core.d.ts | 15 + static/js/typings/dart.d.ts | 15 + static/js/typings/index.d.ts | 22 + static/js/typings/javascript.d.ts | 15 + static/js/typings/lua.d.ts | 15 + static/js/typings/msg/ab.d.ts | 16 + static/js/typings/msg/ar.d.ts | 16 + static/js/typings/msg/az.d.ts | 16 + static/js/typings/msg/ba.d.ts | 16 + static/js/typings/msg/bcc.d.ts | 16 + static/js/typings/msg/be-tarask.d.ts | 16 + static/js/typings/msg/be.d.ts | 16 + static/js/typings/msg/bg.d.ts | 16 + static/js/typings/msg/bn.d.ts | 16 + static/js/typings/msg/br.d.ts | 16 + static/js/typings/msg/ca.d.ts | 16 + static/js/typings/msg/constants.d.ts | 16 + static/js/typings/msg/cs.d.ts | 16 + static/js/typings/msg/da.d.ts | 16 + static/js/typings/msg/de.d.ts | 16 + static/js/typings/msg/diq.d.ts | 16 + static/js/typings/msg/dty.d.ts | 16 + static/js/typings/msg/ee.d.ts | 16 + static/js/typings/msg/el.d.ts | 16 + static/js/typings/msg/en-gb.d.ts | 16 + static/js/typings/msg/en.d.ts | 16 + static/js/typings/msg/eo.d.ts | 16 + static/js/typings/msg/es.d.ts | 16 + static/js/typings/msg/et.d.ts | 16 + static/js/typings/msg/eu.d.ts | 16 + static/js/typings/msg/fa.d.ts | 16 + static/js/typings/msg/fi.d.ts | 16 + static/js/typings/msg/fr.d.ts | 16 + static/js/typings/msg/gl.d.ts | 16 + static/js/typings/msg/gor.d.ts | 16 + static/js/typings/msg/ha.d.ts | 16 + static/js/typings/msg/he.d.ts | 16 + static/js/typings/msg/hi.d.ts | 16 + static/js/typings/msg/hrx.d.ts | 16 + static/js/typings/msg/hu.d.ts | 16 + static/js/typings/msg/hy.d.ts | 16 + static/js/typings/msg/ia.d.ts | 16 + static/js/typings/msg/id.d.ts | 16 + static/js/typings/msg/ig.d.ts | 16 + static/js/typings/msg/is.d.ts | 16 + static/js/typings/msg/it.d.ts | 16 + static/js/typings/msg/ja.d.ts | 16 + static/js/typings/msg/kab.d.ts | 16 + static/js/typings/msg/kn.d.ts | 16 + static/js/typings/msg/ko.d.ts | 16 + static/js/typings/msg/lb.d.ts | 16 + static/js/typings/msg/lki.d.ts | 16 + static/js/typings/msg/lo.d.ts | 16 + static/js/typings/msg/lrc.d.ts | 16 + static/js/typings/msg/lt.d.ts | 16 + static/js/typings/msg/lv.d.ts | 16 + static/js/typings/msg/mk.d.ts | 16 + static/js/typings/msg/mnw.d.ts | 16 + static/js/typings/msg/ms.d.ts | 16 + static/js/typings/msg/msg.d.ts | 444 + static/js/typings/msg/nb.d.ts | 16 + static/js/typings/msg/nl.d.ts | 16 + static/js/typings/msg/oc.d.ts | 16 + static/js/typings/msg/pl.d.ts | 16 + static/js/typings/msg/pms.d.ts | 16 + static/js/typings/msg/pt-br.d.ts | 16 + static/js/typings/msg/pt.d.ts | 16 + static/js/typings/msg/qqq.d.ts | 16 + static/js/typings/msg/ro.d.ts | 16 + static/js/typings/msg/ru.d.ts | 16 + static/js/typings/msg/sc.d.ts | 16 + static/js/typings/msg/sd.d.ts | 16 + static/js/typings/msg/shn.d.ts | 16 + static/js/typings/msg/sk.d.ts | 16 + static/js/typings/msg/skr-arab.d.ts | 16 + static/js/typings/msg/sl.d.ts | 16 + static/js/typings/msg/sq.d.ts | 16 + static/js/typings/msg/sr-latn.d.ts | 16 + static/js/typings/msg/sr.d.ts | 16 + static/js/typings/msg/sv.d.ts | 16 + static/js/typings/msg/synonyms.d.ts | 16 + static/js/typings/msg/ta.d.ts | 16 + static/js/typings/msg/tcy.d.ts | 16 + static/js/typings/msg/te.d.ts | 16 + static/js/typings/msg/th.d.ts | 16 + static/js/typings/msg/tl.d.ts | 16 + static/js/typings/msg/tlh.d.ts | 16 + static/js/typings/msg/tr.d.ts | 16 + static/js/typings/msg/ug-arab.d.ts | 16 + static/js/typings/msg/uk.d.ts | 16 + static/js/typings/msg/ur.d.ts | 16 + static/js/typings/msg/vi.d.ts | 16 + static/js/typings/msg/xmf.d.ts | 16 + static/js/typings/msg/yo.d.ts | 16 + static/js/typings/msg/zgh.d.ts | 16 + static/js/typings/msg/zh-hans.d.ts | 16 + static/js/typings/msg/zh-hant.d.ts | 16 + static/js/typings/php.d.ts | 15 + static/js/typings/python.d.ts | 15 + .../typings/templates/blockly-header.template | 12 + .../templates/blockly-interfaces.template | 83 + static/js/typings/templates/msg.template | 16 + static/js/typings/tsconfig.json | 23 + static/media/1x1.gif | Bin 0 -> 43 bytes static/media/click.mp3 | Bin 0 -> 2304 bytes static/media/click.ogg | Bin 0 -> 4865 bytes static/media/click.wav | Bin 0 -> 3782 bytes static/media/colab_favicon.ico | Bin 0 -> 73070 bytes static/media/copy.png | Bin 0 -> 8116 bytes static/media/delete.mp3 | Bin 0 -> 3123 bytes static/media/delete.ogg | Bin 0 -> 5731 bytes static/media/delete.wav | Bin 0 -> 9164 bytes static/media/disconnect.mp3 | Bin 0 -> 1586 bytes static/media/disconnect.ogg | Bin 0 -> 4404 bytes static/media/disconnect.wav | Bin 0 -> 1492 bytes static/media/download.png | Bin 0 -> 3546 bytes static/media/dropdown-arrow.svg | 1 + static/media/handclosed.cur | Bin 0 -> 326 bytes static/media/handdelete.cur | Bin 0 -> 766 bytes static/media/handopen.cur | Bin 0 -> 198 bytes static/media/pilcrow.png | Bin 0 -> 1010 bytes static/media/quote0.png | Bin 0 -> 771 bytes static/media/quote1.png | Bin 0 -> 738 bytes static/media/regression_analysis.svg | 1 + static/media/sprites.png | Bin 0 -> 2595 bytes static/media/sprites.svg | 74 + static/media/upload.png | Bin 0 -> 4984 bytes templates/index.html | 725 + templates/reportViewer.html | 0 templates/tableviewer.html | 0 vercel.json | 15 + 1306 files changed, 364980 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/codeql.yml create mode 100644 .github/workflows/greetings.yml create mode 100644 .github/workflows/pylint.yml create mode 100644 .github/workflows/requirementsTest.yml create mode 100644 .gitignore create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Procfile create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 UserGuide.md create mode 100644 _config.yml create mode 100644 app.py create mode 100644 assets/custom-script.js create mode 100644 assets/favicon.ico create mode 100644 assets/style.css create mode 100644 libs/dashboard.py create mode 100644 libs/dataframe_visualizer.py create mode 100644 libs/util.py create mode 100644 media/DatasetView.png create mode 100644 media/DownloadView.png create mode 100644 media/IrisRandomForest.png create mode 100644 media/blocklyML_Banner.png create mode 100644 media/blocklyML_icon.png create mode 100644 media/blocklyML_logo.png create mode 100644 media/blocklyML_upload.png create mode 100644 media/butttons.png create mode 100644 media/upload_buttton.png create mode 100644 requirements.txt create mode 100644 sampleLayouts/machine learning/Pycaret/Pycaret_LR_IRIS.xml create mode 100644 sampleLayouts/machine learning/Pycaret/Pycaret_RF_IRIS.xml create mode 100644 sampleLayouts/machine learning/sk learn/blocklyML_RF_IRIS.xml create mode 100644 sampleLayouts/machine learning/sk learn/blocklyML_RF_TITANIC.xml create mode 100644 static/css/icon.png create mode 100644 static/css/icons.png create mode 100644 static/css/style.css create mode 100644 static/images/blocklyML_logo.png create mode 100644 static/images/favicon.ico create mode 100644 static/js/blockly.js create mode 100644 static/js/blockly_ML.js create mode 100644 static/js/blockly_compressed.js create mode 100644 static/js/blockly_compressed.js.map create mode 100644 static/js/blockly_uncompressed.js create mode 100644 static/js/blocks/colour.js create mode 100644 static/js/blocks/lists.js create mode 100644 static/js/blocks/logic.js create mode 100644 static/js/blocks/loops.js create mode 100644 static/js/blocks/math.js create mode 100644 static/js/blocks/procedures.js create mode 100644 static/js/blocks/text.js create mode 100644 static/js/blocks/variables.js create mode 100644 static/js/blocks/variables_dynamic.js create mode 100644 static/js/blocks_ML.js create mode 100644 static/js/blocks_compressed.js create mode 100644 static/js/closure/goog/base.js create mode 100644 static/js/core/block.js create mode 100644 static/js/core/block_animations.js create mode 100644 static/js/core/block_drag_surface.js create mode 100644 static/js/core/block_dragger.js create mode 100644 static/js/core/block_svg.js create mode 100644 static/js/core/blockly.js create mode 100644 static/js/core/blocks.js create mode 100644 static/js/core/bubble.js create mode 100644 static/js/core/bubble_dragger.js create mode 100644 static/js/core/comment.js create mode 100644 static/js/core/connection.js create mode 100644 static/js/core/connection_checker.js create mode 100644 static/js/core/connection_db.js create mode 100644 static/js/core/constants.js create mode 100644 static/js/core/contextmenu.js create mode 100644 static/js/core/contextmenu_items.js create mode 100644 static/js/core/contextmenu_registry.js create mode 100644 static/js/core/css.js create mode 100644 static/js/core/dropdowndiv.js create mode 100644 static/js/core/events/block_events.js create mode 100644 static/js/core/events/events.js create mode 100644 static/js/core/events/events_abstract.js create mode 100644 static/js/core/events/events_block_drag.js create mode 100644 static/js/core/events/events_bubble_open.js create mode 100644 static/js/core/events/events_click.js create mode 100644 static/js/core/events/events_marker_move.js create mode 100644 static/js/core/events/events_selected.js create mode 100644 static/js/core/events/events_theme_change.js create mode 100644 static/js/core/events/events_toolbox_item_select.js create mode 100644 static/js/core/events/events_trashcan_open.js create mode 100644 static/js/core/events/events_viewport.js create mode 100644 static/js/core/events/ui_events.js create mode 100644 static/js/core/events/variable_events.js create mode 100644 static/js/core/events/workspace_events.js create mode 100644 static/js/core/events/ws_comment_events.js create mode 100644 static/js/core/extensions.js create mode 100644 static/js/core/field.js create mode 100644 static/js/core/field_angle.js create mode 100644 static/js/core/field_checkbox.js create mode 100644 static/js/core/field_colour.js create mode 100644 static/js/core/field_dropdown.js create mode 100644 static/js/core/field_image.js create mode 100644 static/js/core/field_label.js create mode 100644 static/js/core/field_label_serializable.js create mode 100644 static/js/core/field_multilineinput.js create mode 100644 static/js/core/field_number.js create mode 100644 static/js/core/field_registry.js create mode 100644 static/js/core/field_textinput.js create mode 100644 static/js/core/field_variable.js create mode 100644 static/js/core/flyout_base.js create mode 100644 static/js/core/flyout_button.js create mode 100644 static/js/core/flyout_dragger.js create mode 100644 static/js/core/flyout_horizontal.js create mode 100644 static/js/core/flyout_vertical.js create mode 100644 static/js/core/generator.js create mode 100644 static/js/core/gesture.js create mode 100644 static/js/core/grid.js create mode 100644 static/js/core/icon.js create mode 100644 static/js/core/inject.js create mode 100644 static/js/core/input.js create mode 100644 static/js/core/insertion_marker_manager.js create mode 100644 static/js/core/interfaces/i_accessibility.js create mode 100644 static/js/core/interfaces/i_bounded_element.js create mode 100644 static/js/core/interfaces/i_bubble.js create mode 100644 static/js/core/interfaces/i_connection_checker.js create mode 100644 static/js/core/interfaces/i_contextmenu.js create mode 100644 static/js/core/interfaces/i_copyable.js create mode 100644 static/js/core/interfaces/i_deletable.js create mode 100644 static/js/core/interfaces/i_deletearea.js create mode 100644 static/js/core/interfaces/i_flyout.js create mode 100644 static/js/core/interfaces/i_movable.js create mode 100644 static/js/core/interfaces/i_registrable.js create mode 100644 static/js/core/interfaces/i_registrable_field.js create mode 100644 static/js/core/interfaces/i_selectable.js create mode 100644 static/js/core/interfaces/i_styleable.js create mode 100644 static/js/core/interfaces/i_toolbox.js create mode 100644 static/js/core/interfaces/i_toolbox_item.js create mode 100644 static/js/core/keyboard_nav/ast_node.js create mode 100644 static/js/core/keyboard_nav/basic_cursor.js create mode 100644 static/js/core/keyboard_nav/cursor.js create mode 100644 static/js/core/keyboard_nav/flyout_cursor.js create mode 100644 static/js/core/keyboard_nav/marker.js create mode 100644 static/js/core/keyboard_nav/navigation.js create mode 100644 static/js/core/keyboard_nav/tab_navigate_cursor.js create mode 100644 static/js/core/marker_manager.js create mode 100644 static/js/core/menu.js create mode 100644 static/js/core/menuitem.js create mode 100644 static/js/core/msg.js create mode 100644 static/js/core/mutator.js create mode 100644 static/js/core/names.js create mode 100644 static/js/core/options.js create mode 100644 static/js/core/procedures.js create mode 100644 static/js/core/registry.js create mode 100644 static/js/core/rendered_connection.js create mode 100644 static/js/core/renderers/common/block_rendering.js create mode 100644 static/js/core/renderers/common/constants.js create mode 100644 static/js/core/renderers/common/debugger.js create mode 100644 static/js/core/renderers/common/drawer.js create mode 100644 static/js/core/renderers/common/i_path_object.js create mode 100644 static/js/core/renderers/common/info.js create mode 100644 static/js/core/renderers/common/marker_svg.js create mode 100644 static/js/core/renderers/common/path_object.js create mode 100644 static/js/core/renderers/common/renderer.js create mode 100644 static/js/core/renderers/geras/constants.js create mode 100644 static/js/core/renderers/geras/drawer.js create mode 100644 static/js/core/renderers/geras/highlight_constants.js create mode 100644 static/js/core/renderers/geras/highlighter.js create mode 100644 static/js/core/renderers/geras/info.js create mode 100644 static/js/core/renderers/geras/measurables/inputs.js create mode 100644 static/js/core/renderers/geras/path_object.js create mode 100644 static/js/core/renderers/geras/renderer.js create mode 100644 static/js/core/renderers/measurables/base.js create mode 100644 static/js/core/renderers/measurables/connections.js create mode 100644 static/js/core/renderers/measurables/inputs.js create mode 100644 static/js/core/renderers/measurables/row_elements.js create mode 100644 static/js/core/renderers/measurables/rows.js create mode 100644 static/js/core/renderers/measurables/types.js create mode 100644 static/js/core/renderers/minimalist/constants.js create mode 100644 static/js/core/renderers/minimalist/drawer.js create mode 100644 static/js/core/renderers/minimalist/info.js create mode 100644 static/js/core/renderers/minimalist/renderer.js create mode 100644 static/js/core/renderers/thrasos/info.js create mode 100644 static/js/core/renderers/thrasos/renderer.js create mode 100644 static/js/core/renderers/zelos/constants.js create mode 100644 static/js/core/renderers/zelos/drawer.js create mode 100644 static/js/core/renderers/zelos/info.js create mode 100644 static/js/core/renderers/zelos/marker_svg.js create mode 100644 static/js/core/renderers/zelos/measurables/inputs.js create mode 100644 static/js/core/renderers/zelos/measurables/row_elements.js create mode 100644 static/js/core/renderers/zelos/measurables/rows.js create mode 100644 static/js/core/renderers/zelos/path_object.js create mode 100644 static/js/core/renderers/zelos/renderer.js create mode 100644 static/js/core/requires.js create mode 100644 static/js/core/scrollbar.js create mode 100644 static/js/core/shortcut_items.js create mode 100644 static/js/core/shortcut_registry.js create mode 100644 static/js/core/theme.js create mode 100644 static/js/core/theme/classic.js create mode 100644 static/js/core/theme/dark.js create mode 100644 static/js/core/theme/deuteranopia.js create mode 100644 static/js/core/theme/highcontrast.js create mode 100644 static/js/core/theme/modern.js create mode 100644 static/js/core/theme/tritanopia.js create mode 100644 static/js/core/theme/zelos.js create mode 100644 static/js/core/theme_manager.js create mode 100644 static/js/core/toolbox/category.js create mode 100644 static/js/core/toolbox/collapsible_category.js create mode 100644 static/js/core/toolbox/separator.js create mode 100644 static/js/core/toolbox/toolbox.js create mode 100644 static/js/core/toolbox/toolbox_item.js create mode 100644 static/js/core/tooltip.js create mode 100644 static/js/core/touch.js create mode 100644 static/js/core/touch_gesture.js create mode 100644 static/js/core/trashcan.js create mode 100644 static/js/core/utils.js create mode 100644 static/js/core/utils/aria.js create mode 100644 static/js/core/utils/colour.js create mode 100644 static/js/core/utils/coordinate.js create mode 100644 static/js/core/utils/deprecation.js create mode 100644 static/js/core/utils/dom.js create mode 100644 static/js/core/utils/global.js create mode 100644 static/js/core/utils/idgenerator.js create mode 100644 static/js/core/utils/keycodes.js create mode 100644 static/js/core/utils/math.js create mode 100644 static/js/core/utils/metrics.js create mode 100644 static/js/core/utils/object.js create mode 100644 static/js/core/utils/rect.js create mode 100644 static/js/core/utils/size.js create mode 100644 static/js/core/utils/string.js create mode 100644 static/js/core/utils/style.js create mode 100644 static/js/core/utils/svg.js create mode 100644 static/js/core/utils/svg_paths.js create mode 100644 static/js/core/utils/toolbox.js create mode 100644 static/js/core/utils/useragent.js create mode 100644 static/js/core/utils/xml.js create mode 100644 static/js/core/variable_map.js create mode 100644 static/js/core/variable_model.js create mode 100644 static/js/core/variables.js create mode 100644 static/js/core/variables_dynamic.js create mode 100644 static/js/core/warning.js create mode 100644 static/js/core/widgetdiv.js create mode 100644 static/js/core/workspace.js create mode 100644 static/js/core/workspace_audio.js create mode 100644 static/js/core/workspace_comment.js create mode 100644 static/js/core/workspace_comment_render_svg.js create mode 100644 static/js/core/workspace_comment_svg.js create mode 100644 static/js/core/workspace_drag_surface_svg.js create mode 100644 static/js/core/workspace_dragger.js create mode 100644 static/js/core/workspace_svg.js create mode 100644 static/js/core/xml.js create mode 100644 static/js/core/zoom_controls.js create mode 100644 static/js/dart_compressed.js create mode 100644 static/js/dist/README.md create mode 100644 static/js/dist/blockly.d.ts create mode 100644 static/js/dist/blockly.js create mode 100644 static/js/dist/blockly.min.js create mode 100644 static/js/dist/blockly_compressed.js create mode 100644 static/js/dist/blockly_compressed.js.map create mode 100644 static/js/dist/blocks.d.ts create mode 100644 static/js/dist/blocks.js create mode 100644 static/js/dist/blocks/colour.js create mode 100644 static/js/dist/blocks/lists.js create mode 100644 static/js/dist/blocks/logic.js create mode 100644 static/js/dist/blocks/loops.js create mode 100644 static/js/dist/blocks/math.js create mode 100644 static/js/dist/blocks/procedures.js create mode 100644 static/js/dist/blocks/text.js create mode 100644 static/js/dist/blocks/variables.js create mode 100644 static/js/dist/blocks/variables_dynamic.js create mode 100644 static/js/dist/blocks_compressed.js create mode 100644 static/js/dist/blocks_compressed.js.map create mode 100644 static/js/dist/browser.js create mode 100644 static/js/dist/core-browser.js create mode 100644 static/js/dist/core.d.ts create mode 100644 static/js/dist/core.js create mode 100644 static/js/dist/core/block.js create mode 100644 static/js/dist/core/block_animations.js create mode 100644 static/js/dist/core/block_drag_surface.js create mode 100644 static/js/dist/core/block_dragger.js create mode 100644 static/js/dist/core/block_svg.js create mode 100644 static/js/dist/core/blockly.js create mode 100644 static/js/dist/core/blocks.js create mode 100644 static/js/dist/core/bubble.js create mode 100644 static/js/dist/core/bubble_dragger.js create mode 100644 static/js/dist/core/comment.js create mode 100644 static/js/dist/core/connection.js create mode 100644 static/js/dist/core/connection_checker.js create mode 100644 static/js/dist/core/connection_db.js create mode 100644 static/js/dist/core/constants.js create mode 100644 static/js/dist/core/contextmenu.js create mode 100644 static/js/dist/core/contextmenu_items.js create mode 100644 static/js/dist/core/contextmenu_registry.js create mode 100644 static/js/dist/core/css.js create mode 100644 static/js/dist/core/dropdowndiv.js create mode 100644 static/js/dist/core/events/block_events.js create mode 100644 static/js/dist/core/events/events.js create mode 100644 static/js/dist/core/events/events_abstract.js create mode 100644 static/js/dist/core/events/events_block_drag.js create mode 100644 static/js/dist/core/events/events_bubble_open.js create mode 100644 static/js/dist/core/events/events_click.js create mode 100644 static/js/dist/core/events/events_marker_move.js create mode 100644 static/js/dist/core/events/events_selected.js create mode 100644 static/js/dist/core/events/events_theme_change.js create mode 100644 static/js/dist/core/events/events_toolbox_item_select.js create mode 100644 static/js/dist/core/events/events_trashcan_open.js create mode 100644 static/js/dist/core/events/events_viewport.js create mode 100644 static/js/dist/core/events/ui_events.js create mode 100644 static/js/dist/core/events/variable_events.js create mode 100644 static/js/dist/core/events/workspace_events.js create mode 100644 static/js/dist/core/events/ws_comment_events.js create mode 100644 static/js/dist/core/extensions.js create mode 100644 static/js/dist/core/field.js create mode 100644 static/js/dist/core/field_angle.js create mode 100644 static/js/dist/core/field_checkbox.js create mode 100644 static/js/dist/core/field_colour.js create mode 100644 static/js/dist/core/field_dropdown.js create mode 100644 static/js/dist/core/field_image.js create mode 100644 static/js/dist/core/field_label.js create mode 100644 static/js/dist/core/field_label_serializable.js create mode 100644 static/js/dist/core/field_multilineinput.js create mode 100644 static/js/dist/core/field_number.js create mode 100644 static/js/dist/core/field_registry.js create mode 100644 static/js/dist/core/field_textinput.js create mode 100644 static/js/dist/core/field_variable.js create mode 100644 static/js/dist/core/flyout_base.js create mode 100644 static/js/dist/core/flyout_button.js create mode 100644 static/js/dist/core/flyout_dragger.js create mode 100644 static/js/dist/core/flyout_horizontal.js create mode 100644 static/js/dist/core/flyout_vertical.js create mode 100644 static/js/dist/core/generator.js create mode 100644 static/js/dist/core/gesture.js create mode 100644 static/js/dist/core/grid.js create mode 100644 static/js/dist/core/icon.js create mode 100644 static/js/dist/core/inject.js create mode 100644 static/js/dist/core/input.js create mode 100644 static/js/dist/core/insertion_marker_manager.js create mode 100644 static/js/dist/core/interfaces/i_accessibility.js create mode 100644 static/js/dist/core/interfaces/i_bounded_element.js create mode 100644 static/js/dist/core/interfaces/i_bubble.js create mode 100644 static/js/dist/core/interfaces/i_connection_checker.js create mode 100644 static/js/dist/core/interfaces/i_contextmenu.js create mode 100644 static/js/dist/core/interfaces/i_copyable.js create mode 100644 static/js/dist/core/interfaces/i_deletable.js create mode 100644 static/js/dist/core/interfaces/i_deletearea.js create mode 100644 static/js/dist/core/interfaces/i_flyout.js create mode 100644 static/js/dist/core/interfaces/i_movable.js create mode 100644 static/js/dist/core/interfaces/i_registrable.js create mode 100644 static/js/dist/core/interfaces/i_registrable_field.js create mode 100644 static/js/dist/core/interfaces/i_selectable.js create mode 100644 static/js/dist/core/interfaces/i_styleable.js create mode 100644 static/js/dist/core/interfaces/i_toolbox.js create mode 100644 static/js/dist/core/interfaces/i_toolbox_item.js create mode 100644 static/js/dist/core/keyboard_nav/ast_node.js create mode 100644 static/js/dist/core/keyboard_nav/basic_cursor.js create mode 100644 static/js/dist/core/keyboard_nav/cursor.js create mode 100644 static/js/dist/core/keyboard_nav/flyout_cursor.js create mode 100644 static/js/dist/core/keyboard_nav/marker.js create mode 100644 static/js/dist/core/keyboard_nav/navigation.js create mode 100644 static/js/dist/core/keyboard_nav/tab_navigate_cursor.js create mode 100644 static/js/dist/core/marker_manager.js create mode 100644 static/js/dist/core/menu.js create mode 100644 static/js/dist/core/menuitem.js create mode 100644 static/js/dist/core/msg.js create mode 100644 static/js/dist/core/mutator.js create mode 100644 static/js/dist/core/names.js create mode 100644 static/js/dist/core/options.js create mode 100644 static/js/dist/core/procedures.js create mode 100644 static/js/dist/core/registry.js create mode 100644 static/js/dist/core/rendered_connection.js create mode 100644 static/js/dist/core/renderers/common/block_rendering.js create mode 100644 static/js/dist/core/renderers/common/constants.js create mode 100644 static/js/dist/core/renderers/common/debugger.js create mode 100644 static/js/dist/core/renderers/common/drawer.js create mode 100644 static/js/dist/core/renderers/common/i_path_object.js create mode 100644 static/js/dist/core/renderers/common/info.js create mode 100644 static/js/dist/core/renderers/common/marker_svg.js create mode 100644 static/js/dist/core/renderers/common/path_object.js create mode 100644 static/js/dist/core/renderers/common/renderer.js create mode 100644 static/js/dist/core/renderers/geras/constants.js create mode 100644 static/js/dist/core/renderers/geras/drawer.js create mode 100644 static/js/dist/core/renderers/geras/highlight_constants.js create mode 100644 static/js/dist/core/renderers/geras/highlighter.js create mode 100644 static/js/dist/core/renderers/geras/info.js create mode 100644 static/js/dist/core/renderers/geras/measurables/inputs.js create mode 100644 static/js/dist/core/renderers/geras/path_object.js create mode 100644 static/js/dist/core/renderers/geras/renderer.js create mode 100644 static/js/dist/core/renderers/measurables/base.js create mode 100644 static/js/dist/core/renderers/measurables/connections.js create mode 100644 static/js/dist/core/renderers/measurables/inputs.js create mode 100644 static/js/dist/core/renderers/measurables/row_elements.js create mode 100644 static/js/dist/core/renderers/measurables/rows.js create mode 100644 static/js/dist/core/renderers/measurables/types.js create mode 100644 static/js/dist/core/renderers/minimalist/constants.js create mode 100644 static/js/dist/core/renderers/minimalist/drawer.js create mode 100644 static/js/dist/core/renderers/minimalist/info.js create mode 100644 static/js/dist/core/renderers/minimalist/renderer.js create mode 100644 static/js/dist/core/renderers/thrasos/info.js create mode 100644 static/js/dist/core/renderers/thrasos/renderer.js create mode 100644 static/js/dist/core/renderers/zelos/constants.js create mode 100644 static/js/dist/core/renderers/zelos/drawer.js create mode 100644 static/js/dist/core/renderers/zelos/info.js create mode 100644 static/js/dist/core/renderers/zelos/marker_svg.js create mode 100644 static/js/dist/core/renderers/zelos/measurables/inputs.js create mode 100644 static/js/dist/core/renderers/zelos/measurables/row_elements.js create mode 100644 static/js/dist/core/renderers/zelos/measurables/rows.js create mode 100644 static/js/dist/core/renderers/zelos/path_object.js create mode 100644 static/js/dist/core/renderers/zelos/renderer.js create mode 100644 static/js/dist/core/requires.js create mode 100644 static/js/dist/core/scrollbar.js create mode 100644 static/js/dist/core/shortcut_items.js create mode 100644 static/js/dist/core/shortcut_registry.js create mode 100644 static/js/dist/core/theme.js create mode 100644 static/js/dist/core/theme/classic.js create mode 100644 static/js/dist/core/theme/dark.js create mode 100644 static/js/dist/core/theme/deuteranopia.js create mode 100644 static/js/dist/core/theme/highcontrast.js create mode 100644 static/js/dist/core/theme/modern.js create mode 100644 static/js/dist/core/theme/tritanopia.js create mode 100644 static/js/dist/core/theme/zelos.js create mode 100644 static/js/dist/core/theme_manager.js create mode 100644 static/js/dist/core/toolbox/category.js create mode 100644 static/js/dist/core/toolbox/collapsible_category.js create mode 100644 static/js/dist/core/toolbox/separator.js create mode 100644 static/js/dist/core/toolbox/toolbox.js create mode 100644 static/js/dist/core/toolbox/toolbox_item.js create mode 100644 static/js/dist/core/tooltip.js create mode 100644 static/js/dist/core/touch.js create mode 100644 static/js/dist/core/touch_gesture.js create mode 100644 static/js/dist/core/trashcan.js create mode 100644 static/js/dist/core/utils.js create mode 100644 static/js/dist/core/utils/aria.js create mode 100644 static/js/dist/core/utils/colour.js create mode 100644 static/js/dist/core/utils/coordinate.js create mode 100644 static/js/dist/core/utils/deprecation.js create mode 100644 static/js/dist/core/utils/dom.js create mode 100644 static/js/dist/core/utils/global.js create mode 100644 static/js/dist/core/utils/idgenerator.js create mode 100644 static/js/dist/core/utils/keycodes.js create mode 100644 static/js/dist/core/utils/math.js create mode 100644 static/js/dist/core/utils/metrics.js create mode 100644 static/js/dist/core/utils/object.js create mode 100644 static/js/dist/core/utils/rect.js create mode 100644 static/js/dist/core/utils/size.js create mode 100644 static/js/dist/core/utils/string.js create mode 100644 static/js/dist/core/utils/style.js create mode 100644 static/js/dist/core/utils/svg.js create mode 100644 static/js/dist/core/utils/svg_paths.js create mode 100644 static/js/dist/core/utils/toolbox.js create mode 100644 static/js/dist/core/utils/useragent.js create mode 100644 static/js/dist/core/utils/xml.js create mode 100644 static/js/dist/core/variable_map.js create mode 100644 static/js/dist/core/variable_model.js create mode 100644 static/js/dist/core/variables.js create mode 100644 static/js/dist/core/variables_dynamic.js create mode 100644 static/js/dist/core/warning.js create mode 100644 static/js/dist/core/widgetdiv.js create mode 100644 static/js/dist/core/workspace.js create mode 100644 static/js/dist/core/workspace_audio.js create mode 100644 static/js/dist/core/workspace_comment.js create mode 100644 static/js/dist/core/workspace_comment_render_svg.js create mode 100644 static/js/dist/core/workspace_comment_svg.js create mode 100644 static/js/dist/core/workspace_drag_surface_svg.js create mode 100644 static/js/dist/core/workspace_dragger.js create mode 100644 static/js/dist/core/workspace_svg.js create mode 100644 static/js/dist/core/xml.js create mode 100644 static/js/dist/core/zoom_controls.js create mode 100644 static/js/dist/dart.d.ts create mode 100644 static/js/dist/dart.js create mode 100644 static/js/dist/dart_compressed.js create mode 100644 static/js/dist/dart_compressed.js.map create mode 100644 static/js/dist/generators/dart.js create mode 100644 static/js/dist/generators/dart/colour.js create mode 100644 static/js/dist/generators/dart/lists.js create mode 100644 static/js/dist/generators/dart/logic.js create mode 100644 static/js/dist/generators/dart/loops.js create mode 100644 static/js/dist/generators/dart/math.js create mode 100644 static/js/dist/generators/dart/procedures.js create mode 100644 static/js/dist/generators/dart/text.js create mode 100644 static/js/dist/generators/dart/variables.js create mode 100644 static/js/dist/generators/dart/variables_dynamic.js create mode 100644 static/js/dist/generators/javascript.js create mode 100644 static/js/dist/generators/javascript/colour.js create mode 100644 static/js/dist/generators/javascript/lists.js create mode 100644 static/js/dist/generators/javascript/logic.js create mode 100644 static/js/dist/generators/javascript/loops.js create mode 100644 static/js/dist/generators/javascript/math.js create mode 100644 static/js/dist/generators/javascript/procedures.js create mode 100644 static/js/dist/generators/javascript/text.js create mode 100644 static/js/dist/generators/javascript/variables.js create mode 100644 static/js/dist/generators/javascript/variables_dynamic.js create mode 100644 static/js/dist/generators/lua.js create mode 100644 static/js/dist/generators/lua/colour.js create mode 100644 static/js/dist/generators/lua/lists.js create mode 100644 static/js/dist/generators/lua/logic.js create mode 100644 static/js/dist/generators/lua/loops.js create mode 100644 static/js/dist/generators/lua/math.js create mode 100644 static/js/dist/generators/lua/procedures.js create mode 100644 static/js/dist/generators/lua/text.js create mode 100644 static/js/dist/generators/lua/variables.js create mode 100644 static/js/dist/generators/lua/variables_dynamic.js create mode 100644 static/js/dist/generators/php.js create mode 100644 static/js/dist/generators/php/colour.js create mode 100644 static/js/dist/generators/php/lists.js create mode 100644 static/js/dist/generators/php/logic.js create mode 100644 static/js/dist/generators/php/loops.js create mode 100644 static/js/dist/generators/php/math.js create mode 100644 static/js/dist/generators/php/procedures.js create mode 100644 static/js/dist/generators/php/text.js create mode 100644 static/js/dist/generators/php/variables.js create mode 100644 static/js/dist/generators/php/variables_dynamic.js create mode 100644 static/js/dist/generators/python.js create mode 100644 static/js/dist/generators/python/colour.js create mode 100644 static/js/dist/generators/python/lists.js create mode 100644 static/js/dist/generators/python/logic.js create mode 100644 static/js/dist/generators/python/loops.js create mode 100644 static/js/dist/generators/python/math.js create mode 100644 static/js/dist/generators/python/procedures.js create mode 100644 static/js/dist/generators/python/text.js create mode 100644 static/js/dist/generators/python/variables.js create mode 100644 static/js/dist/generators/python/variables_dynamic.js create mode 100644 static/js/dist/index.d.ts create mode 100644 static/js/dist/index.js create mode 100644 static/js/dist/javascript.d.ts create mode 100644 static/js/dist/javascript.js create mode 100644 static/js/dist/javascript_compressed.js create mode 100644 static/js/dist/javascript_compressed.js.map create mode 100644 static/js/dist/lua.d.ts create mode 100644 static/js/dist/lua.js create mode 100644 static/js/dist/lua_compressed.js create mode 100644 static/js/dist/lua_compressed.js.map create mode 100644 static/js/dist/media/1x1.gif create mode 100644 static/js/dist/media/click.mp3 create mode 100644 static/js/dist/media/click.ogg create mode 100644 static/js/dist/media/click.wav create mode 100644 static/js/dist/media/delete.mp3 create mode 100644 static/js/dist/media/delete.ogg create mode 100644 static/js/dist/media/delete.wav create mode 100644 static/js/dist/media/disconnect.mp3 create mode 100644 static/js/dist/media/disconnect.ogg create mode 100644 static/js/dist/media/disconnect.wav create mode 100644 static/js/dist/media/dropdown-arrow.svg create mode 100644 static/js/dist/media/handclosed.cur create mode 100644 static/js/dist/media/handdelete.cur create mode 100644 static/js/dist/media/handopen.cur create mode 100644 static/js/dist/media/pilcrow.png create mode 100644 static/js/dist/media/quote0.png create mode 100644 static/js/dist/media/quote1.png create mode 100644 static/js/dist/media/sprites.png create mode 100644 static/js/dist/media/sprites.svg create mode 100644 static/js/dist/msg/ab.d.ts create mode 100644 static/js/dist/msg/ab.js create mode 100644 static/js/dist/msg/ar.d.ts create mode 100644 static/js/dist/msg/ar.js create mode 100644 static/js/dist/msg/az.d.ts create mode 100644 static/js/dist/msg/az.js create mode 100644 static/js/dist/msg/ba.d.ts create mode 100644 static/js/dist/msg/ba.js create mode 100644 static/js/dist/msg/bcc.d.ts create mode 100644 static/js/dist/msg/bcc.js create mode 100644 static/js/dist/msg/be-tarask.d.ts create mode 100644 static/js/dist/msg/be-tarask.js create mode 100644 static/js/dist/msg/be.d.ts create mode 100644 static/js/dist/msg/be.js create mode 100644 static/js/dist/msg/bg.d.ts create mode 100644 static/js/dist/msg/bg.js create mode 100644 static/js/dist/msg/bn.d.ts create mode 100644 static/js/dist/msg/bn.js create mode 100644 static/js/dist/msg/br.d.ts create mode 100644 static/js/dist/msg/br.js create mode 100644 static/js/dist/msg/ca.d.ts create mode 100644 static/js/dist/msg/ca.js create mode 100644 static/js/dist/msg/constants.d.ts create mode 100644 static/js/dist/msg/cs.d.ts create mode 100644 static/js/dist/msg/cs.js create mode 100644 static/js/dist/msg/da.d.ts create mode 100644 static/js/dist/msg/da.js create mode 100644 static/js/dist/msg/de.d.ts create mode 100644 static/js/dist/msg/de.js create mode 100644 static/js/dist/msg/diq.d.ts create mode 100644 static/js/dist/msg/diq.js create mode 100644 static/js/dist/msg/dty.d.ts create mode 100644 static/js/dist/msg/dty.js create mode 100644 static/js/dist/msg/ee.d.ts create mode 100644 static/js/dist/msg/ee.js create mode 100644 static/js/dist/msg/el.d.ts create mode 100644 static/js/dist/msg/el.js create mode 100644 static/js/dist/msg/en-gb.d.ts create mode 100644 static/js/dist/msg/en-gb.js create mode 100644 static/js/dist/msg/en.d.ts create mode 100644 static/js/dist/msg/en.js create mode 100644 static/js/dist/msg/eo.d.ts create mode 100644 static/js/dist/msg/eo.js create mode 100644 static/js/dist/msg/es.d.ts create mode 100644 static/js/dist/msg/es.js create mode 100644 static/js/dist/msg/et.d.ts create mode 100644 static/js/dist/msg/et.js create mode 100644 static/js/dist/msg/eu.d.ts create mode 100644 static/js/dist/msg/eu.js create mode 100644 static/js/dist/msg/fa.d.ts create mode 100644 static/js/dist/msg/fa.js create mode 100644 static/js/dist/msg/fi.d.ts create mode 100644 static/js/dist/msg/fi.js create mode 100644 static/js/dist/msg/fr.d.ts create mode 100644 static/js/dist/msg/fr.js create mode 100644 static/js/dist/msg/gl.d.ts create mode 100644 static/js/dist/msg/gl.js create mode 100644 static/js/dist/msg/gor.d.ts create mode 100644 static/js/dist/msg/gor.js create mode 100644 static/js/dist/msg/ha.d.ts create mode 100644 static/js/dist/msg/ha.js create mode 100644 static/js/dist/msg/he.d.ts create mode 100644 static/js/dist/msg/he.js create mode 100644 static/js/dist/msg/hi.d.ts create mode 100644 static/js/dist/msg/hi.js create mode 100644 static/js/dist/msg/hrx.d.ts create mode 100644 static/js/dist/msg/hrx.js create mode 100644 static/js/dist/msg/hu.d.ts create mode 100644 static/js/dist/msg/hu.js create mode 100644 static/js/dist/msg/hy.d.ts create mode 100644 static/js/dist/msg/hy.js create mode 100644 static/js/dist/msg/ia.d.ts create mode 100644 static/js/dist/msg/ia.js create mode 100644 static/js/dist/msg/id.d.ts create mode 100644 static/js/dist/msg/id.js create mode 100644 static/js/dist/msg/ig.d.ts create mode 100644 static/js/dist/msg/ig.js create mode 100644 static/js/dist/msg/is.d.ts create mode 100644 static/js/dist/msg/is.js create mode 100644 static/js/dist/msg/it.d.ts create mode 100644 static/js/dist/msg/it.js create mode 100644 static/js/dist/msg/ja.d.ts create mode 100644 static/js/dist/msg/ja.js create mode 100644 static/js/dist/msg/kab.d.ts create mode 100644 static/js/dist/msg/kab.js create mode 100644 static/js/dist/msg/kn.d.ts create mode 100644 static/js/dist/msg/kn.js create mode 100644 static/js/dist/msg/ko.d.ts create mode 100644 static/js/dist/msg/ko.js create mode 100644 static/js/dist/msg/lb.d.ts create mode 100644 static/js/dist/msg/lb.js create mode 100644 static/js/dist/msg/lki.d.ts create mode 100644 static/js/dist/msg/lki.js create mode 100644 static/js/dist/msg/lo.d.ts create mode 100644 static/js/dist/msg/lo.js create mode 100644 static/js/dist/msg/lrc.d.ts create mode 100644 static/js/dist/msg/lrc.js create mode 100644 static/js/dist/msg/lt.d.ts create mode 100644 static/js/dist/msg/lt.js create mode 100644 static/js/dist/msg/lv.d.ts create mode 100644 static/js/dist/msg/lv.js create mode 100644 static/js/dist/msg/mk.d.ts create mode 100644 static/js/dist/msg/mk.js create mode 100644 static/js/dist/msg/mnw.d.ts create mode 100644 static/js/dist/msg/mnw.js create mode 100644 static/js/dist/msg/ms.d.ts create mode 100644 static/js/dist/msg/ms.js create mode 100644 static/js/dist/msg/msg.d.ts create mode 100644 static/js/dist/msg/nb.d.ts create mode 100644 static/js/dist/msg/nb.js create mode 100644 static/js/dist/msg/nl.d.ts create mode 100644 static/js/dist/msg/nl.js create mode 100644 static/js/dist/msg/oc.d.ts create mode 100644 static/js/dist/msg/oc.js create mode 100644 static/js/dist/msg/pl.d.ts create mode 100644 static/js/dist/msg/pl.js create mode 100644 static/js/dist/msg/pms.d.ts create mode 100644 static/js/dist/msg/pms.js create mode 100644 static/js/dist/msg/pt-br.d.ts create mode 100644 static/js/dist/msg/pt-br.js create mode 100644 static/js/dist/msg/pt.d.ts create mode 100644 static/js/dist/msg/pt.js create mode 100644 static/js/dist/msg/qqq.d.ts create mode 100644 static/js/dist/msg/ro.d.ts create mode 100644 static/js/dist/msg/ro.js create mode 100644 static/js/dist/msg/ru.d.ts create mode 100644 static/js/dist/msg/ru.js create mode 100644 static/js/dist/msg/sc.d.ts create mode 100644 static/js/dist/msg/sc.js create mode 100644 static/js/dist/msg/sd.d.ts create mode 100644 static/js/dist/msg/sd.js create mode 100644 static/js/dist/msg/shn.d.ts create mode 100644 static/js/dist/msg/shn.js create mode 100644 static/js/dist/msg/sk.d.ts create mode 100644 static/js/dist/msg/sk.js create mode 100644 static/js/dist/msg/skr-arab.d.ts create mode 100644 static/js/dist/msg/skr-arab.js create mode 100644 static/js/dist/msg/sl.d.ts create mode 100644 static/js/dist/msg/sl.js create mode 100644 static/js/dist/msg/sq.d.ts create mode 100644 static/js/dist/msg/sq.js create mode 100644 static/js/dist/msg/sr-latn.d.ts create mode 100644 static/js/dist/msg/sr-latn.js create mode 100644 static/js/dist/msg/sr.d.ts create mode 100644 static/js/dist/msg/sr.js create mode 100644 static/js/dist/msg/sv.d.ts create mode 100644 static/js/dist/msg/sv.js create mode 100644 static/js/dist/msg/synonyms.d.ts create mode 100644 static/js/dist/msg/ta.d.ts create mode 100644 static/js/dist/msg/ta.js create mode 100644 static/js/dist/msg/tcy.d.ts create mode 100644 static/js/dist/msg/tcy.js create mode 100644 static/js/dist/msg/te.d.ts create mode 100644 static/js/dist/msg/te.js create mode 100644 static/js/dist/msg/th.d.ts create mode 100644 static/js/dist/msg/th.js create mode 100644 static/js/dist/msg/tl.d.ts create mode 100644 static/js/dist/msg/tl.js create mode 100644 static/js/dist/msg/tlh.d.ts create mode 100644 static/js/dist/msg/tlh.js create mode 100644 static/js/dist/msg/tr.d.ts create mode 100644 static/js/dist/msg/tr.js create mode 100644 static/js/dist/msg/ug-arab.d.ts create mode 100644 static/js/dist/msg/ug-arab.js create mode 100644 static/js/dist/msg/uk.d.ts create mode 100644 static/js/dist/msg/uk.js create mode 100644 static/js/dist/msg/ur.d.ts create mode 100644 static/js/dist/msg/ur.js create mode 100644 static/js/dist/msg/vi.d.ts create mode 100644 static/js/dist/msg/vi.js create mode 100644 static/js/dist/msg/xmf.d.ts create mode 100644 static/js/dist/msg/xmf.js create mode 100644 static/js/dist/msg/yo.d.ts create mode 100644 static/js/dist/msg/yo.js create mode 100644 static/js/dist/msg/zgh.d.ts create mode 100644 static/js/dist/msg/zh-hans.d.ts create mode 100644 static/js/dist/msg/zh-hans.js create mode 100644 static/js/dist/msg/zh-hant.d.ts create mode 100644 static/js/dist/msg/zh-hant.js create mode 100644 static/js/dist/node.js create mode 100644 static/js/dist/package.json create mode 100644 static/js/dist/php.d.ts create mode 100644 static/js/dist/php.js create mode 100644 static/js/dist/php_compressed.js create mode 100644 static/js/dist/php_compressed.js.map create mode 100644 static/js/dist/python.d.ts create mode 100644 static/js/dist/python.js create mode 100644 static/js/dist/python_compressed.js create mode 100644 static/js/dist/python_compressed.js.map create mode 100644 static/js/externs/block-externs.js create mode 100644 static/js/externs/generator-externs.js create mode 100644 static/js/externs/goog-externs.js create mode 100644 static/js/externs/svg-externs.js create mode 100644 static/js/generators/dart.js create mode 100644 static/js/generators/dart/colour.js create mode 100644 static/js/generators/dart/lists.js create mode 100644 static/js/generators/dart/logic.js create mode 100644 static/js/generators/dart/loops.js create mode 100644 static/js/generators/dart/math.js create mode 100644 static/js/generators/dart/procedures.js create mode 100644 static/js/generators/dart/text.js create mode 100644 static/js/generators/dart/variables.js create mode 100644 static/js/generators/dart/variables_dynamic.js create mode 100644 static/js/generators/javascript.js create mode 100644 static/js/generators/javascript/colour.js create mode 100644 static/js/generators/javascript/lists.js create mode 100644 static/js/generators/javascript/logic.js create mode 100644 static/js/generators/javascript/loops.js create mode 100644 static/js/generators/javascript/math.js create mode 100644 static/js/generators/javascript/procedures.js create mode 100644 static/js/generators/javascript/text.js create mode 100644 static/js/generators/javascript/variables.js create mode 100644 static/js/generators/javascript/variables_dynamic.js create mode 100644 static/js/generators/lua.js create mode 100644 static/js/generators/lua/colour.js create mode 100644 static/js/generators/lua/lists.js create mode 100644 static/js/generators/lua/logic.js create mode 100644 static/js/generators/lua/loops.js create mode 100644 static/js/generators/lua/math.js create mode 100644 static/js/generators/lua/procedures.js create mode 100644 static/js/generators/lua/text.js create mode 100644 static/js/generators/lua/variables.js create mode 100644 static/js/generators/lua/variables_dynamic.js create mode 100644 static/js/generators/php.js create mode 100644 static/js/generators/php/colour.js create mode 100644 static/js/generators/php/lists.js create mode 100644 static/js/generators/php/logic.js create mode 100644 static/js/generators/php/loops.js create mode 100644 static/js/generators/php/math.js create mode 100644 static/js/generators/php/procedures.js create mode 100644 static/js/generators/php/text.js create mode 100644 static/js/generators/php/variables.js create mode 100644 static/js/generators/php/variables_dynamic.js create mode 100644 static/js/generators/python.js create mode 100644 static/js/generators/python/colour.js create mode 100644 static/js/generators/python/lists.js create mode 100644 static/js/generators/python/logic.js create mode 100644 static/js/generators/python/loops.js create mode 100644 static/js/generators/python/math.js create mode 100644 static/js/generators/python/procedures.js create mode 100644 static/js/generators/python/text.js create mode 100644 static/js/generators/python/variables.js create mode 100644 static/js/generators/python/variables_dynamic.js create mode 100644 static/js/gulpfile.js create mode 100644 static/js/javascript_compressed.js create mode 100644 static/js/media/1x1.gif create mode 100644 static/js/media/click.mp3 create mode 100644 static/js/media/click.ogg create mode 100644 static/js/media/click.wav create mode 100644 static/js/media/delete.mp3 create mode 100644 static/js/media/delete.ogg create mode 100644 static/js/media/delete.wav create mode 100644 static/js/media/disconnect.mp3 create mode 100644 static/js/media/disconnect.ogg create mode 100644 static/js/media/disconnect.wav create mode 100644 static/js/media/dropdown-arrow.svg create mode 100644 static/js/media/handclosed.cur create mode 100644 static/js/media/handdelete.cur create mode 100644 static/js/media/handopen.cur create mode 100644 static/js/media/pilcrow.png create mode 100644 static/js/media/quote0.png create mode 100644 static/js/media/quote1.png create mode 100644 static/js/media/sprites.png create mode 100644 static/js/media/sprites.svg create mode 100644 static/js/msg/js/ab.js create mode 100644 static/js/msg/js/ar.js create mode 100644 static/js/msg/js/az.js create mode 100644 static/js/msg/js/ba.js create mode 100644 static/js/msg/js/bcc.js create mode 100644 static/js/msg/js/be-tarask.js create mode 100644 static/js/msg/js/be.js create mode 100644 static/js/msg/js/bg.js create mode 100644 static/js/msg/js/bn.js create mode 100644 static/js/msg/js/br.js create mode 100644 static/js/msg/js/ca.js create mode 100644 static/js/msg/js/cs.js create mode 100644 static/js/msg/js/da.js create mode 100644 static/js/msg/js/de.js create mode 100644 static/js/msg/js/diq.js create mode 100644 static/js/msg/js/dty.js create mode 100644 static/js/msg/js/ee.js create mode 100644 static/js/msg/js/el.js create mode 100644 static/js/msg/js/en-gb.js create mode 100644 static/js/msg/js/en.js create mode 100644 static/js/msg/js/eo.js create mode 100644 static/js/msg/js/es.js create mode 100644 static/js/msg/js/et.js create mode 100644 static/js/msg/js/eu.js create mode 100644 static/js/msg/js/fa.js create mode 100644 static/js/msg/js/fi.js create mode 100644 static/js/msg/js/fr.js create mode 100644 static/js/msg/js/gl.js create mode 100644 static/js/msg/js/gor.js create mode 100644 static/js/msg/js/ha.js create mode 100644 static/js/msg/js/he.js create mode 100644 static/js/msg/js/hi.js create mode 100644 static/js/msg/js/hrx.js create mode 100644 static/js/msg/js/hu.js create mode 100644 static/js/msg/js/hy.js create mode 100644 static/js/msg/js/ia.js create mode 100644 static/js/msg/js/id.js create mode 100644 static/js/msg/js/ig.js create mode 100644 static/js/msg/js/is.js create mode 100644 static/js/msg/js/it.js create mode 100644 static/js/msg/js/ja.js create mode 100644 static/js/msg/js/kab.js create mode 100644 static/js/msg/js/kn.js create mode 100644 static/js/msg/js/ko.js create mode 100644 static/js/msg/js/lb.js create mode 100644 static/js/msg/js/lki.js create mode 100644 static/js/msg/js/lo.js create mode 100644 static/js/msg/js/lrc.js create mode 100644 static/js/msg/js/lt.js create mode 100644 static/js/msg/js/lv.js create mode 100644 static/js/msg/js/mk.js create mode 100644 static/js/msg/js/mnw.js create mode 100644 static/js/msg/js/ms.js create mode 100644 static/js/msg/js/nb.js create mode 100644 static/js/msg/js/nl.js create mode 100644 static/js/msg/js/oc.js create mode 100644 static/js/msg/js/pl.js create mode 100644 static/js/msg/js/pms.js create mode 100644 static/js/msg/js/pt-br.js create mode 100644 static/js/msg/js/pt.js create mode 100644 static/js/msg/js/ro.js create mode 100644 static/js/msg/js/ru.js create mode 100644 static/js/msg/js/sc.js create mode 100644 static/js/msg/js/sd.js create mode 100644 static/js/msg/js/shn.js create mode 100644 static/js/msg/js/sk.js create mode 100644 static/js/msg/js/skr-arab.js create mode 100644 static/js/msg/js/sl.js create mode 100644 static/js/msg/js/sq.js create mode 100644 static/js/msg/js/sr-latn.js create mode 100644 static/js/msg/js/sr.js create mode 100644 static/js/msg/js/sv.js create mode 100644 static/js/msg/js/ta.js create mode 100644 static/js/msg/js/tcy.js create mode 100644 static/js/msg/js/te.js create mode 100644 static/js/msg/js/th.js create mode 100644 static/js/msg/js/tl.js create mode 100644 static/js/msg/js/tlh.js create mode 100644 static/js/msg/js/tr.js create mode 100644 static/js/msg/js/ug-arab.js create mode 100644 static/js/msg/js/uk.js create mode 100644 static/js/msg/js/ur.js create mode 100644 static/js/msg/js/vi.js create mode 100644 static/js/msg/js/xmf.js create mode 100644 static/js/msg/js/yo.js create mode 100644 static/js/msg/js/zh-hans.js create mode 100644 static/js/msg/js/zh-hant.js create mode 100644 static/js/msg/json/ab.json create mode 100644 static/js/msg/json/ar.json create mode 100644 static/js/msg/json/az.json create mode 100644 static/js/msg/json/ba.json create mode 100644 static/js/msg/json/bcc.json create mode 100644 static/js/msg/json/be-tarask.json create mode 100644 static/js/msg/json/be.json create mode 100644 static/js/msg/json/bg.json create mode 100644 static/js/msg/json/bn.json create mode 100644 static/js/msg/json/br.json create mode 100644 static/js/msg/json/ca.json create mode 100644 static/js/msg/json/constants.json create mode 100644 static/js/msg/json/cs.json create mode 100644 static/js/msg/json/da.json create mode 100644 static/js/msg/json/de.json create mode 100644 static/js/msg/json/diq.json create mode 100644 static/js/msg/json/dty.json create mode 100644 static/js/msg/json/ee.json create mode 100644 static/js/msg/json/el.json create mode 100644 static/js/msg/json/en-gb.json create mode 100644 static/js/msg/json/en.json create mode 100644 static/js/msg/json/eo.json create mode 100644 static/js/msg/json/es.json create mode 100644 static/js/msg/json/et.json create mode 100644 static/js/msg/json/eu.json create mode 100644 static/js/msg/json/fa.json create mode 100644 static/js/msg/json/fi.json create mode 100644 static/js/msg/json/fr.json create mode 100644 static/js/msg/json/gl.json create mode 100644 static/js/msg/json/gor.json create mode 100644 static/js/msg/json/ha.json create mode 100644 static/js/msg/json/he.json create mode 100644 static/js/msg/json/hi.json create mode 100644 static/js/msg/json/hrx.json create mode 100644 static/js/msg/json/hu.json create mode 100644 static/js/msg/json/hy.json create mode 100644 static/js/msg/json/ia.json create mode 100644 static/js/msg/json/id.json create mode 100644 static/js/msg/json/ig.json create mode 100644 static/js/msg/json/is.json create mode 100644 static/js/msg/json/it.json create mode 100644 static/js/msg/json/ja.json create mode 100644 static/js/msg/json/kab.json create mode 100644 static/js/msg/json/kn.json create mode 100644 static/js/msg/json/ko.json create mode 100644 static/js/msg/json/lb.json create mode 100644 static/js/msg/json/lki.json create mode 100644 static/js/msg/json/lo.json create mode 100644 static/js/msg/json/lrc.json create mode 100644 static/js/msg/json/lt.json create mode 100644 static/js/msg/json/lv.json create mode 100644 static/js/msg/json/mk.json create mode 100644 static/js/msg/json/mnw.json create mode 100644 static/js/msg/json/ms.json create mode 100644 static/js/msg/json/nb.json create mode 100644 static/js/msg/json/nl.json create mode 100644 static/js/msg/json/oc.json create mode 100644 static/js/msg/json/pl.json create mode 100644 static/js/msg/json/pms.json create mode 100644 static/js/msg/json/pt-br.json create mode 100644 static/js/msg/json/pt.json create mode 100644 static/js/msg/json/qqq.json create mode 100644 static/js/msg/json/ro.json create mode 100644 static/js/msg/json/ru.json create mode 100644 static/js/msg/json/sc.json create mode 100644 static/js/msg/json/sd.json create mode 100644 static/js/msg/json/shn.json create mode 100644 static/js/msg/json/sk.json create mode 100644 static/js/msg/json/skr-arab.json create mode 100644 static/js/msg/json/sl.json create mode 100644 static/js/msg/json/sq.json create mode 100644 static/js/msg/json/sr-latn.json create mode 100644 static/js/msg/json/sr.json create mode 100644 static/js/msg/json/sv.json create mode 100644 static/js/msg/json/synonyms.json create mode 100644 static/js/msg/json/ta.json create mode 100644 static/js/msg/json/tcy.json create mode 100644 static/js/msg/json/te.json create mode 100644 static/js/msg/json/th.json create mode 100644 static/js/msg/json/tl.json create mode 100644 static/js/msg/json/tlh.json create mode 100644 static/js/msg/json/tr.json create mode 100644 static/js/msg/json/ug-arab.json create mode 100644 static/js/msg/json/uk.json create mode 100644 static/js/msg/json/ur.json create mode 100644 static/js/msg/json/vi.json create mode 100644 static/js/msg/json/xmf.json create mode 100644 static/js/msg/json/yo.json create mode 100644 static/js/msg/json/zgh.json create mode 100644 static/js/msg/json/zh-hans.json create mode 100644 static/js/msg/json/zh-hant.json create mode 100644 static/js/msg/messages.js create mode 100644 static/js/navigation.js create mode 100644 static/js/package-lock.json create mode 100644 static/js/package.json create mode 100644 static/js/python_ML.js create mode 100644 static/js/python_compressed.js create mode 100644 static/js/screenshot.js create mode 100644 static/js/scripts/gulpfiles/build_tasks.js create mode 100644 static/js/scripts/gulpfiles/git_tasks.js create mode 100644 static/js/scripts/gulpfiles/license_tasks.js create mode 100644 static/js/scripts/gulpfiles/package_tasks.js create mode 100644 static/js/scripts/gulpfiles/typings.js create mode 100644 static/js/scripts/package/README.md create mode 100644 static/js/scripts/package/blockly.js create mode 100644 static/js/scripts/package/blocks.js create mode 100644 static/js/scripts/package/browser/core.js create mode 100644 static/js/scripts/package/browser/index.js create mode 100644 static/js/scripts/package/dart.js create mode 100644 static/js/scripts/package/index.js create mode 100644 static/js/scripts/package/javascript.js create mode 100644 static/js/scripts/package/lua.js create mode 100644 static/js/scripts/package/node/core.js create mode 100644 static/js/scripts/package/node/index.js create mode 100644 static/js/scripts/package/php.js create mode 100644 static/js/scripts/package/python.js create mode 100644 static/js/scripts/package/templates/node.template create mode 100644 static/js/scripts/package/templates/umd.template create mode 100644 static/js/tests/compile/compile.sh create mode 100644 static/js/tests/compile/index.html create mode 100644 static/js/tests/compile/main.js create mode 100644 static/js/tests/media/200px.png create mode 100644 static/js/tests/media/30px.png create mode 100644 static/js/tests/media/50px.png create mode 100644 static/js/tests/media/a.png create mode 100644 static/js/tests/media/arrow.png create mode 100644 static/js/tests/media/b.png create mode 100644 static/js/tests/media/c.png create mode 100644 static/js/tests/media/d.png create mode 100644 static/js/tests/media/e.png create mode 100644 static/js/tests/media/f.png create mode 100644 static/js/tests/media/g.png create mode 100644 static/js/tests/media/h.png create mode 100644 static/js/tests/media/i.png create mode 100644 static/js/tests/media/j.png create mode 100644 static/js/tests/media/k.png create mode 100644 static/js/tests/media/l.png create mode 100644 static/js/tests/media/m.png create mode 100644 static/js/tests/mocha/.eslintrc.json create mode 100644 static/js/tests/mocha/.mocharc.js create mode 100644 static/js/tests/mocha/astnode_test.js create mode 100644 static/js/tests/mocha/block_test.js create mode 100644 static/js/tests/mocha/comment_test.js create mode 100644 static/js/tests/mocha/connection_checker_test.js create mode 100644 static/js/tests/mocha/connection_db_test.js create mode 100644 static/js/tests/mocha/connection_test.js create mode 100644 static/js/tests/mocha/contextmenu_items_test.js create mode 100644 static/js/tests/mocha/cursor_test.js create mode 100644 static/js/tests/mocha/dropdowndiv_test.js create mode 100644 static/js/tests/mocha/event_test.js create mode 100644 static/js/tests/mocha/extensions_test.js create mode 100644 static/js/tests/mocha/field_angle_test.js create mode 100644 static/js/tests/mocha/field_checkbox_test.js create mode 100644 static/js/tests/mocha/field_colour_test.js create mode 100644 static/js/tests/mocha/field_dropdown_test.js create mode 100644 static/js/tests/mocha/field_image_test.js create mode 100644 static/js/tests/mocha/field_label_serializable_test.js create mode 100644 static/js/tests/mocha/field_label_test.js create mode 100644 static/js/tests/mocha/field_multilineinput_test.js create mode 100644 static/js/tests/mocha/field_number_test.js create mode 100644 static/js/tests/mocha/field_registry_test.js create mode 100644 static/js/tests/mocha/field_test.js create mode 100644 static/js/tests/mocha/field_textinput_test.js create mode 100644 static/js/tests/mocha/field_variable_test.js create mode 100644 static/js/tests/mocha/flyout_test.js create mode 100644 static/js/tests/mocha/generator_test.js create mode 100644 static/js/tests/mocha/gesture_test.js create mode 100644 static/js/tests/mocha/index.html create mode 100644 static/js/tests/mocha/input_test.js create mode 100644 static/js/tests/mocha/insertion_marker_test.js create mode 100644 static/js/tests/mocha/json_test.js create mode 100644 static/js/tests/mocha/keydown_test.js create mode 100644 static/js/tests/mocha/logic_ternary_test.js create mode 100644 static/js/tests/mocha/metrics_test.js create mode 100644 static/js/tests/mocha/names_test.js create mode 100644 static/js/tests/mocha/navigation_modify_test.js create mode 100644 static/js/tests/mocha/navigation_test.js create mode 100644 static/js/tests/mocha/procedures_test.js create mode 100644 static/js/tests/mocha/procedures_test_helpers.js create mode 100644 static/js/tests/mocha/registry_test.js create mode 100644 static/js/tests/mocha/run_mocha_tests_in_browser.js create mode 100644 static/js/tests/mocha/shortcut_registry_test.js create mode 100644 static/js/tests/mocha/test_helpers.js create mode 100644 static/js/tests/mocha/theme_test.js create mode 100644 static/js/tests/mocha/toolbox_helper.js create mode 100644 static/js/tests/mocha/toolbox_test.js create mode 100644 static/js/tests/mocha/tooltip_test.js create mode 100644 static/js/tests/mocha/trashcan_test.js create mode 100644 static/js/tests/mocha/utils_test.js create mode 100644 static/js/tests/mocha/variable_map_test.js create mode 100644 static/js/tests/mocha/variable_model_test.js create mode 100644 static/js/tests/mocha/variables_test.js create mode 100644 static/js/tests/mocha/widget_div_test.js create mode 100644 static/js/tests/mocha/workspace_comment_test.js create mode 100644 static/js/tests/mocha/workspace_svg_test.js create mode 100644 static/js/tests/mocha/workspace_test.js create mode 100644 static/js/tests/mocha/xml_test.js create mode 100644 static/js/tests/mocha/zoom_controls_test.js create mode 100644 static/js/tests/msg/ar.js create mode 100644 static/js/tests/msg/be-tarask.js create mode 100644 static/js/tests/msg/br.js create mode 100644 static/js/tests/msg/ca.js create mode 100644 static/js/tests/msg/cs.js create mode 100644 static/js/tests/msg/da.js create mode 100644 static/js/tests/msg/de.js create mode 100644 static/js/tests/msg/el.js create mode 100644 static/js/tests/msg/en.js create mode 100644 static/js/tests/msg/es.js create mode 100644 static/js/tests/msg/et.js create mode 100644 static/js/tests/msg/fa.js create mode 100644 static/js/tests/msg/fr.js create mode 100644 static/js/tests/msg/he.js create mode 100644 static/js/tests/msg/hrx.js create mode 100644 static/js/tests/msg/hu.js create mode 100644 static/js/tests/msg/ia.js create mode 100644 static/js/tests/msg/is.js create mode 100644 static/js/tests/msg/it.js create mode 100644 static/js/tests/msg/ja.js create mode 100644 static/js/tests/msg/kab.js create mode 100644 static/js/tests/msg/ko.js create mode 100644 static/js/tests/msg/mk.js create mode 100644 static/js/tests/msg/ms.js create mode 100644 static/js/tests/msg/nb.js create mode 100644 static/js/tests/msg/nl.js create mode 100644 static/js/tests/msg/oc.js create mode 100644 static/js/tests/msg/pl.js create mode 100644 static/js/tests/msg/pms.js create mode 100644 static/js/tests/msg/pt-br.js create mode 100644 static/js/tests/msg/ro.js create mode 100644 static/js/tests/msg/ru.js create mode 100644 static/js/tests/msg/sc.js create mode 100644 static/js/tests/msg/sk.js create mode 100644 static/js/tests/msg/sr.js create mode 100644 static/js/tests/msg/sv.js create mode 100644 static/js/tests/msg/ta.js create mode 100644 static/js/tests/msg/th.js create mode 100644 static/js/tests/msg/tlh.js create mode 100644 static/js/tests/msg/tr.js create mode 100644 static/js/tests/msg/uk.js create mode 100644 static/js/tests/msg/vi.js create mode 100644 static/js/tests/msg/zh-hans.js create mode 100644 static/js/tests/msg/zh-hant.js create mode 100644 static/js/tests/multi_playground.html create mode 100644 static/js/tests/node/.eslintrc.json create mode 100644 static/js/tests/node/.mocharc.js create mode 100644 static/js/tests/node/run_node_test.js create mode 100644 static/js/tests/playground.html create mode 100644 static/js/tests/playgrounds/advanced_playground.html create mode 100644 static/js/tests/playgrounds/iframe.html create mode 100644 static/js/tests/playgrounds/screenshot.js create mode 100644 static/js/tests/rendering/svg_paths.html create mode 100644 static/js/tests/rendering/zelos/README.md create mode 100644 static/js/tests/rendering/zelos/index.html create mode 100644 static/js/tests/rendering/zelos/pxtblockly.html create mode 100644 static/js/tests/rendering/zelos/pxtblockly/index.html create mode 100644 static/js/tests/rendering/zelos/pxtblockly/pxtblockly.html create mode 100644 static/js/tests/rendering/zelos/pxtblockly/zelos.html create mode 100644 static/js/tests/rendering/zelos/scratchblocks/index.html create mode 100644 static/js/tests/rendering/zelos/scratchblocks/scratchblocks.html create mode 100644 static/js/tests/rendering/zelos/scratchblocks/zelos.html create mode 100644 static/js/tests/rendering/zelos/zelos.html create mode 100644 static/js/tests/run_all_tests.sh create mode 100644 static/js/tests/scripts/check_metadata.sh create mode 100644 static/js/tests/scripts/compile_typings.sh create mode 100644 static/js/tests/scripts/run_generators.sh create mode 100644 static/js/tests/scripts/selenium-config.js create mode 100644 static/js/tests/scripts/setup_linux_env.sh create mode 100644 static/js/tests/scripts/setup_osx_env.sh create mode 100644 static/js/tests/themes/test_themes.js create mode 100644 static/js/tests/xml/README.txt create mode 100644 static/js/tests/xml/blockly.xsd create mode 100644 static/js/tests/xml/invalid.xml create mode 100644 static/js/tests/xml/toolbox.xml create mode 100644 static/js/typings/README.md create mode 100644 static/js/typings/blockly.d.ts create mode 100644 static/js/typings/blocks.d.ts create mode 100644 static/js/typings/core.d.ts create mode 100644 static/js/typings/dart.d.ts create mode 100644 static/js/typings/index.d.ts create mode 100644 static/js/typings/javascript.d.ts create mode 100644 static/js/typings/lua.d.ts create mode 100644 static/js/typings/msg/ab.d.ts create mode 100644 static/js/typings/msg/ar.d.ts create mode 100644 static/js/typings/msg/az.d.ts create mode 100644 static/js/typings/msg/ba.d.ts create mode 100644 static/js/typings/msg/bcc.d.ts create mode 100644 static/js/typings/msg/be-tarask.d.ts create mode 100644 static/js/typings/msg/be.d.ts create mode 100644 static/js/typings/msg/bg.d.ts create mode 100644 static/js/typings/msg/bn.d.ts create mode 100644 static/js/typings/msg/br.d.ts create mode 100644 static/js/typings/msg/ca.d.ts create mode 100644 static/js/typings/msg/constants.d.ts create mode 100644 static/js/typings/msg/cs.d.ts create mode 100644 static/js/typings/msg/da.d.ts create mode 100644 static/js/typings/msg/de.d.ts create mode 100644 static/js/typings/msg/diq.d.ts create mode 100644 static/js/typings/msg/dty.d.ts create mode 100644 static/js/typings/msg/ee.d.ts create mode 100644 static/js/typings/msg/el.d.ts create mode 100644 static/js/typings/msg/en-gb.d.ts create mode 100644 static/js/typings/msg/en.d.ts create mode 100644 static/js/typings/msg/eo.d.ts create mode 100644 static/js/typings/msg/es.d.ts create mode 100644 static/js/typings/msg/et.d.ts create mode 100644 static/js/typings/msg/eu.d.ts create mode 100644 static/js/typings/msg/fa.d.ts create mode 100644 static/js/typings/msg/fi.d.ts create mode 100644 static/js/typings/msg/fr.d.ts create mode 100644 static/js/typings/msg/gl.d.ts create mode 100644 static/js/typings/msg/gor.d.ts create mode 100644 static/js/typings/msg/ha.d.ts create mode 100644 static/js/typings/msg/he.d.ts create mode 100644 static/js/typings/msg/hi.d.ts create mode 100644 static/js/typings/msg/hrx.d.ts create mode 100644 static/js/typings/msg/hu.d.ts create mode 100644 static/js/typings/msg/hy.d.ts create mode 100644 static/js/typings/msg/ia.d.ts create mode 100644 static/js/typings/msg/id.d.ts create mode 100644 static/js/typings/msg/ig.d.ts create mode 100644 static/js/typings/msg/is.d.ts create mode 100644 static/js/typings/msg/it.d.ts create mode 100644 static/js/typings/msg/ja.d.ts create mode 100644 static/js/typings/msg/kab.d.ts create mode 100644 static/js/typings/msg/kn.d.ts create mode 100644 static/js/typings/msg/ko.d.ts create mode 100644 static/js/typings/msg/lb.d.ts create mode 100644 static/js/typings/msg/lki.d.ts create mode 100644 static/js/typings/msg/lo.d.ts create mode 100644 static/js/typings/msg/lrc.d.ts create mode 100644 static/js/typings/msg/lt.d.ts create mode 100644 static/js/typings/msg/lv.d.ts create mode 100644 static/js/typings/msg/mk.d.ts create mode 100644 static/js/typings/msg/mnw.d.ts create mode 100644 static/js/typings/msg/ms.d.ts create mode 100644 static/js/typings/msg/msg.d.ts create mode 100644 static/js/typings/msg/nb.d.ts create mode 100644 static/js/typings/msg/nl.d.ts create mode 100644 static/js/typings/msg/oc.d.ts create mode 100644 static/js/typings/msg/pl.d.ts create mode 100644 static/js/typings/msg/pms.d.ts create mode 100644 static/js/typings/msg/pt-br.d.ts create mode 100644 static/js/typings/msg/pt.d.ts create mode 100644 static/js/typings/msg/qqq.d.ts create mode 100644 static/js/typings/msg/ro.d.ts create mode 100644 static/js/typings/msg/ru.d.ts create mode 100644 static/js/typings/msg/sc.d.ts create mode 100644 static/js/typings/msg/sd.d.ts create mode 100644 static/js/typings/msg/shn.d.ts create mode 100644 static/js/typings/msg/sk.d.ts create mode 100644 static/js/typings/msg/skr-arab.d.ts create mode 100644 static/js/typings/msg/sl.d.ts create mode 100644 static/js/typings/msg/sq.d.ts create mode 100644 static/js/typings/msg/sr-latn.d.ts create mode 100644 static/js/typings/msg/sr.d.ts create mode 100644 static/js/typings/msg/sv.d.ts create mode 100644 static/js/typings/msg/synonyms.d.ts create mode 100644 static/js/typings/msg/ta.d.ts create mode 100644 static/js/typings/msg/tcy.d.ts create mode 100644 static/js/typings/msg/te.d.ts create mode 100644 static/js/typings/msg/th.d.ts create mode 100644 static/js/typings/msg/tl.d.ts create mode 100644 static/js/typings/msg/tlh.d.ts create mode 100644 static/js/typings/msg/tr.d.ts create mode 100644 static/js/typings/msg/ug-arab.d.ts create mode 100644 static/js/typings/msg/uk.d.ts create mode 100644 static/js/typings/msg/ur.d.ts create mode 100644 static/js/typings/msg/vi.d.ts create mode 100644 static/js/typings/msg/xmf.d.ts create mode 100644 static/js/typings/msg/yo.d.ts create mode 100644 static/js/typings/msg/zgh.d.ts create mode 100644 static/js/typings/msg/zh-hans.d.ts create mode 100644 static/js/typings/msg/zh-hant.d.ts create mode 100644 static/js/typings/php.d.ts create mode 100644 static/js/typings/python.d.ts create mode 100644 static/js/typings/templates/blockly-header.template create mode 100644 static/js/typings/templates/blockly-interfaces.template create mode 100644 static/js/typings/templates/msg.template create mode 100644 static/js/typings/tsconfig.json create mode 100644 static/media/1x1.gif create mode 100644 static/media/click.mp3 create mode 100644 static/media/click.ogg create mode 100644 static/media/click.wav create mode 100644 static/media/colab_favicon.ico create mode 100644 static/media/copy.png create mode 100644 static/media/delete.mp3 create mode 100644 static/media/delete.ogg create mode 100644 static/media/delete.wav create mode 100644 static/media/disconnect.mp3 create mode 100644 static/media/disconnect.ogg create mode 100644 static/media/disconnect.wav create mode 100644 static/media/download.png create mode 100644 static/media/dropdown-arrow.svg create mode 100644 static/media/handclosed.cur create mode 100644 static/media/handdelete.cur create mode 100644 static/media/handopen.cur create mode 100644 static/media/pilcrow.png create mode 100644 static/media/quote0.png create mode 100644 static/media/quote1.png create mode 100644 static/media/regression_analysis.svg create mode 100644 static/media/sprites.png create mode 100644 static/media/sprites.svg create mode 100644 static/media/upload.png create mode 100644 templates/index.html create mode 100644 templates/reportViewer.html create mode 100644 templates/tableviewer.html create mode 100644 vercel.json diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..03aea39 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '15 14 * * 6' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript', 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml new file mode 100644 index 0000000..5b83468 --- /dev/null +++ b/.github/workflows/greetings.yml @@ -0,0 +1,16 @@ +name: Greetings + +on: [pull_request_target, issues] + +jobs: + greeting: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: 'Thank you for contributing to BLocklyML' + pr-message: 'Thank you for contributing to BLocklyML' diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml new file mode 100644 index 0000000..6609258 --- /dev/null +++ b/.github/workflows/pylint.yml @@ -0,0 +1,25 @@ +name: Pylint + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint + pip install -r requirements.txt + - name: Analysing the code with pylint + run: | + pylint $(ls *.py) + # not considering lib folder it contains DASH library code, the design does not align with pep8 principle diff --git a/.github/workflows/requirementsTest.yml b/.github/workflows/requirementsTest.yml new file mode 100644 index 0000000..5a04431 --- /dev/null +++ b/.github/workflows/requirementsTest.yml @@ -0,0 +1,22 @@ +name: RequirementsTest + +on: [push] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.9"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint + pip install -r requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ff8271 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.pyc +#https://intellij-support.jetbrains.com/hc/en-us/articles/206544839-How-to-manage-projects-under-Version-Control-Systems +.iws +workspace.xml +tasks.xml +.idea +.vercel diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..18c9147 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..da22312 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,27 @@ +If you find any error or need support please raise a issue. If you think you can add a feature, or help solve a bug please raise a PR +#### This repo welcomes any kind of contributions :pray: + +Feel free to adapt it criticize it and support it the way you like!! + + + +* If you'd like to make a pull request to contribute, please keep it simple. If you use some higher level techniques I don't understand, I'm not going to approve it because I won't be able to maintain it. + +* Please don't make a pull request with a bunch of changes in syntax just for the sake of 'best practices' (ex: changing "if blah == False" to "if not blah"). Unless something makes a difference to performance frankly I don't care. + +* Avoid adding new non-standard libraries if at all possible. If you have an idea that would require one, please suggest it as an issue first instead of going through all the work and submitting a pull request. + +* MAKE SURE IT RUNS + + +## RoadMap + + - [x] Classification Algorithms + - [x] Regression Algorithms + - [x] Appropriate Color Coding + - [x] Support for Pycaret + - [ ] Support for Deep Learning (ANN) + - [ ] Support for Image Dataset + - [ ] Support for CNN + - [ ] Support for Running Code in Heroku + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3ddc01e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM ubuntu:20.04 +LABEL maintainer="Adarsh Chekodu " +RUN apt-get update -y && \ + apt-get install -y python3-pip +COPY ./requirements.txt /app/requirements.txt +WORKDIR /app +RUN python3 -m pip install -r requirements.txt +COPY . /app +CMD ["python3", "./app.py" ] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + 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/Procfile b/Procfile new file mode 100644 index 0000000..362d8e0 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn --bind 0.0.0.0:$PORT app:app \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a50911 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +

+ + + +

+

+Blockly ML +

+

+ + + + +

+ + +BlocklyML is a **No Code** training ground for python and Machine Learning. This tool is designed to simplify standard machine learning implementation. +This tool can assist anyone who wants to start with Machine Learning or python. This is a forked project from [Blockly](https://github.com/google/blockly) and adapted for machine learning and Data analytics use-cases. :brain: + +For a sample run go to sampleLayouts folder upload and try it out :smiley: + + +Read the ![UserGuide.md](https://github.com/chekoduadarsh/BlocklyML/blob/main/UserGuide.md) for further info + + +In the Example given below we will train a random forest for Iris Dataset + + +https://user-images.githubusercontent.com/26855534/174473003-488f675f-50a0-48f1-9ef0-81987bd21166.mp4 + +# Table of contents + +- [Table of contents](#table-of-contents) +- [Installing as BlocklyML App](#installing-as-blocklyml-app) + - [Flask Method](#flask-method) +- [UI Features](#ui-features) + - [Shortcuts](#shortcuts) + - [Dataframe Viewer](#dataframe-viewer) + - [Download Code](#download-code) +- [Contribute](#contribute) + - [This repo welcomes any kind of contributions :pray:](#this-repo-welcomes-any-kind-of-contributions-pray) +- [License](#license) +- [Thanks to](#thanks-to) +# Installing as BlocklyML App +First clone this repo + +```shell +git clone https://github.com/chekoduadarsh/BlocklyML +``` +After cloning the repo you can either follow the Flask Method + + +# Running the App Using Docker + +If you've cloned the project and want to build the image, follow these steps: + +1.Open your terminal and navigate to the project directory. + +2.Run the following command to build the Docker image: + +```shell +docker build . -t blocklyml/demo +``` +Once the image is built, you can launch the app by executing the following command: + +```shell +docker run -ti -p5000:5000 blockly_ml/demo +``` +This will start the app, and you'll be able to access it by opening your web browser and navigating to `http://localhost:5000` +### Flask Method + +Install the requirements from `requirements.txt` with the following command + +```shell +pip install -r requirements.txt +``` + +then you can run the application by +```shell +python app.py +``` + +Simple as that :man_shrugging: + +# UI Features + +## Shortcuts +You can find these buttons in the top right corner of the application. Their functionality as follows + +1. Download XML Layout +2. Upload XML layout +3. Copy Code +4. Launch Google Colab +5. Delete +6. Run (Not Supported Yet!!) + +drawing + +## Dataframe Viewer +Blockly support complete html view of the DataFrame. This can be accessed by view option in the navigation bar + +drawing + + +## Download Code +Blockly support both .py and .ipynb formats. You can download the code from the download option in the navigation bar + +drawing + +# Contribute + +If you find any error or need support please raise a issue. If you think you can add a feature, or help solve a bug please raise a PR + +### This repo welcomes any kind of contributions :pray: + +Feel free to adapt it criticize it and support it the way you like!! + +Read : [CONTRIBUTING.md](./CONTRIBUTING.md) + + +# License +[Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) + + +# Thanks to +[![Stargazers repo roster for @chekoduadarsh/BlocklyML](https://reporoster.com/stars/chekoduadarsh/BlocklyML)](https://github.com/chekoduadarsh/BlocklyML/stargazers) +[![Forkers repo roster for @chekoduadarsh/BlocklyML](https://reporoster.com/forks/chekoduadarsh/BlocklyML)](https://github.com/chekoduadarsh/BlocklyML/network/members) + + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/chekoduadarsh) diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..f71a890 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`chekoduadarsh/BlocklyML` +- 原始仓库:https://github.com/chekoduadarsh/BlocklyML +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/UserGuide.md b/UserGuide.md new file mode 100644 index 0000000..0eb323c --- /dev/null +++ b/UserGuide.md @@ -0,0 +1,72 @@ +# Blockly User Guide + +## What is BlocklyML? +BlocklyML is a **No Code** training ground for python and ML. This tool is designed to simplify standard machine learning implementation. +This tool can assist anyone who wants to start with ML or python. This is a forked project from [Blockly](https://github.com/google/blockly) and adapted for machine learning and Data analytics use-cases:brain:. + +Currently BlocklyML is moving from Alpha -> Beta. Please try the tool and raise ![issue](https://github.com/chekoduadarsh/BlocklyML/issues) + +## How to use BlocklyML? + +Want to Use BlocklyML? Its very simple. + +### Using Webtool + +goto : ![blocklyml.herokuapp.com](blocklyml.herokuapp.com) + +### Using Locally + +pre-requisits + +```bash + python3 + docker + pip +``` + +It is recommended to use conda/pip virtual environment before installing + +1. **Clone this repo** + +```bash +git clone https://github.com/chekoduadarsh/BlocklyML +``` + +After cloning the repo you can either follow the Flask Method + +2. **Install** + + + 1. **Flask Method** + + Install the requirements from requirements.txt with the following command + + ```bash + pip install -r requirements.txt + ``` + + then you can run the application by + + ```bash + python app.py + ``` + +Simple as that :man_shrugging: + +## How to download layouts? + + +drawing + +Use Download button form the buttons given above. which will download the `blocklyML.xml` file. This XML file contatins details regarding the layout of the project.This can be used to share or save the layout. + + +## How to upload layouts? + +drawing + +Use Upload button form the buttons given above. Which will create a popup window as given below. + +drawing + +In this pop windows you can drop/upload file or you can provide the URL of the file. This will load the laout xml file diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..c419263 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..2292d5a --- /dev/null +++ b/app.py @@ -0,0 +1,78 @@ +"""App + +This script allows connects and interacts with Flask and Dash components. + +This script requires that `flask` and 'dash' be installed within the Python +environment you are running this script in. + +This file can also be imported as a module and contains the following +functions: + + * dataframe_return - list of Dataframes from dataframe_visualizer + * root - returns the index page +""" +from flask import Flask, render_template, request +import dash_bootstrap_components as dbc +import dash +from dash import html +from libs.dataframe_visualizer import dataframe_visualizer + + +app = Flask(__name__) +app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 +app = Flask(__name__) +app.config['SECRET_KEY'] = 'secret!' +app.config['DEBUG'] = True + + +DASH_APP = dash.Dash( + routes_pathname_prefix='/visualizer/', + server=app, + external_scripts=[ + 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.52.2/codemirror.min.js', + 'custom-script.js' + ], + external_stylesheets=[ + 'https://fonts.googleapis.com/css?family=Lato', + 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css', + 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.52.2/theme/monokai.min.css', + 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.52.2/codemirror.min.css', + 'styles.css', + dbc.themes.BOOTSTRAP + ], + name='CSV Visualizer', + title='CSV Visualizer' +) + + +DASH_APP.config.suppress_callback_exceptions = True + +DASH_APP.validation_layout = html.Div() + +DASH_APP.layout = html.Div() + +@app.route('/DataVisualizer', methods=['POST', 'GET']) +def dataframe_return(): + """returns list of Dataframes from dataframe_visualizer + + Returns: + string: list of datafrmaes + """ + # pylint: disable=W0603 + global DASH_APP + list_dataframe, DASH_APP = dataframe_visualizer(request.form, DASH_APP) + return str(list_dataframe) + + +@app.route('/', methods=['POST', 'GET']) +def root(): + """renders undex.html + + Returns: + _render: rendered html + """ + return render_template('index.html') + + +if __name__ == '__main__': + app.run(host='0.0.0.0') diff --git a/assets/custom-script.js b/assets/custom-script.js new file mode 100644 index 0000000..e69de29 diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..28e894ba894b621aa8c86ffcf8d78a8f47381957 GIT binary patch literal 4286 zcmcJRTTql`7{@=d#-_9yFS=+-t*b7&>NIudblbs@G)>bSbEce{$wUxOm|Byg>3B#< zD^HDzMglHJIV>lE-ETJ(1OycEz%F|L+4@|I2@B& zTQ6x|uV-w*M)8zzb*mo3<4abnb!}Z;-FcVGRqXM2=1@;ln&@GF6jxW=7dc){HBonJ zYimJ1$P7^8V>U$}ZmqM^`=4zH*Q(nj->K9}>H>9#f=Kvox8jS3u#ZBHXHid4W2y&Z zYavbHF^OuV3@*n8-*qoP(nkULGpUIq^})EB#bOoqWGazru<813yKaMBw=3B==J_bT zm-%;kz3B3GD#@5!Kb23#QS{-~Jl@Wzd0{-Mvv8lMmQ(fAZDCbftC3cbgMB5bI8d5~ z+^V8`_)>o_Sq_&IRhMdTvaSH9>diQJr2%e_8{#YEBag>eYC^C-?)o50*wd&w;ZhKG zK~)J>d<`&Sd_CKhigo5 z(pShs*vCnFc#bmaK%Vfw6>gBNql$U2CVNK4awDdAh~w|snMth0pEzGz2Sa<`zS z_AG3zby$#uE)^RN1~fbF&41uf;y5-}90;<~m*dO4A8^@m1qDr&h9~KR`m4>OVd91&w z^0ZnLJBkk*xd}JS7EZ-QJGwi&@F2dd(UI0axCU(4UVO;Nb3gn2Z<}4Mixl%wEXn>J z(vu6b*I`Y`Zj`m?D!%MLQGC`vv>(Ym|C)c8Uuvm9Lf%%yX2kQj4QH%X+yiZ@4kfHl zzFvZ}ZS}bBYB%CPkUz@$hu5LZL!sJ(cBnP~W8pp&RhPl4Th%^M$MrA!kC*#gsJ3eF zjmkfYKm7U+^TTzJyk$Km#*0HN)I}ko29R1UlD%L!%+F(oqsp$KXQK1gRbf> zdt$ML`JcC=qoV^ppAUY&AHBUj;QL;A=whEmmO04k@G{`#>NI*Y<3_g-Gl2_{qXw+;12|F z!`F*mU%%qt8oUXS&+o%tdm7@nABn!o--Ju;ZK3^lg!zZK4Gj&d&VI)1?;pU=n>w&? z`V}OvyofDDX;@jh3(4gv*r^|bskscrtyb)@pTMVCYm9y2r^-VJ{*Mywk)h|`8o_ls zooaqnoo^1Ht+gL1TU|&!(1{hlnebs+JZ7AXN9^&X#=B4U!x_vuxF@mpx$AMxaRGh3 zeMWz<_oC`wQ&Xea?e=dZ-$-tFZspkDA7GyaaO?H}_Sc?Nd&2v_FTp!YV-c6OOfiKk za~{jRcyaCq6t!CJ>5rZs)u%o5@D>$*{b~-UQ)_E$d!?_hFP-`JMRM;SOV736aN+3r zT&ybEg~cb<;U@Y9^^@!&?INnXY%IC)MXs{y( zay}&S@g8NOhV;Q}%7?ISviC)iYm(PpR0{Pv^(YmI8*(i7h4dtkA5dA8kBZD`xUrk} z?xo(KM$En65TA|oF`d72sNsA#d0n_~Qe);0<6{Ej#!`8dp95HrB-em&po{c_$hF0FUbc-T(jq literal 0 HcmV?d00001 diff --git a/assets/style.css b/assets/style.css new file mode 100644 index 0000000..fbf0490 --- /dev/null +++ b/assets/style.css @@ -0,0 +1,33 @@ +/* colors variables settings */ +h1{ + text-align:center; + } + :root { + --bgColor: #fff; + --textDefault: #000; + --primary: #0B4CFF; + --secondary: #FF0B70; + --terciary: #00BA5B; +} + +:root[data-theme='dark'] { + --bgColor: #000; + --textDefault: #fff; + --primary: #ACC2FF; + --secondary: #FFAFD0; + --terciary: #86E1B3; +} +body { + background: var(--bgColor); + color: var(--textDefault); + } + +h2 { + text-align:center; +} + +.classNameExample { + background: var(--terciary); + border: 1px solid var(--secondary); +} + diff --git a/libs/dashboard.py b/libs/dashboard.py new file mode 100644 index 0000000..12708a7 --- /dev/null +++ b/libs/dashboard.py @@ -0,0 +1,2127 @@ +"""Instantiate a Dash app.""" +from dash import dash_table, dcc, html +from dash.dependencies import Input, Output, State +import plotly.graph_objects as go +import plotly.express as px +import dash_bootstrap_components as dbc +from .util import floatNoneConvert, strNoneConvert, otherinputtodict + + +def dashboard_app(df, dash_app, plotly_config): + """Create a Plotly Dash dashboard.""" + dropdowns = [] + plot_theme = None + plotly_color_continuous_scale = None + if "template" in plotly_config.keys(): + plot_theme = plotly_config["template"] + if "color_continuous_scale" in plotly_config.keys(): + plotly_color_continuous_scale = plotly_config["color_continuous_scale"] + + tab_style = { + "borderBottom": "1px solid #d6d6d6", + "padding": "6px", + "fontWeight": "bold", + "backgroundColor": "black", + "color": "white", + } + tab_selected_style = { + "borderTop": "1px solid #d6d6d6", + "borderBottom": "1px solid #d6d6d6", + "backgroundColor": "#119DFF", + "color": "white", + "padding": "6px", + } + not_mandatory_font_style = {"color": "blue"} + mandatory_font_style = {"color": "red"} + mandatory_div_style = {" marginLeft": "1%", "width": "48%", "display": "inline-grid"} + not_mandatory_div_style = { + " marginLeft": "2%", + "border-spacing": "2px", + "width": "48%", + "display": "inline-grid", + } + left_indent_style = { + " marginLeft": "1%", + } + + df.insert(0, "Index", df.index) + + for column in df.columns: + dropdowns.append({"label": column, "value": column}) + + barmode = [{"label": "stack", "value": "stack"}, {"label": "group", "value": "group"}] + + regressioon_algos = [ + {"label": "Ordinary least squares", "value": "ols"}, + {"label": "Locally WEighted Scatterplot Smoothing", "value": "lowess"}, + # {"label":"5-Point Moving Averages", "value":"rolling"}, + # {"label":"5-point Exponentially Weighted Moving Average", "value":"ewm"}, + {"label": "Expanding Mean", "value": "expanding"}, + ] + # Custom HTML layout + + # Create Layout + dash_app.layout = html.Div( + [ + dcc.Tabs( + id="tabs", + value="tab-1", + children=[ + dcc.Tab( + label="DataFrame View", + value="tab-1", + style=tab_style, + selected_style=tab_selected_style, + children=[create_data_table(df)], + ), + dcc.Tab( + label="Basic Plots", + value="tab-basic", + style=tab_style, + selected_style=tab_selected_style, + children=[ + dcc.Tabs( + id="tabs-basic", + children=[ + dcc.Tab( + label="Scatter Plot", + value="tab-2", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-scatter-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-scatter", + options=dropdowns, + placeholder="Enter X axis Value", + ), + dcc.Dropdown( + id="input-y-scatter", + options=dropdowns, + placeholder="Enter Y axis Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-scatter-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-scatter", + options=dropdowns, + placeholder="Enter Color axis Value", + ), + dcc.Dropdown( + id="input-size-scatter", + options=dropdowns, + placeholder="Enter Size axis Value", + ), + dcc.Input( + id="input-other-scatter", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-scatter", + color="success", + n_clicks=0, + children="Submit", + style=left_indent_style, + ), + dcc.Loading( + id="loading-scatter", + type="default", + children=html.Div( + id="output-state-scatter", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Line Plot", + value="tab-3", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-line-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-line", + options=dropdowns, + placeholder="Enter X axis Value", + ), + dcc.Dropdown( + id="input-y-line", + options=dropdowns, + placeholder="Enter Y axis Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-line-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-line", + options=dropdowns, + placeholder="Enter Color axis Value", + ), + dcc.Dropdown( + id="input-line-group-line", + options=dropdowns, + placeholder="Enter Line Group Value", + ), + dcc.Input( + id="input-other-line", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-line", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-line", + type="default", + children=html.Div( + id="output-state-line", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Bar Graph", + value="tab-4", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-bar-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-bar", + options=dropdowns, + placeholder="Enter X axis Value", + ), + dcc.Dropdown( + id="input-y-bar", + options=dropdowns, + placeholder="Enter Y axis Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-bar-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-bar", + options=dropdowns, + placeholder="Enter Color axis Value", + ), + dcc.Dropdown( + id="input-barmode-bar", + options=barmode, + placeholder="Enter BarMode", + ), + dcc.Input( + id="input-other-bar", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-bar", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-bar", + type="default", + children=html.Div( + id="output-state-bar", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Pie Chart", + value="tab-pie", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-pie-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-pie", + options=dropdowns, + placeholder="Enter X axis Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-pie-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-names-pie", + options=dropdowns, + placeholder="Enter names Value", + ), + dcc.Input( + id="input-other-pie", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-pie", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-pie", + type="default", + children=html.Div( + id="output-state-pie", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Tree Map", + value="tab-6", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-tree-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-tree", + options=dropdowns, + placeholder="Enter Tree Path", + multi=True, + ), + dcc.Dropdown( + id="input-value-tree", + options=dropdowns, + placeholder="Enter Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-tree-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-tree", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Input( + id="input-other-tree", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-tree", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-tree", + type="default", + children=html.Div( + id="output-state-tree", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Sunburst Chart", + value="tab-7", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-sunburst-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-sun", + options=dropdowns, + placeholder="Enter Chart Path", + multi=True, + ), + dcc.Dropdown( + id="input-value-sun", + options=dropdowns, + placeholder="Enter Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-sunburst-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-sun", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Input( + id="input-other-sun", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-sun", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-sun", + type="default", + children=html.Div( + id="output-state-sun", + children=[], + style=left_indent_style, + ), + ), + ], + ), + ], + ), + ], + ), + dcc.Tab( + label="Statistical Plots", + value="tab-stat", + style=tab_style, + selected_style=tab_selected_style, + children=[ + dcc.Tabs( + id="tabs-stat", + children=[ + dcc.Tab( + label="Box Plot", + value="tab-8", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-box-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-box", + options=dropdowns, + placeholder="Enter X axis Value", + ), + dcc.Dropdown( + id="input-y-box", + options=dropdowns, + placeholder="Enter Y axis Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-box-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-box", + options=dropdowns, + placeholder="Enter Color axis Value", + ), + dcc.Input( + id="input-other-box", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-box", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-box", + type="default", + children=html.Div( + id="output-state-box", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Histogram", + value="tab-9", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-hist-madatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-hist", + options=dropdowns, + placeholder="X axis value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-hist-not-madatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-hist", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Input( + id="input-other-hist", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-hist", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-hist", + type="default", + children=html.Div( + id="output-state-hist", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Area Plot", + value="tab-area", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-area-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-area", + options=dropdowns, + placeholder="Enter X axis Value", + ), + dcc.Dropdown( + id="input-y-area", + options=dropdowns, + placeholder="Enter Y axis Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-area-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-area", + options=dropdowns, + placeholder="Enter Color axis Value", + ), + dcc.Dropdown( + id="input-line-group-area", + options=dropdowns, + placeholder="Enter Line Group Value", + ), + dcc.Input( + id="input-other-area", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-area", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-area", + type="default", + children=html.Div( + id="output-state-area", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="HeatMap", + value="tab-10", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-heatmap-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-heat", + options=dropdowns, + placeholder="X axis value", + ), + dcc.Dropdown( + id="input-y-heat", + options=dropdowns, + placeholder="Y axis value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-heatmap-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-heat", + options=dropdowns, + placeholder="Enter Z Value", + ), + dcc.Input( + id="input-other-heat", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-heat", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-heat", + type="default", + children=html.Div( + id="output-state-heat", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Violin Plot", + value="tab-11", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-violin-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-violin", + options=dropdowns, + placeholder="X axis value", + ), + dcc.Dropdown( + id="input-y-violin", + options=dropdowns, + placeholder="Y axis value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-violoin-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-violin", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Input( + id="input-other-violin", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-violin", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-violin", + type="default", + children=html.Div( + id="output-state-violin", + children=[], + style=left_indent_style, + ), + ), + ], + ), + ], + ), + ], + ), + dcc.Tab( + label="Geological Plots", + value="tab-geo", + style=tab_style, + selected_style=tab_selected_style, + children=[ + dcc.Tabs( + id="geo-stat", + children=[ + dcc.Tab( + label="Map Density Heatmap", + value="tab-map-density", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-map-density-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-map-density-lat", + options=dropdowns, + placeholder="Enter Latitude Value", + ), + dcc.Dropdown( + id="input-map-density-lon", + options=dropdowns, + placeholder="Enter Longitude Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-map-density-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-map-density-mag", + options=dropdowns, + placeholder="Enter z Value", + ), + dcc.Input( + id="input-map-density-radius", + placeholder="Enter radius Value", + ), + dcc.Input( + id="input-other-map-density", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-map-density", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-map-density", + type="default", + children=html.Div( + id="output-state-map-density", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Line on Maps Heatmap", + value="tab-map-line", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-map-line-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-map-line-location", + options=dropdowns, + placeholder="Enter Loaction Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-map-line-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-map-line-color", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Input( + id="input-other-map-line", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-map-line", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-map-line", + type="default", + children=html.Div( + id="output-state-map-line", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Scatterplot on Maps", + value="tab-map-scatter", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-map-scatter-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-map-scatter-location", + options=dropdowns, + placeholder="Enter Loaction Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + # dcc.Dropdown(id='input-map-scatter-lat', options=dropdowns, placeholder='Enter Latitude Value'), + # dcc.Dropdown(id='input-map-scatter-lon', options=dropdowns, + # placeholder='Enter Longitude Value'), #disabled due to mapbox token + ], + ), + html.Div( + id="input-map-scatter-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-map-scatter-color", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Dropdown( + id="input-map-scatter-size", + options=dropdowns, + placeholder="Enter Size Value", + ), + dcc.Input( + id="input-other-map-scatter", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-map-scatter", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-map-scatter", + type="default", + children=html.Div( + id="output-state-map-scatter", + children=[], + style=left_indent_style, + ), + ), + ], + ), + ], + ), + ], + ), + dcc.Tab( + label="Financial Charts ", + value="tab-fin", + style=tab_style, + selected_style=tab_selected_style, + children=[ + dcc.Tabs( + id="tabs-fin", + children=[ + dcc.Tab( + label="Candlestick Chart", + value="tab-candlestick", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-candlestick-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-candlestick-date", + options=dropdowns, + placeholder="Enter Date Value", + ), + dcc.Dropdown( + id="input-candlestick-open", + options=dropdowns, + placeholder="Enter Open Value", + ), + dcc.Dropdown( + id="input-candlestick-high", + options=dropdowns, + placeholder="Enter High Value", + ), + dcc.Dropdown( + id="input-candlestick-low", + options=dropdowns, + placeholder="Enter Low Value", + ), + dcc.Dropdown( + id="input-candlestick-close", + options=dropdowns, + placeholder="Enter Close Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-candlestick-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Input( + id="input-other-candlestick", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-candlestick", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-candlestick", + type="default", + children=html.Div( + id="output-state-candlestick", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="OHLC Chart", + value="tab-ohlc", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-ohlc-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-ohlc-date", + options=dropdowns, + placeholder="Enter Date Value", + ), + dcc.Dropdown( + id="input-ohlc-open", + options=dropdowns, + placeholder="Enter Open Value", + ), + dcc.Dropdown( + id="input-ohlc-high", + options=dropdowns, + placeholder="Enter High Value", + ), + dcc.Dropdown( + id="input-ohlc-low", + options=dropdowns, + placeholder="Enter Low Value", + ), + dcc.Dropdown( + id="input-ohlc-close", + options=dropdowns, + placeholder="Enter Close Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-ohlc-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Input( + id="input-other-ohlc", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-ohlc", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-ohlc", + type="default", + children=html.Div( + id="output-state-ohlc", + children=[], + style=left_indent_style, + ), + ), + ], + ), + ], + ), + ], + ), + dcc.Tab( + label="Scientific Charts ", + value="tab-sci", + style=tab_style, + selected_style=tab_selected_style, + children=[ + dcc.Tabs( + id="tabs-sci", + children=[ + dcc.Tab( + label="Ternary Plots", + value="tab-ternary", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-ternary-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-a-ternary", + options=dropdowns, + placeholder="Enter A corner Value", + ), + dcc.Dropdown( + id="input-b-ternary", + options=dropdowns, + placeholder="Enter B corner Value", + ), + dcc.Dropdown( + id="input-c-ternary", + options=dropdowns, + placeholder="Enter C corner Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-ternary-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-ternary", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Dropdown( + id="input-size-ternary", + options=dropdowns, + placeholder="Enter Size Value", + ), + dcc.Input( + id="input-other-ternary", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-ternary", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-ternary", + type="default", + children=html.Div( + id="output-state-ternary", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Polar Charts", + value="tab-polar", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-polar-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-r-polar", + options=dropdowns, + placeholder="Enter R Value", + ), + dcc.Dropdown( + id="input-theta-polar", + options=dropdowns, + placeholder="Enter Theta Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-polar-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-polar", + options=dropdowns, + placeholder="Enter Color Value", + ), + dcc.Dropdown( + id="input-size-polar", + options=dropdowns, + placeholder="Enter Size Value", + ), + dcc.Dropdown( + id="input-symbol-polar", + options=dropdowns, + placeholder="Enter Symbol Value", + ), + dcc.Input( + id="input-other-polar", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-polar", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-polar", + type="default", + children=html.Div( + id="output-state-polar", + children=[], + style=left_indent_style, + ), + ), + ], + ), + dcc.Tab( + label="Streamtube", + value="tab-streamtube", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-streamtube-mandatory", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-streamtube", + options=dropdowns, + placeholder="Enter X Value", + ), + dcc.Dropdown( + id="input-y-streamtube", + options=dropdowns, + placeholder="Enter Y Value", + ), + dcc.Dropdown( + id="input-z-streamtube", + options=dropdowns, + placeholder="Enter Z Value", + ), + dcc.Dropdown( + id="input-u-streamtube", + options=dropdowns, + placeholder="Enter U Value", + ), + dcc.Dropdown( + id="input-v-streamtube", + options=dropdowns, + placeholder="Enter V Value", + ), + dcc.Dropdown( + id="input-w-streamtube", + options=dropdowns, + placeholder="Enter W Value", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-streamtube-not-mandatory", + style=not_mandatory_div_style, + children=[ + dcc.Input( + id="input-other-streamtube", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-streamtube", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-streamtube", + type="default", + children=html.Div( + id="output-state-streamtube", + children=[], + style=left_indent_style, + ), + ), + ], + ), + ], + ), + ], + ), + dcc.Tab( + label="Trend Line", + value="tab-trend", + style=tab_style, + selected_style=tab_selected_style, + children=[ + dcc.Tabs( + id="tabs-trend", + children=[ + dcc.Tab( + label="Regressions", + value="tab-8", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-12", + style=mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-x-regscatter", + options=dropdowns, + placeholder="Enter X axis Value", + ), + dcc.Dropdown( + id="input-y-regscatter", + options=dropdowns, + placeholder="Enter Y axis Value", + ), + dcc.Dropdown( + id="input-reg-regscatter", + options=regressioon_algos, + placeholder="Enter Regression Algorithmm", + ), + html.P( + "* Mandatory Inputs", + style=mandatory_font_style, + ), + ], + ), + html.Div( + id="input-20", + style=not_mandatory_div_style, + children=[ + dcc.Dropdown( + id="input-color-regscatter", + options=dropdowns, + placeholder="Enter Color axis Value", + ), + dcc.Dropdown( + id="input-size-regscatter", + options=dropdowns, + placeholder="Enter Size axis Value", + ), + dcc.Input( + id="input-other-regscatter", + placeholder="Enter Other parameters", + ), + html.P( + "* Optional Inputs", + style=not_mandatory_font_style, + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-regscatter", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-regscatter", + type="default", + children=html.Div( + id="output-state-regscatter", + children=[], + style=left_indent_style, + ), + ), + ], + ), + ], + ), + ], + ), + dcc.Tab( + label="Custom Plots", + value="tab-custom", + style=tab_style, + selected_style=tab_selected_style, + children=[ + html.Div( + id="input-custom-mandatory", + children=[ + html.Code( + id="custom", + children=[ + dcc.Textarea( + id="input-custom-code", + placeholder="use variable 'df' as datta frame and export plotly figure to variable 'fig'", + style={ + " marginLeft": "1%", + "width": "98%", + " marginRight": "1%", + "height": 300, + }, + ), + ], + ), + ], + ), + html.Br(), + dbc.Button( + id="submit-button-custom", + n_clicks=0, + children="Submit", + color="success", + style=left_indent_style, + ), + dcc.Loading( + id="loading-custom", + type="default", + children=html.Div( + id="output-state-custom", children=[], style=left_indent_style + ), + ), + ], + ), + ], + ), + html.Div(id="tabs-content"), + ] + ) + + @dash_app.callback( + Output("output-state-scatter", "children"), + Input("submit-button-scatter", "n_clicks"), + State("input-x-scatter", "value"), + State("input-y-scatter", "value"), + State("input-color-scatter", "value"), + State("input-size-scatter", "value"), + State("input-other-scatter", "value"), + ) + def update_scatterplot(n_clicks, input1, input2, input3, input4, input5): + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "color": strNoneConvert(input3), + "size": strNoneConvert(input4), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input5)) + + fig = px.scatter(df, **input_parametes) + return dcc.Graph(id="graph-1-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-line", "children"), + Input("submit-button-line", "n_clicks"), + State("input-x-line", "value"), + State("input-y-line", "value"), + State("input-color-line", "value"), + State("input-line-group-line", "value"), + State("input-other-line", "value"), + ) + def update_lineplot(n_clicks, input1, input2, input3, input4, input5): + input4 = None + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "color": strNoneConvert(input3), + "line_group": strNoneConvert(input4), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + + input_parametes.update(otherinputtodict(input5)) + + fig = px.line(df, **input_parametes) + return dcc.Graph(id="graph-line-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-bar", "children"), + Input("submit-button-bar", "n_clicks"), + State("input-x-bar", "value"), + State("input-y-bar", "value"), + State("input-color-bar", "value"), + State("input-barmode-bar", "value"), + State("input-other-bar", "value"), + ) + def update_barplot(n_clicks, input1, input2, input3, input4, input5): + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "color": strNoneConvert(input3), + "barmode": strNoneConvert(input4), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + + input_parametes.update(otherinputtodict(input5)) + + fig = px.bar(df, **input_parametes) + return dcc.Graph(id="graph-bar-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-pie", "children"), + Input("submit-button-pie", "n_clicks"), + State("input-x-pie", "value"), + State("input-names-pie", "value"), + State("input-other-pie", "value"), + ) + def update_pieplot(n_clicks, input1, input2, input3): + input4 = None + if strNoneConvert(input1) in df.columns: + + input_parametes = { + "values": strNoneConvert(input1), + "names": strNoneConvert(input2), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + + input_parametes.update(otherinputtodict(input3)) + + fig = px.pie(df, **input_parametes) + return dcc.Graph(id="graph-pie-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-tree", "children"), + Input("submit-button-tree", "n_clicks"), + State("input-x-tree", "value"), + State("input-color-tree", "value"), + State("input-value-tree", "value"), + State("input-other-tree", "value"), + ) + def update_treeplot(n_clicks, input1, input2, input3, input4): + if input1 is not None: + if set(input1).issubset(df.columns): + input_parametes = { + "color": strNoneConvert(input2), + "values": strNoneConvert(input3), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + + input_parametes.update(otherinputtodict(input4)) + + fig = px.treemap(df, path=input1, **input_parametes) + return dcc.Graph(id="graph-tree-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-sun", "children"), + Input("submit-button-sun", "n_clicks"), + State("input-x-sun", "value"), + State("input-color-sun", "value"), + State("input-value-sun", "value"), + State("input-other-sun", "value"), + ) + def update_sunplot(n_clicks, input1, input2, input3, input4): + if input1 is not None: + if set(input1).issubset(df.columns): + + input_parametes = { + "color": strNoneConvert(input2), + "values": strNoneConvert(input3), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + + input_parametes.update(otherinputtodict(input4)) + + fig = px.sunburst(df, path=input1, **input_parametes) + return dcc.Graph(id="graph-sun-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-box", "children"), + Input("submit-button-box", "n_clicks"), + State("input-x-box", "value"), + State("input-y-box", "value"), + State("input-color-box", "value"), + State("input-other-box", "value"), + ) + def update_barplot(n_clicks, input1, input2, input3, input4): + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "color": strNoneConvert(input3), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input4)) + + fig = px.box(df, **input_parametes) + return dcc.Graph(id="graph-box-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-hist", "children"), + Input("submit-button-hist", "n_clicks"), + State("input-x-hist", "value"), + State("input-color-hist", "value"), + State("input-other-hist", "value"), + ) + def update_histogram(n_clicks, input1, input2, input3): + if input1 is not None: + if input1 in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "color": strNoneConvert(input2), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + + input_parametes.update(otherinputtodict(input3)) + + fig = px.histogram(df, **input_parametes) + return dcc.Graph(id="graph-hist-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-area", "children"), + Input("submit-button-area", "n_clicks"), + State("input-x-area", "value"), + State("input-y-area", "value"), + State("input-color-area", "value"), + State("input-line-group-area", "value"), + State("input-other-area", "value"), + ) + def update_areaplot(n_clicks, input1, input2, input3, input4, input5): + input4 = None + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "color": strNoneConvert(input3), + "line_group": strNoneConvert(input4), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input5)) + + fig = px.area(df, **input_parametes) + return dcc.Graph(id="graph-area-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-heat", "children"), + Input("submit-button-heat", "n_clicks"), + State("input-x-heat", "value"), + State("input-y-heat", "value"), + State("input-color-heat", "value"), + State("input-other-heat", "value"), + ) + def update_heatplot(n_clicks, input1, input2, input3, input4): + if not input1 is None and not input2 is None: + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "z": strNoneConvert(input3), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input4)) + + fig = px.density_heatmap(df, **input_parametes) + return dcc.Graph(id="graph-heat-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-violin", "children"), + Input("submit-button-violin", "n_clicks"), + State("input-x-violin", "value"), + State("input-y-violin", "value"), + State("input-color-violin", "value"), + State("input-other-violin", "value"), + ) + def update_violinplot(n_clicks, input1, input2, input3, input4): + if not input1 is None: + if strNoneConvert(input1) in df.columns: + + input_parametes = { + "x": strNoneConvert(input2), + "y": strNoneConvert(input1), + "color": strNoneConvert(input3), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input4)) + + fig = px.violin(df, **input_parametes) + return dcc.Graph(id="graph-violin-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-regscatter", "children"), + Input("submit-button-regscatter", "n_clicks"), + State("input-x-regscatter", "value"), + State("input-y-regscatter", "value"), + State("input-color-regscatter", "value"), + State("input-size-regscatter", "value"), + State("input-reg-regscatter", "value"), + State("input-other-regscatter", "value"), + ) + def update_regscatterplot(n_clicks, input1, input2, input3, input4, input5, input6): + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "x": strNoneConvert(input1), + "y": strNoneConvert(input2), + "color": strNoneConvert(input3), + "size": strNoneConvert(input4), + "trendline": strNoneConvert(input5), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input6)) + + fig = px.scatter(df, **input_parametes) + return dcc.Graph(id="graph-regscatter-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-map-line", "children"), + Input("submit-button-map-line", "n_clicks"), + State("input-map-line-location", "value"), + State("input-map-line-color", "value"), + State("input-other-map-line", "value"), + ) + def update_maplineplot(n_clicks, input1, input2, input3): + if strNoneConvert(input1) in df.columns: + + input_parametes = { + "locations": strNoneConvert(input1), + "color": strNoneConvert(input2), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input3)) + + fig = px.line_geo(df, **input_parametes) + return dcc.Graph(id="graph-map-line-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-map-scatter", "children"), + Input("submit-button-map-scatter", "n_clicks"), + State("input-map-scatter-location", "value"), + State("input-map-scatter-color", "value"), + State("input-map-scatter-size", "value"), + State("input-other-map-scatter", "value"), + ) + def update_mapscatterplot(n_clicks, input1, input2, input3, input4): + input5 = None # disabled due to mapbox token + return "Disabled due to mapbox token" + + @dash_app.callback( + Output("output-state-map-density", "children"), + Input("submit-button-map-density", "n_clicks"), + State("input-map-density-lat", "value"), + State("input-map-density-lon", "value"), + State("input-map-density-mag", "value"), + State("input-map-density-radius", "value"), + State("input-other-map-density", "value"), + ) + def update_mapdensityplot(n_clicks, input1, input2, input3, input4, input5): + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "lat": strNoneConvert(input1), + "lon": strNoneConvert(input2), + "z": strNoneConvert(input3), + "radius": floatNoneConvert(input4), + "zoom": 0, + "mapbox_style": "stamen-terrain", + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input5)) + + fig = px.density_mapbox(df, **input_parametes) + return dcc.Graph(id="graph-map-density-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-candlestick", "children"), + Input("submit-button-candlestick", "n_clicks"), + State("input-candlestick-date", "value"), + State("input-candlestick-open", "value"), + State("input-candlestick-high", "value"), + State("input-candlestick-low", "value"), + State("input-candlestick-close", "value"), + State("input-other-candlestick", "value"), + ) + def update_candlestick(n_clicks, input1, input2, input3, input4, input5, input6): + if ( + strNoneConvert(input1) in df.columns + and strNoneConvert(input2) in df.columns + and strNoneConvert(input3) in df.columns + and strNoneConvert(input4) in df.columns + and strNoneConvert(input5) in df.columns + ): + + input_parametes = { + "x": df[strNoneConvert(input1)], + "open": df[strNoneConvert(input2)], + "high": df[strNoneConvert(input3)], + "low": df[strNoneConvert(input4)], + "close": df[strNoneConvert(input5)], + } + input_parametes.update(otherinputtodict(input6)) + + fig = go.Figure(data=[go.Candlestick(**input_parametes)]) + return dcc.Graph(id="graph-candlestick-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-ohlc", "children"), + Input("submit-button-ohlc", "n_clicks"), + State("input-ohlc-date", "value"), + State("input-ohlc-open", "value"), + State("input-ohlc-high", "value"), + State("input-ohlc-low", "value"), + State("input-ohlc-close", "value"), + State("input-other-ohlc", "value"), + ) + def update_ohlcstick(n_clicks, input1, input2, input3, input4, input5, input6): + if ( + strNoneConvert(input1) in df.columns + and strNoneConvert(input2) in df.columns + and strNoneConvert(input3) in df.columns + and strNoneConvert(input4) in df.columns + and strNoneConvert(input5) in df.columns + ): + + input_parametes = { + "x": df[strNoneConvert(input1)], + "open": df[strNoneConvert(input2)], + "high": df[strNoneConvert(input3)], + "low": df[strNoneConvert(input4)], + "close": df[strNoneConvert(input5)], + } + input_parametes.update(otherinputtodict(input6)) + + fig = go.Figure(data=[go.Ohlc(**input_parametes)]) + return dcc.Graph(id="graph-ohlc-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-ternary", "children"), + Input("submit-button-ternary", "n_clicks"), + State("input-a-ternary", "value"), + State("input-b-ternary", "value"), + State("input-c-ternary", "value"), + State("input-color-ternary", "value"), + State("input-size-ternary", "value"), + State("input-other-ternary", "value"), + ) + def update_ternaryplot(n_clicks, input1, input2, input3, input4, input5, input6): + if ( + strNoneConvert(input1) in df.columns + and strNoneConvert(input2) in df.columns + and strNoneConvert(input3) in df.columns + ): + + input_parametes = { + "a": strNoneConvert(input1), + "b": strNoneConvert(input2), + "c": strNoneConvert(input3), + "color": strNoneConvert(input4), + "size": strNoneConvert(input5), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input6)) + + fig = px.scatter_ternary(df, **input_parametes) + return dcc.Graph(id="graph-ternary-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-polar", "children"), + Input("submit-button-polar", "n_clicks"), + State("input-r-polar", "value"), + State("input-theta-polar", "value"), + State("input-color-polar", "value"), + State("input-color-polar", "value"), + State("input-symbol-polar", "value"), + State("input-other-polar", "value"), + ) + def update_polarplot(n_clicks, input1, input2, input3, input4, input5, input6): + if strNoneConvert(input1) in df.columns and strNoneConvert(input2) in df.columns: + + input_parametes = { + "r": strNoneConvert(input1), + "theta": strNoneConvert(input2), + "color": strNoneConvert(input3), + "size": strNoneConvert(input4), + "symbol": strNoneConvert(input5), + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input6)) + + fig = px.scatter_polar(df, **input_parametes) + return dcc.Graph(id="graph-polar-tabs", figure=fig) + + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-streamtube", "children"), + Input("submit-button-streamtube", "n_clicks"), + State("input-x-streamtube", "value"), + State("input-y-streamtube", "value"), + State("input-z-streamtube", "value"), + State("input-u-streamtube", "value"), + State("input-v-streamtube", "value"), + State("input-w-streamtube", "value"), + State("input-other-streamtube", "value"), + ) + def update_streamtubeplot(n_clicks, input1, input2, input3, input4, input5, input6, input7): + if ( + strNoneConvert(input1) in df.columns + and strNoneConvert(input2) in df.columns + and strNoneConvert(input3) in df.columns + and strNoneConvert(input4) in df.columns + and strNoneConvert(input5) in df.columns + and strNoneConvert(input6) in df.columns + ): + + input_parametes = { + "x": df[input1], + "y": df[input2], + "z": df[input3], + "u": df[input4], + "v": df[input5], + "w": df[input6], + "template": plot_theme, + "color_continuous_scale": plotly_color_continuous_scale, + } + input_parametes.update(otherinputtodict(input7)) + + fig = go.Figure(data=go.Streamtube(**input_parametes)) + return dcc.Graph(id="graph-streamtube-tabs", figure=fig) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + @dash_app.callback( + Output("output-state-custom", "children"), + Input("submit-button-custom", "n_clicks"), + State("input-custom-code", "value"), + ) + def update_customplot(n_clicks, input1): + if not input1 is None: + df + _locals = locals() + exec(input1, globals(), _locals) + return dcc.Graph(id="graph-custom-code-tabs", figure=_locals["fig"]) + return "Fill the required fields and click on 'Submit' to generate the graph you want!!" + + return dash_app + + +def create_data_table(df): + """Create Dash datatable from Pandas DataFrame.""" + table = dash_table.DataTable( + id="database-table", + columns=[{"name": i, "id": i} for i in df.columns], + data=df.to_dict("records"), + style_cell={"textAlign": "center"}, + page_size=300, + ) + return table diff --git a/libs/dataframe_visualizer.py b/libs/dataframe_visualizer.py new file mode 100644 index 0000000..4ccabb8 --- /dev/null +++ b/libs/dataframe_visualizer.py @@ -0,0 +1,24 @@ +""" Generates list of intialized visualizers """ +import pandas as pd +import seaborn as sns +from libs.dashboard import dashboard_app + +pd.set_option("display.max_rows", None) +pd.set_option("display.max_columns", None) +pd.set_option("display.width", None) +pd.set_option("display.max_colwidth", -1) + +def dataframe_visualizer(code_imdict, dash_app): + """Returns Dataframe visuualizers and list fo processed Daataframes """ + codedict = dict(code_imdict) + list_dataframe_names = [] + + for code in codedict.keys(): + loc = {} + replace_str = "" + command = "var = " + code.replace('"', "'") + replace_str + exec(command, globals(), loc) + dash_app = dashboard_app(loc["var"], dash_app, {}) + list_dataframe_names.append("") + + return list_dataframe_names, dash_app diff --git a/libs/util.py b/libs/util.py new file mode 100644 index 0000000..d675e51 --- /dev/null +++ b/libs/util.py @@ -0,0 +1,31 @@ +""" Python script with utility functions """ +def strNoneConvert(input_data): + """ Converting input to string if it is not a list or none """ + if input_data is None: + return None + if input_data is list: + return list + return str(input_data) + + +def floatNoneConvert(input_data): + """ Converting input to float if it is not a list or none """ + if input_data is None or input_data == '': + return None + if input_data is list: + return list + return float(input_data) + + +def otherinputtodict(input_data): + + """ Dict [parser funtion for other inputs """ + input_parameter_dict = {} + if not input_data is None: + if "=" in input_data: + input_parameter_list = input_data.split(",") + for parameter in input_parameter_list: + input_parameter_dict[parameter.split( + "=")[0]] = parameter.split("=")[1] + + return input_parameter_dict diff --git a/media/DatasetView.png b/media/DatasetView.png new file mode 100644 index 0000000000000000000000000000000000000000..f94e09b7f3db4ffc865d2e4ea3a2b174486ce4d9 GIT binary patch literal 59470 zcmZs?1yozzx9;5n#WlDT2?2^1cb5itcP~=3xRpYIU~QmyfuhBo;vU=`N^mV&+~KD8 zocEmX{oiklJx0cWWXoD}tvToO{5C{g^$iXt1?ID7&u|pLvYOAHAw!-$Lt;WlMf``6#?$+)m|z-SjB>c%7Dy`8>rAa>=#g><~^&*lV@ zMEcL;JBp<`=#=WqGmQT@^ikkI0F6YDWlRhKeYmLKIhcgq@D-EVx39N2dqb=hd0Z0R z`&?GNAYTCO^Zz(#81d<#=x&h`N!N>Qfz71`t%}vQBP{mXROP0vhTPV}uj(A;l0XXa zWY~B#;$QWvEN@-|RAW)VAO3aZaE7=-WYJ~xQQ51m&epn5M+BllMVOt!o_mT-=fANh z7VBMx!Y}r1HVRZUE6t^fbX&t=aW5C|W0HDy{dXJO|Kqk+81QYOyKF~~xBHw14d!je z&0Z#Za}}J89y|Q3tsXmZH{Ozx9|%4rbC|?$4J8k$Nj!kI2KBy7<|~PW0gbg!BL1IS z1k;{k%#%Py*Z=IzlvMjn0B;VjR`S9P(V~etZH-ltk&$CpYv5`YZejlR@CLUL#~-Sh zlRiCi?kAISMH;yUo1+PR_>wgD-z>RK@lfpkV}9^kF&c>ep1d;@t@>awzuIn$n%ST_ z?<=dGDu7Y>mG|*7UlkDmAP3Fu{}KQvJEY_v}A?P2m8 zzvX~N-~Dg}#RMKZRUQ#gK8CYUEsCYG&ZjD5%b~Jnfvxon5BHmGxkdsX8EVlcCO6BT z#IF#uc)iR(o%NnLCT|*e;u|~~q4-7PMt3>ga${!y;CUuuR=xQ3p6JCWE$q)TTzOY0 z!6T|P$1bE5;D0~2BvK{=elhr9u{rtcoO0gQV6sP~42*RBGqJ~8ShgYY2~$DSH|guL zy9cA2lLKm@;I$S}Odnb<^^SQM6WzC1i>V#YZVmG~ko^h@!?2(e`R0yHSTh zw}Y_67JN8cX0&Z%%<4m9jI}{KJE_=&jKvB#(f6p?j?FUSN*$eZgSV4Z&aUE(qGOE810zU|331Sq`iHWFEK2wz5JNM=R0zuPA(>SGggjg-gw? zE-=zG27OlDVo-NDjsTML)zQ*qrBvWl@W?OEc=13#`gOMFb`OEKwf5XzaQ((IBzz!O z_-L8aLN&Mh^jmsiuFI|$Sk|ye0{4eoK6>SeA8#iFHmA6`=esnT*#W*h$v0>1 zNdY%!Lltl0z=vsk@8OHwmYd+BA0+cGZ8!2wtt&d2Q)HvDlmZHXGKSyq$~JeKq5gpc zrhKg*qmvg8SFyX@!p-k}^$1@Cvff}3eW_?S#a~}5)+s5Vnr~lu{f)=2oQO@k|Gc|l zYbY_1kV!SAO1IRQA(h82sn?~ILBz``S^oC;vjlb5wOadKzkAoemh-9sQnn#Lf?5>J zqFcIKnMtRi5=F!u^DH!fSRYR(Wy$2HDz#}lhr+&g!i)A%C=Sycc=Cg+`~IyMMr7{R z>vOy?+ON6?`Yavzg@rl$hO5N(Uw@Q+9Wd5$E>zlY^;e5u1u1?7+m2Jp zovCvR)i04mnpjkyE=VK-(v8Qk$q$mh>@A{PA)^g-f1Mx&y`oXzCY5WFM(z+gIz(yItT9b#aEEY#Qtknj%0qgTze1&VC&Lr{eAHHVTp zNnzZx6)TbjDp?$q0#2`i1k#sxG?x@ZsSN#WTqx1jQ;e~(J(cCQ+A2_BKAY)%>^EUg zMTePU_8RT)<)$@;4l{)oFsRZy}9Ng_wt}F=@gR} z2H|>BSPtN}ryv3H`;$IfG5nTy%g*crd?#Zep%N6&?fH~IkAJ%HG>feI}WB z8-^#Y>YSGb{|FWy`!nkl)9PwC#t1}_Xjn9^+}kZRU2L-2M4<9t?9cFhd(9zh$>F(D zreF0jpx(2j_U(jp8<|8%l5Fs8t$X>uL;D31;>!$LP~7cof19k_FhVY$EVb@MGv>a-(dOx9MI>{l9V$yrdf8aQEXA8J8P*g8Fo z1_;n*!dtve9Bl0w<;*yk>W@}U6udK^KX&_GdqtTip(> zAxuCux$!8Qp**(@#$J|iwxUG7-#D^BHV8f>3BTsC)pbpp9zgdij#|X|wyVrz5(d$% zpq8CwQ~6#ay;q3;2`qYlHdY{uW^B^;na0IIhU392^}e*CI|>cjuyaRK`>hZ6_jFY* z1Pfk4ZgE0gYryhr`SA@RZSFGB12Rm^C(xcu@?7bxGMpC6Gh#H7XB}pizv85w)DG)9WuMfPW9Q8p;6#cDI*yqsELCDL1sls}Qvre?Q5mKvw7$%7BSMB?y&gWc)}} zHc5JW&p)MtViLe|>p09Q#d*^svxAYcFtjdrl6dg9lda^*auXx^ z>dS*0Q_Vu~JNPxbK{;^3J)@Q$V4>i2uS>syiRnn+>#rua{*_rPPbw6Zd!r<^+F?eq zNT;TNAO~O1)hMui-=Eul5@e-dT;~^C1(F7R>?@ur$=^Yv>HjS8_{wu{nr{|7ge2@g z%VtFo_6kPY}tR|~dSsCUUC zD8WCE(2gwdyRj)U$Zaas*=PDYx6O&EoQMYr#iihVJw4X19?RJy-crud$*$es^>7vZ zB$BiK^CO#n1Nd}56gk+wk(d5YEalwGDV49Us;q}oG+1^G)A$`pEP?bc3XK7G}ORhI}{oXH`$W&1VMK`|}5C|65f& zf@z0=Cj&s8=X+1o#Xd2qw3(vm#v8;NOs{o$8&VwnDCw`2)rd8&7ftHW#ao`h9B@%q z!plx#o^TZL26iE>&4gYd5yjPR5k_4uUg+DN%g%V8dzgY1o#T9E2%AYYEQw(PU{wj? z*KmVeD>ejodCo>L$QI!Z#p@e=B1a*y#Nx3T1R(;LCsi*?MD;@0O**i5Y6(+9pCrj~|BHga*v`(H>knbZo{Wn@K zS1WAR*_Z4lC#!47TC6AQhc(=8$M|P89cbR5H-jycAUh^{G7V;W3^quO?Ni^wxa?O_MbB8Jm^et+l#WUY!8gbMphgJ6&)G%ZSNn6hU(rtCNGhvu zT(?T6CS-d{(P_`0e)EoEmYPvy62~?nxK5Gqr z`7pr5l1Ztsr_GsKXEK*34Sw8kOoD|S?fX8z)Qa|a zNB`kO9av2vm(xEX@i;!*YqRO-`P+H9CG~uNZe{wDr}Huqq$j$SEJEDxoAt=egt{$)@#9i zL$T3!ic#gK)&xC}05}DBpMuN=xjAifHVsXI39lSZ_I%x_+yhHX{vv=ReR%MD46t7= zEh5OMly&}9Yk*12ajy-Hgz@=b9r11PlN2S^rZ#a&gLKE|yMNW~_lM)`tAuL@6GF=2 zD#@H?w#H#kgrASDJU7xVF z>sWM31{>VW1h=0HZ0VL6Dv=Y5Z`GC#eQP}19OC>jBrZlT_*ti2lLhM{IfmJJy{G3w)DnKwD`Dl1XAS zaH94jX4O>=$D^?rM9yxs^hP9&qH?^DKh2mJd8NA5vTkK^My9vtzgd4z7Pz%!3ZC$| z?`Df*0fo07m`&CJd%Clrr)iW!DO8dUrO z*ScjgBESh@_R8C>frqq4jljb?ILpDMAd1&pCd{OW>YiqT2EpvgRAOgz9K{n{tzQ2nT6hyaV-mFBs z?uS^)h=yB$K^qmD>@5m9_kq_GMe0(Mr$D|PhjGiRz`JvPj>aKv{r58|^FxLtJ=LPp zAUsOp>2EwBRcR5g^Fl8;d;2XE(c%tX9xld~T+F*|#OPyl03^nF zYMqx1$pznj85K)zvZ5ImI_Klc36!`WH_p`=A~B>tFT|$d(u^_+VgdZxZTZq}|OC;kP-ji;JQgoYWyo|LCL9jcLfi|I_{B*P(|QfW!$R-E3B7jq0iXeH0W%^6q0F6;K2cAM`D<~ zCy|`3=kYKIW#89<*L4I>MF~D@vl2%Ih^mT#ixjSs1q0<|(jr#A5rExW3ock@QZJRM zqhv$an!Q*y8}*B#oyYEyN(+fz^r#@Cwr!25%!N!-83@B(-~1>rv_w>4rP^Q+(Vw1w zCMgQlS>a*>5?Hkw)I}LS@q?pv%dA_LKQt9vy@kLC=-&(?3Im(yM}>5bjBn%V??G#w zIL(}lLR=sUly+NE+fDJ?M4E>=c^K|h5PX3l$pQOe%%cI`PDesb!J*N?1L;Ijfk`0i#0@D(6s0KqkuGpm17{H zt-_GN=IV@LWaLU|X0`;VWWdai3Pu@T2MOQT5ZK02@bey-sa)8;k7ty2^AdQlIBt9T z+VLSe!(*L-mGNY0G{f2*9XL^3ABn=^u`>*<+oOp5cz*18=un-$-iu$JKUJWTe6d&k z)4X$z@%QkcPRWy%f^1jD>VgWpfbqUOg?NKbiMFP|lnMpSj4`9~H)|tM(BsX{-bWt| zRL4N2S}Gy;LF-n?r+kz-jFEWs=NKGsN6${CPrMSBrrrCnR6t$8Bq1&N-#H)gtBQ1M zU>KJ3lu&TkF3i6yTsWstO4#Z84=vEG zFYe`bNS8o#a{qpXgj=q>(GR<}cZ>YD=C&Dz(>#;{a}YvCvN;WXez!-iF-(UC+51uk zr_g4dwkuQ8jhvSx(8zs%2bb4gi1Tcw&GJ3C_v*!61l|5-s&?2?TqwmTEDf(g#{wD$ zm!XpCeEn%qMjrO`cvr3D6%yht#sUx=_eZmY>cddR$OvHZJm6wR@2N&g zH$xW2EnU0jXL5l`!iS&14k=7Puh-Ofp8OH4LkrSC+K3fcetn{Z$Qe3lN$CiwEFDqi zCq+KVWW3?cn+rBlGN(;v;Z8&y`$iVafu9?d_vJasW}T*{ei9mP~YKwlL^S01y-sAwsPEo`*%nz6JWKVHl) zz#K+j>L$3KSfb5UUhLEV9P0B3_kC#>Mk`)dW7wg7JOzMMI&BOa;sCjfW}OP!YnqD~ zQ0I!S2U55aa@!ehX{kLNVi@+k#i!A*XzV{GpZ}gp4}6=8kz^XQWkV0p@OqK&z@}l3 zgEF*pB@sY_5Xp-I!z$Sev5$){IPy^U-?atY41abdN&hWFX}6zKQ`nYQ-ibe{W`(9& zZV8~bR5&MMic|WhOTibzKor%LAPQE?Qk3eA;~Dqs+baO8{0GqIyLfHYg?@Ax>lNqV zuQRg}xsxb}SQuu&pWTqAbn!1y15=6^8|k36GmEvNy@l?AxZ1OU&o*Q zm|Rz2ZqzzpQc9wrZ)NLXJ44Kxq$Ktr0-MQkAxTf~@t#>fJFHjYBeXOyxIN^4lOcO< z&>j>DiSXwO6qcHd8$E6-sro=a0;z_p&^d4&=Lx&$L;r|>{aFbpTjkRStdtrqG^GF3 zOm64o9UUrf{@t&Udyd+cM(~Nuv67Lr=*Nklt9`935MZmV4Q-H<1E#Er;qk8FUVq1P zkoWtQhDbesdO=Fa!WN5a z7*2`}8}W06)vYkodF^xR?!~9Ax%6TSVKT9a6#mys-YZ3v4iX#N*h(958O=N#iH5gMNz3xS+!_ z=IC}%IG+|@UmF?Ema!iF)`+Xr8*BQSXwUi+e zqN(!2&lQUmCccgbZ3qWWXf= zROji0G~r@^sC6Xcg+85UEh=!m322`tbey+!QG)d z?kR;Y$!is8j-mmv77^j)XU#X%7h3?b0M2&CI3pDTr1r6a22nF#a7Z|Q*iYW4(@iGq zSMqqh1rj(Xd+Io?g@o#~ymSi$3-jtM*_4GxP_y%C#4xbY&LdQZ@5iimqZ$&i8i?Am zph~*y7rM8de&a+J3!p4THs;JLoj*=U5z8G*C?UlmA6K-W2+m=X@V1xf5g)8F|z{o0c$FiyXh`eCeRlo z9D5SQeMmugofr4^2anS+b(K^iMqW_nS?gRxw^IWS^CX`&=l`dMcn*kUL;5LaDLFjv zzP0><7{a3hOzU{#4YFHDVgZy4JvraM+UMYy_UZAFCt41EKc-Kx(Hr%HqxiYIk(}iv zQH4?o{CKEn|4p4LP|+NQu8D-~7Om?w^#!itwsCpXobl9+ag`uR_nLC=+AOB^jL!=S`HCV-zV}S}t5lfO^eVH2 zb77e*<&WAF(afXn!H>3$o;kq;t&Mfg=o&%hkN3W(SNZKDf|Z4dQ=8N;FiGB{=OGmQ zp%!0{t*#p^TQ+nU!q=c6fP_oS2qApOu+zV9j$b9-ZwHGVDc4)xz2jaI4u>tdx5Ha_XA@tBQ||V?Dbj>rO@c zy`{sNMO@*FNItKF>4E9iJIy6`jjj%sB?|*U=d%HG;~r)C^ACssv&6;MAv|ZKv7w>G zG}9B9&ZIg2swdMgOF1DFarJ-?5pXv4ZV`(!bfLpN`I7CqUmtrh+t^9$H@K-FA7)OY z?w+l8yv(>!G4lt1b3B`dug#@mL9O=j;dVgJYy>?%k5LpzFgp*Wf79ph61a_bFB`2bD7X zGg5>5rA>LcZPr&uV#CL*pzdnLn1IU#veZI6*!uo4e?zy(aqHqUSK9yGi(I8TK7mV1 zrP<2Kpk%CV-&!6d47}GMJ%2{K7vmY+oQrOy2??XGr!K^Bq548{^vp?(-vUlHp52`7 zVT?FXm@hv`O+ei@mUV8dz0G3nV;H>g6ABgH#WeqxNP?{bClbNyxC#FcchT_q1G`cV z1WS8=t+Dxs^-QA>qdiV_dRI;godvE?_WH?eHzh#n$rpr|Zy6OH|1^`sz0)svvyz_$ zGL;M<>`oD}p&PNJcqL&bO6!KaK3L{2pmI6ow_rGQh$b*|er2YVV`CGlAI1mt36&dO za3|BGY3b9E*vZP3D35TIPP#QXNOFkWl+rll-5n=3jfO z4_tQlAzOqaX}K3Gx=&wv>uwvG82`8F|1X9C-xK5h4ahL5na+@`*)l(>_a#=jcBD+p z({(1B*j>IMfy-WSiMqCcCa6q`U+ex#hWI1IiYc*}ISsu1eqmF@Q^4fnPFjIV0P-8_ zN)uEoRSM+JS#Ak7*|YOsMDJO=a!K11bghw52JYQ&&6MVp1L|d$%GL(|SKIwBbGqXW zMY;}zJ5?I4Q%gWiZy8hN`>5KXMJ1%^mlp(VpBz&Cb%$OLX9K_LCQ^PmD zbQ41WA2aqCVGh6-Ng^QqtLnt<5hW$dbFnmIp?}jnlGga>I-s1SW$uy92&b4rl?ds5 z@Z#fcb}tYW2HmLt+<#*9MmcHfx(YB*f>Axliorb)+J~o%BSUl^SEAs8Uw?g-fpyyb z`*?FWHbEY{Kp|cVGmnD~!-^?MR zbPNN_if)8P;PE!wQ$Yw>%d1{XgMc-^5B=*wUhw&}J+U^biFiDvWR96DND+CGkjM7h zW;$cRe~-a43|Ynyb-5f5w$+tnjsbz_b}q|u{i^kXRgahyuFcVx4Ul5CX$i(P93;{@ z10Yvs6s)fwzxYY?Mgu!mB%ts`4svafp`{j{^VVRZ`}R4xZ;c-xv-$99HP_K+QSWUv9}Rv7jYDKKytJHYVpbjZNTreh+4svt<^T4h5g`wZ z{-6Yngc$H4vsd~2>3DvlyFqN#7e|kn5uWmVR~5M;?DHyFOQeSMoTTr?eRkSZ%PqcI zh?12fUEp23D1xVnrQnNIVxcIDfO?|%nEX40p98KDg#h#|LeP9&YtXYV;Iho-I9Hl9 zU8JSd`SH_cz-4act#W9B9rDgkXq)q^)F1& ze|&_0(2;-`$rRa~8vWX^^@qDFo13VuYAyCK#1ta#>J%(G;*fUwi4-(|fJxS}a2++% z7ywMFqD5L2suBNr)*SY~w< zsLGzM-_{`UUtEmfbCO_Khio^(x6e>MjQxr2`aguIVpw2O`9 z2K5Tfn_hV9T(Dz*!}-rJ`|=FEK@J39_<#N`IZZ1GCF8qcD%t*2i@-WUT@UW;;Ur{ z=L>uoOCSE(Kxa+=SA~gwMoneX=&tkF7GPlNyG4vCM~(B}*ZZS^L4FB_FG$2XnZfN>?h1M+s%3yeN>GUWZIGTzz9ONN!jk@k4tsi-|BWW6*zQ&{&Up`P`-2X*in6(%M z;`+1y=P}`Ow7m#pni=qJyv2PhYMvP4b-U1zx8k{`lC|=VoJko8D&KJ%c(U4w+~~UY z5#H*rr!E1FMG=*wMHEK>L@lNO1%5(7LGjt+rux6`Tn@_fDB1KyFm#uKNG``w{y+)| z^e60DkXfEumMOwcWgZi|`i3BQA_a~_si+w~paJH}O%h7FXic*y>H7iLZ6hkdOn8Np2FZUg>NeKmUtZt}Y^G``r;9VwBYHCp||Z z#Sp)I1@J`$W<6`K00!d;A|v8=g|se@==k^_9r zlD9`Fl#b?1J;V$I&e6p`ugc)Q6jk4wE7=HV^>vO!m~!9{U{9Xvq2XkO%P~GDugfFS z?=y{HgBthLn45r7(xG)tiUNKE{rc%>~|7{ z0=Tz54C;eI*&b{|V9}&%s`g#c7=%nimoJ+)yLzG-V}lSXa-Mxceco-lPAfN)9w`P^ zZq3f9LZSnojr!B)JjE@=@^G)kv6DNbST2aO%wR~DWQWm;o<$0v`EQ2)p!R>q_T}HP z_1#yR1K4RX#wLfQiPOAjP|Fl%P--{fK*N1}73dfE9hg(Jk0ElgJ6;t1l|@H-Z@Sq2 zE^t2y7s6TGj>4)QG4W=X3UT4z`pjCV;Mh_s-I_>JxB@Z5p`lG5F)lD@T6zGQPV=>jtO z#k-a^n=;m?kUaYGU3)Tcf}h3f{MmDtKr>(SJ*xP>k=r7T*iaa4qh#m4w_M~qLTW<& zy@zK~e>$sz1CL+;U*t0lVfdDqPe1VLBko@8PlOsX3P$;&&k9 zGqo({^c(C2;wU1>TGy~ZBjiJUTLqlg1Xt$o-et;!Xn=!w%_|S!b&Fg=4SHfFJ)hT> z=V}$`H})dD5U9u5^uv@!H-lZ=fwO^fnIBHRZtUJWYR(W&NuU4o^J@8+E;vJ+9cyO{;}}2g3K1#@g&teC2arFcbOdj-zMmf( zhI81jZDx1N55}1^Z|==Fo=!${rg<#3*b|<4z~P4MRU}uBZckUIf7WDfoDN8=F{Pj`k` zwSJ7f-hYLV2x6$Ylo^%N*j6~q=n&MW9%&!TLh}`S#+YTsX4v zYeWn%y};T`{yhEeqKDM}_&X`t8k&E;s`K1IQa#4x# zk1Vyt_R8e2@vlWwHq$?{$fc4@mMGLpz8o#r)N2>3OUbEo@|2rE^>{y#$q>%FvsoecyP={RD@+(2X3R{XDLajoic1%)M`_eX(=JzD9A4M!>v&LrFq}z(y49Y;HgDcCQIqD;t!7FeR2uLm3O8tL8Kzlvdwl#c3X8V zFYZ*QPpR@6w1z#8M>X?*R(`EjT_h zzbZQp&p9fe=bknZ1hY>Ip&qsA3?-qgeNOL=w_ycmBfZ$1nxJ=jIlk(gsG$LhqmO3a*%8wPzk!tXmVO zoWU!l=-9%TRs;Sf=ACIcBi~O~*J5}kGfds9jiG%RTp_C{Esa>VOIBh{vH zclTOF##JAE-z7yEeru(Vz!Sb)ZGI| z`_>cd4DOc)LT50sc0<8m_3z%@<}OX8!wmM0>P$_V5gb~++R4AX)y zLP5vL-O=}#3r7WX5ZO{J-SCpR z@_|zFsXTM&`e~f|@A0-Ws{z+^*#5=dEI-FP-5NLxo$QyTO1YW>me=wn`@hK(8Z5&M zx!6dh^vUE)bl%-W>GW=KeOi{CEqpA1hJ0@O+Zz@ zH|XhtiGGr{-<)Bw)$TJv&}SMk{$ZA{oOWSgFd}5#8%WAEqBn0mc49B?XAc({HAb(R zf2Q6v4mvwD8X%xF^=O9m+frM*fP;~$jlS5PA&1D9%1H+X5v=T{5qGv*io|&lP3rs( zlkf)M=)Joket7<%F0Za~gGTr)egX-rF58=JP3tcv1^#VHa<5I_c#uG@hjnzSaO!vb zJROSs-x8cv_B(hjsRSbk3guLOlc1Xm1d#J7nthZUwqS%qiFkj>=k=dNTWOQ*0liW* zBtf)|3#r)(mP$5nJa6G9t0igJl?m96CfIRi=!t2ukGBc@g4Hs zQ=L=gL2Y}bl*}$rv}I8ziz;OYMSqT5U+kd6T2g2a1h1I2YiK1TR_n$(__^HZx0(FZ zoP9U{>dbEJHAm2qLmLZVNVn8-9f}`}<_)&Kf>+w+TP^gD&gc2Eo*8}&!+6}##h|M` z?s%?{&KT=vFB_V;*%k#HvJ5{+Hjg5@5%RDVn7giAdA4yhuV=M1P8){gDS>;iw862N z9k-zf@|s|a^}jkyJ~R?Yt1)cVH6ixJQz?a)R1_q9(0@+hI4ku+Wlvqsa^*8>N)38; z{PD%y2r_Qu!4|77f)VeUnTpbSpZWf0sR2VaHyWk2O5jtg_e+VNJV9VxQv|(yCu9^y z2Vm7o?@%j2+}*g{cIX&-RGSivsD8=(d<3lWn&BN15pc| zN~H4Iq*Ya#YOUd5Sq5)8&BaHqkk5FIeww*`!G#*Vp4<0%SO_N?3@@H@nJH+copMT@ z%%@VSw@sZ{`6F`N|o*&IT&A~&o6FD z-3k=@ECT{Q7M%GnfsFWx^BuUPWEMho-z{Urzd|FSfP*%e1Kw6iuPxx4;X{VLu_;#8 z2IMQSx`xKVNPD!yWXNV5=LNwz_>oYv&s1DT-gE}Tw6f;xi#JQQ5yV@Lv1pz$YQ*9)qn7#jdU zTSAWaXFJ2#@vCUg^%V$ND+e5Q!Dm!H7yGs+l~0L;a6j@_qz}499ik%idpQTY zp}ZI%vw8@-zRl{Lkbd<-%{Y{7#6hPd1;*zC<~4Q1rM|XE?)C&Ye{=m@#|oIBIqJsQ zo8g<)-r>KD#`w4?!rE?fPeaW$BaB(%`xeLrQUV%VoV?z=36A#^!gGK$#yV!{!%Z@p zBO_%S&V`Lq=qLyxBCp3$FZNOY?+!sw1*%2~&sZ@%*kDC;>wz{*f_R8F-HgH92$ZQQ zWotl0T~acW-_AJ{rBkxCIiSVu0K-?fm{dYwbC!)PdL=etax$&48whMUkP?dlvK;ubsU#bFf^s;Lvc*;+QyEyn%Or%S(CqWLtO1L?(5i7tt z8iqi{syMy|?@pCOOwUN~>dH_N!ynbjUUIm7ic0!&wR~u8JT6TLX@59*^CkW5w6YAU z9PC$Tex+MYlDzfyz=I3akBBs43kD#-m;S_Cv-KnQO%s-H;YJuEplbPu<~(VORc`>3 z_yxW|rJ~FMZ8)b@IFlt>d5Gtp0Jn1p_{zmi>Nip)EHtWA$er?PoY94k_c%oGRe3%w z{vx^(K^kjxLEQ($tQ}pi5kMj(?raA%7usxcH#|Q2QqAQF*iW`t!d!@dCKR#D4*hxp}1-v_rV z;X@;t&hbMlVYG7XGqeXRZ@na8w|Q#Gs<#2tW(CUkz-gpWd`PA3(uC!*y{Yd)Ly@rE z+m;*!77`9aw#C|hfpuyEPBgt~cN?W<&trNc5cN!H)F=|Rg2rl`ErzXQl~zF@bHX&c z`&C>Sqb;U_NZZOyhFdF+3J8@mq)G#;q`hpN(m4V=gvYhZR_)3@6gva>j4#a))tXJN zFJ?wR3a|t7ek7BM?3S2W!V|c|=daA^O#6sRx|7qR~NABiNL#8{t+j&uRgMy<1$C;+fs7$%9s*-S1 zeRfC+DVte&Z^SB2n*f4zrwd}yEwkk=`sv%8pOg=#WxcS#UFRhoPJb!88*%06DLNZ0zBe^=u=W^=ww3!Bs%(6=xYvV^;IO&V zX@W&TB}tr~G0`{cXCJD0Dvi4ssP~tPG2FkHqviXlYfX$ccHezj;ze-4*G}{&n)T(! zisq{(8yN&XOykyJJu=*O@?K*oL0LPq4e~w?^KMnKyPWz_ut>n>9X&z=;sTyuoBlQI zBx$9A1RuW0Zr@()%eM$Mr+3Bc%kgkYS0XS&sCl;SQn=y!##Tc=ZcKRks-FWxF$V5S zAlHmi(e#V**7t|AQy@x2!Ko7IAIfwV-DcnbXKEj3TGL%e^LDaE>>uNRITSO>y$<4_ z+&mKbEOTy#E}VD6Olqb6i1qp^5NQG*9^c@#glfN1#pU!&{T~*frqrm_n7ie+m;iYh z@y5C1n}w(VL%%$e^jRr3qutOj5qkMxU^2(UyZDn;#>W=h{lh#vJhw{x4zTOTly0As z^}!?@N0o3@xX%;feL+TYtaS_z$Cj6}zifyzOOk^f*Lk~H0l_nQ%!rWT`wM{Vf0_xr z?w{zjr1;K}_-gLiP~ZTd$0Uddf6gdJ*;k9ZyEu0Do)J+-%{e!a<(O`K!XoACb_DvG zl--Cmwc3rMP{2LViaJDoY)Gkl&fP{N{7~hwoQblNTfjya6UAmRsBXZf9v=hYbOlY9 zXc_e>(i9_%K1K)L@afV`PTkh75u^HI^;WC+Uy`e9QpARDffE``8azGH#)dc?!&7zv z3=z05lcLi`i1Er+J3pWi#8OOq>ysf;hyr16xDhBP?+tNXSTL7cyv65vSJ81FIY*Y9 z7ZnL_ca-&K`$s5e!%9?hhPsJMk>xD)Ayw@ne>MLE#y%hdLyAHHf&kEq>Y^q=sRO#B z*FMUYcX7uQ$sF)=gLh+B{;?PMK-`{IsLys;_{GI`aprHN5_N&P@7mg2kxntA5XafF zl|q5LEQ;i*fHVf;BpH}Qwr=W-dFuy3Ih-0y2Z*cQ87V^N$RV+mF7u4A24=-j9f6|= z;AMb78F%~lKS8~pNzG14gSugUbo-?!+7NAST(JG_Y9FoJ~(DK?&N_0VV;l?_yurce35)li^!E-In#AY zOx-8~YL)7Aj3=ZjfU|)@3&wEf1~9zVriA2_+P?abu9TZ?cH7YJOi$saY;^xVQ@ z(=V|b7tv@A4I2*NB$uCEJt z4lnuhp2mis#NnlU0~+x0Ravie*H(#o=lv!6{K1ymU&LkZl;m|CUURYBOydjhk^=$r zN`yJ9pReK2DJQzTl2(cC9O^nJbK=FSfR8XMLSfE9Z=PL{&XqWx#LJmA^I5t3NHrkB zSJh!=ukQTH-YntSu+d05(CrfL%Pmi%-lZt4zM-%7*1e!Mt>6AU(xSkWF`mJs<^4oM z>1PVA|3lfEz*D(?Z{vrfA_kFGQO0<1%+L8l2$8olFs=@w#FXIPx-yUFx1s)chV}~F_joXa%PE} zuMHttwtkSz2y$#$Y~JDo4I*>bMV^BPx@fK9H4?;>4Td=8w|{ofNJ`fbDbm=(4o# zMRCT#qL3=F9Ig6x;{Z1k=gJ&!=pkiNX6>n?dbeG#X#NyWbV3cU#X8MXTPs7(M&_@a z&25EHtkuIeALmW|H?PqzKjrhykYua9UX4%eMw9LE4Fi8n^dG=RAQ(j9|DivCQ$p_ z&(rC&IFbZ{l&y^$=g%`3pnyyR*3DC)Qo8BIsPz5)1?BH3-N)`b1}}bV#n9zaV(;K& z{hXg;KIHE^X*H27mGVo>ibJ1D|U;4Mv+ux6%UHZlex@tx9mmEGc)ScuAjBVPc zF4K)+-*6d9;qtv-cA5UkrE-*V8f~ggfZ31531?e~VdT%;K(|jwtlxs{7vnt`F|Xl+ z>t$4^D+O8!v%T8F9Uak&BAAI7V}MzvLZf!pHWv!5M*Ko>Neb3kF8C5wwT~Lf@=5_) z(>LNgS+0_N9%bdY37&scSoO%T>>7S~(6VJgaA=V2eK=%gB_Vq18`y^=L)J6D{+*AL zg{;XLV zX&vcAXrP-&KF$GBxx4we8-axSvQuoHBCS_#OZrw=9|)DXT@5%&eb}GJS!b}yJR+n0 zU6xIw$ED}ymgX91PN~;nGFG>pJzz43+Q?*ZAnC$4A|~D8J-6VVYq1s;*RN%&XGfAY zON!nSM0rLhuE;UovnbH#;_Oakze&x%k7YhY}wc&ySR@cH5T7afJ(MO?jFl8&FzoU|;C!R8b15{emBoPIp?G&^ci7~Czc z@!h_c|K)<Bu1&+%HNo$uc{73e3u?Ba5*6kU^UNw{Pw)>Ku+|V6|@7q{I^b41< z2l9~1h#vT{ADAy42WWiaCEU8^6$JUosy`C$LvD4^4%iWivU`wg6$qHFxLVJFFsQ1S zw5(CKH|px`X}2@oLOd}l@8ZS0XHFvNL;Fi*Dv&cs>7PrdSoi;u&Q^B~+3N?8gs;&V zByC)K-9+31f~ug$Jg5Q^0=Vi_BI6*3A_VDM5>)=Q>>C`qFI#Rlrnh;5?B7e2O9cca zoSXF;r>ScB>6n=XLTEWxH{G4d;HFaeKNMb3cOy=J%=X>3s3NDL;JNXAZMLY5MEzI3 zUQqx+^Ct&XhN0a^q4)Qz-rL?42IVxz_Mw9WaKi)TZfUdvt<8{8W8b6S$ooS&2=*Wz zI`ur)j{c5l9fEK?VDPU^rGLJ?FjOm&d#Qv3dUw_8H!jLByd%#EzjbF88IK&W` zc83d6=L}$#-?@Ew6Ox};RhY+imu|V@s{@PNMP}b8T0y|{mIVDAXiW%p@EhwqK_HW8 zUjH^05q31^G%bfL(3}ks;pA>vxN!2sMqVTh5(Dd8^_xoVD{e-Yu{B`kEqO18nNmaz z6Cx;5RJc^anNh&heY}k(TJsjd=qiW3k)qm{X7K$+iZ}h><<{DZy_`<4!kVI zkL^WRsRu-)YVN_96`)HA7nW&tC*4436(2HJ#tI5$3&uVT1*84SX{ip(*--W|>`qR9 zn6NVQDVjsh2M2Y6%iYSl5tKJi+mt!y@k|d>#3O!5#;&dhvQ=t;uPfG%9rgieBPDN?B;#$es zX;X3l%b&OXUU_JqbtU!2R?4<(-cMaj-_YJw3~UmMf_^aNL@%je{%}F4tg}59+CM`*tgaI#NaNJeQ;u;;~-9zg?*_< ziaEHBP{<0S7=Y3#6V5ljR-U1>A3J2nRhE-aIrBr8kExn z)ki`3O(C2Kw3cIkspbT9?6Q0tP7t82Nrm|(hkNAtLxi;^7A?x^SaDA%0o|@Daq}Z$ z_zlT9mzsp zoecjwh>x~JrdSyHXTq=2rw;fAb>HOIJWgQljIX{?1kE`uJKdHr+o?_8 zadmMBR5AxcP2C>h!c8|@KY^DCPQIZ{sL$6yn5{;E=`MC?DE+at(%t&U z6-9q3$|}JUSA=02VB=gKWlae>0pgtl48k5B|B*@ss~$6;Ck%mX$REcE#JWMV=W4{M z=Q5K!-?MPbJ96Xu;f7@qEnShHlr$Aq5Jqgbt>mc!Mud`Q{ErdDk!U&lfe2Bt7>OYr zN*}<=ZesxFCp-4|`X0EU;>7Ke!*{VeeIoDUz?W^p8>nte(#He|z;#8N9dlI=gGP@& z=Sb&XSbS_zJ-1WehU3>45N z?V-X_!M8dVY}KWdcd^eOP29c-4?IqUY2pgXhKr3;Atr|emm|6lQDHT{75i7%YKH?d|o12bbsnW;RuS? zI56BU(05PwnO^P*Q(pT)Z<@`js@DDJZ!d%XB%zh}Z$?{zU*igL1929(6J9PZE)5>< z&F}PCO}8J3cbjt_HYCRSldt-2w3H)`E*o(c!#5QTu;>8%rPlLjiQV~uRy?;p)rHVP zQ!%ZjSNk}7QU!cTiWF1_IOUC@If!6^#hXGoT`NC%du`zZ?BxeH^BeEx%rfK;eN25H z+l{q=qKj~KTW|nh`bz8yue2QguD$`5>tG=u&-(}2rEv*jSH^p-Q)3a(12)PEplzhQ zQ`NUS;Vj}R6&`cPpkYlcsB;^ueb=m@+uBkSe=6?s<%iR3(4fqFGTAc&{N)n#I%)wo zHQrNTnbihGAF~U5zOc-D_~@Y4_{`RqYYznfFb)wsyR$8OTF`)@zr>Co@oLb^rF~lw z9@`vq!}l)SQVSHT*4ZnMFFebCHL-x*tor9^*e9C>(d`vv1}~f+*$-A+?8wrzqd0;! zg1M*Aj&A4Ee1HLyaUVQkGiTsWZsog-M3o5ErX*-y_EB5ml)n(s3$i6FUtMCGT@9-NCh` z$hEfZXA-s-3j1^4!IaZ($AqFO?$k6nD)2%0yD7~h7oAdXK}!QcR}UB~hb0AgLp z(n>y-t(|(%RkKWIOc7Q%H(<8$SICa|^|ix4>_Rkne2$xELfT_ipwe@}gD#9kJPZ7x z67(%N7D{^~@ftwg2ueh2oNfl{Eof9(pK%2r?B3Cfjz3|3)-p3#ncng>`ym&t{Im0Y zCF%z`<%OK>ERfB41a?hZ!IwrD`q$U+al|Xdy#ZfvXK8bxcAsJQ(~Hl-!)#LJ{V5JB zEg!%5^g@(;sCn?ztxxpZC2_a|*JMLKfL6E(nqOeFl1_Kz7>YkR_vogJlk)7?gHv|l zo6~dsWz}!)cXJ2XAV~3&gCx^#jj=M7mocUSYQaTYVa|;&p@>_KV{ao45_`(stb5Dd zvMr5}j&WbRa@`D2$!mh%OXCOx0=N(cC}qGv80i8ufPkAV4Jq_5-7o^=6A|xxDEdXf zme2H1ZLOvMD@)XIQK`!>|KJ(V*-LE+FDMh5shzPvK@lwr<})3Y<7eLmIaLh{9M{O| zerii-gH+X;(9IKM1A)8fC3|ru*u#I%6WtrC7f|N?(Pohi`@(C!x2S>m*{?lKxezM# z@qmiFj~CBoMe}QWSV=0QA4C-0$yvvybVmPtAKqUhGD$UA zJO8+{%$SABD;a*ToA~|a?`Ojdd%#$Zs?B70t_|30;WfT(vA=7#u=&Yufw9+XC(um)e;1x z2oN%U;mqA=_1SBT2Jn8kcdkQ!X`$1Qe1CKV^!TmXTJ0}%o79qma5-wN^}#9iZBS}Y z4_21Ved~e3jh96*pj^xS^xqF2bwiR8me=PBclDZ|OX>-tmMT%+wCvIspzkD_ih=Jy z5iT5x?P1xdf&%e4*qe0R@>|02DFoo|#&&mK9x|zo?RIW$oH_F=(2>>uJDS`5+$nTT z#2FV@+_q|o)4Xh0d?^h}u!5Ggg^q*LNXy!zsJT=fi1}(Uh=Vb!*ZUrGZv50NC(p0A zZoK^O_-^-ee{-_~x&Y!dF_%#+bm#pG;u>dyljr~&!XoRHAI>a_4#f%Sqy=~88tIE& zeP@#s9=Nq~AG+9HI4opv*;t?ZM45f>Qfl%WgDLCs#IrY`q{dV?Q;nBjE9pdDF0>0O z2}C3O&r1i2*JzZBj(kDUy_B5BW_hwrIq$sx{;X<2?g+}ER4CCN&Yh2St{ys{r9p&B zo+j9y;a+Z$_~3Z#t$gYO2V!93s)2R8virRzacc^?=KI^7Z))QBX(dO zJTWLp%fJ!O0-C)VY&Kd?*x^AbJun8Jp9ztsZmGTDcT0Uy0yJe6?P`X)*2Ha*s>Pcx z=iG;122J$+Jp}ARlh0MGy9?9n<_#m|(ZNbj%>x!7WWcD$3GwwG#U{m$boP>vaOxUx zSBydiA1IqoyNu%A#ft(=dKro}AU7e@g9B9uKX}u*x5~Q+?<(%SWTm}08V@(G4X~_n z3~C zcr4Gjazb%924hT?cIs!$7wS-tQ4qwxRT?0Cx{BjO0nnBpZL;x@Ic?FepRTv7a)O2n94ry|J8I(##7;i1Wb7pr&)2EN3e2JzVz&m?e>^@N%;EZ~KvP@&Tf0mEpNhB z=7HrV*Hwk0!g|Anbppc56@NPi8%1yqtoCB}apa$Y8k;)aQFZX2>w*6=|BuxV&}L^XN|1{z6$x0xjb0IUudMijD%c28jGSg* zS0*OR{*F(gC;$6%#!PSIFoAo-w9+H@=kiDGj$9+j%}Vnke&saHbF(VsL>!k8n!YwP zcjD-yM!Oz`16ImY1Fc_=2fLD>R$x$$Jr&qQctVS-fE!DAAEHfx6V>a7~K zosYTm70((t0@+u!SMUpP6Bt<39nfbhNYTD0-#jY8?1l50WBPgafs?(6O&>#Sx+n|S z^jhBkapW&1dK`xc2)zdUH}xpW8u}-fISonVT|vwa^wej56$)(Ai8JrGgSi~V`irme zK!?^CVD?&okNc8fokE0nr1t4)Goe4~gd8-_XQWjAi&@}COu3Bsq{i+> zxJ#pfLu{dziVxIHHQqT;$4*G+nVZ{Qs{eA#XXtgxng!q#0 z4N`cTK}~NP{L3|n&^NX@T<+{HyWzVx8n6~XzeCtG7+MRN0g8lu(BfW4$fz`DY^B@O zx0MoWKnXCw%2)#q5SU$;0$wwBybWv>Tuo)0!+G!S)#!A{IT#2{B;IIO1V#KQ&oO}oLT#yR*`2wR6{{fS8=Es4%SZz+SNNw_Y#Ae9H9U<%* zP$;Kuz@iVIgqAQt$_0STU3a#(&UMGjcsfS6GKz+S7rO8LeWD2nNR6)Z&$tORq+Ui4 z;1?QvL&$7lWFLp_?l#!Ri;r^aRuiQJ>tg4UI+M602~@aIyC$lE>ckX4FYViIt0neO0iPbE6LgST2Q zQ2WN1i^}UB{N9?uceUTw#S9+>dzXT4alv!3A{hKm;(OlTP!ubLm{~{laxPS;EPP9B zNYVe@jf{)T6MV&WCOn8HFqhRn<^xCg`}M3#A`twu!uu2ozq>G~w!=RDze=h89(e@G zq6pjjF#rU|!NYnB|DI?h8iDPx!{NFIGb|22^S>&1ntsL1d>a8>v_Y0-IU#o#yL)A>0k~XUM5GfWF&^>~t^bLQ;5X7Zf+)l4eO6}h z_c-J-{tmSWbX1TdQF|ciB>d*?p(4%vOC`1_$ie|YEZXAmfQy70lNV!Dgab|gRXaX# z=A|II0BTir(^Y7$b>$??NkJX)MaV)P17orKhvtU}VN4=%a82*)9aVSyt9}_fmfp#y z&XGO3Cw%QU84hM5?L4et$I^35Ui)*Ab@dzRkl}5W%WZ9ISGq?wSIMMS!e@u{M;=_K zbaHKwu0o^giZ0)+UpzPFi{o;o3RcF9GR1$A3g?la;yJ?ks-f zB6O&V1qcKOi&@){&MJ3sowbRYIG2zfby7X^?EY9oVwwi;m8aUu*t5zecWkt#7fg5T z*f(car6va_t2UFW*M8)FotY_W^BMBY_09db_IcC0>(Zc6OrhiP)q|gHJ~5Kf%ejj5QeC2rfff_T;sXul)X!sPhk0~B?>t3wwT}5fS z#$3!yHRk&iQz*t`uJ2Q3DiAXRP3AytU_>2}ERY)-!TOTv`m{ph@9VJGA=KWT! zE!k7K^HYZ&rbdLkMC-W2shuB6O<|ZUrr4^LEJY0QLdU0P`u%ci1JPH$T4p957BL-= z|GB92wZH7SX0r4tC%NuVXfE)a2!L5X1t zlAk+R>f6VT#vgFGydR75U7i||c;+>cV4bvl+_117s-B5Yj0|(}Iy4g_ZN}s|2%m5B~))OM1JfE+}Uz~n9`Akr{gi29DOdI0z=r-Vy4X$^jc#$ ze@Qv_+8k+hGRs6FaN1*Yv@-c%2&Ujf+y0g6d^&hMg^oRF0&!4r!?r8u8nT1H-uEie z%8dscvGV+w9x2^?TKn76XL*Hy-}@ncd(EFA12;^;$Av!-u69USk>V`o23L*fl!D&X zg)|n=~JW-0INIcG-DQcK``%pWbW zk#eg&j1JWg*bkEx9$a`a7O9aYfIkp6U%N)7iGp<5i~iNM45F|>{>!v`FPWuWGyEaS znD75%Cdv6V)jTd7P*)#=w(Q6y&z9q524FY_CM2r73f-n*cg%UnBm<7zf};iIYeilR zlUFWxs3#jkf=a;eY(+ZU;$?WRFCSmfp}=xs$;0^P7t%rl?FX)nWp7!S7;!LvpZ}D% z@%pfT32#0BSG^y~H+Ls+c&pxxHn%m?yY%O6Yax`jOjBTJ_~X5UNpTWTr=h{H08A>HkRJn$OJ zBrodPI182@?tE);dMXkYy9<33=Iw3uSmcdzohv_E5U8uU=H@vX8g^-}w)APk{1qkN zpOTj9KO0kTFE$2$9=$7==e(daJC(O25(HsiKfFj040@O{%17;FI}^N52A(z&b3pWU zReHLh3%p!-jZeh$mC9W1RGkWL+H4=6g@1jSkGIS1e|V84`P!gO;MmXN6*i9-=^|ZD z>pQLXuE&%@4wgX2@CuQl@0AoptXTH?>!c;X!R2llwLsl?%Ju-|=K#%7T}~y6EHqIH z0x~h~zOD0PD*aw55Z2J9_ETXiW#x~F#9SaadgV#-e!#kP6ItD5~q11K)U2SaQa z=v%q`Pp=KQMgfC5!1)l4sdr@-sy=S4&Lti__O_7k#W#C1$cTHE$<*8%bun4qxi{#$ zP@N|S4J171#nG|Y;Yg_o=7!UHMm+roTYwkoqgOpLlIAhnsBPZF*v99hO3_mmG&$fo zM8k=sntKh~~HzE6%6wfp{pY15aEX58C;JO1Lx zx03T$zjn7B-*;;ddK3CvmQS7h9>Oz)+q{y~>si0RJG$W3cP-nnztq7bRqAu(w)4U* zTKOKZdE)_`7O|;;+fpq!G2;94+H&q?EsS`L+1eRWef`p>LFI?%V5=T}I-+N-%ypEK zF&MMtde1)p&rQe@4TNn&G9!s`qgbZv!#8w9F}Ed-3HACLO_k#L7Y(^(pJ(0&PTbxE zSX~B-eNgSbaIzqNJOyl-tIkPXRU%)rm&eY` z;}rxUkc2ySLm6agu&j-058?J)VK|F9C@TLor^tTf_3gtd71Izvn*>Tx0ZVY-v`dmkwU6h(`@-JE&$T*6~X^?lSEI1i(TirL|g zYB2__63&C#c*A7IoG6brlW%1%fWr_xlg2;lk0;7^bPeFpbJlrFN6;M*RaEt3P)DzZ z1CY2PsF&kBNfOt#>wG*?k#rG5wBb!!NB{9;qSh>M%e~=Sl+wXo8YX(piGZ97*Cr;X zvr~of?c?>TZG5aUF zu0k5Eo>Lhn3_+bc+rh%FgF(w*KIxmePv=wWGLu3d(>>xPf4k0g+1W}Xv`cphO>nAS ziK|}ivs)d$MJsKXmM^1Vw%^#J_ljP&R??dpCy%$?X)nXpY~y?G?014%+z;!c9h;f<| z{y;`zM?ApG_nChziM_vb0=r4KAAPwvLf~-aTZT{Hzm64>>XSBJey3y56)^mGM-fer zEfJXQnE5D}&QCpinfVR|MNle@;@hA2gX?@_r1trDVHmCW6R(tM%B`)=uqM#T?kgV& zl`sq4NOo;LD!dhqLz6;rZK(=Fa~tfSMEc zAo0rh07L3%K21+^wdQ5)r*bv+UV)wPjuJU}uX7xEK?)Oc7HQyX6MCqS11zKH>pMT%0tdti21JRzOm(KRNFtNR`?#yOP_-$-g7|k&Xlq($ zG0hK@(yT%`$(4c`&5;D@f5+d6zzF9 zBG$24#}2DOENp!3mOvYN!kFhgFMdtAk%yPqYDcHpMIfa$Gw1WcByRX@dsFh!_u%m1 zdAD$d65?gkS&dxXOPS<}-HW&Py4@I?{mFD7%SA>pN`xSqt=^MB-ZOI5@He9tTr+;Uz&btTML~P0j! zQQA-E@~h4!iWn}xs(uyRWMXyOW;r&k3U5+ zMNLzi?TreUqb>|j`W{k{{oyJ_@|2ASiJ3+7o$%d8IbOnxrZ}9FIcDr-)U8g!tNh^%X&7=i4tQ+fe#x1cj*>W-^g}duhWz+rd?E|>(q~x(rf-;{%HsmKRB(JEGo7tZXes}g<9`#g8l@LDzO=K) z{+yD}ahYoyW1KxBvF_nDwUmtXe0^s(&}gjM7{o%Q{mgGjSk45c(5;Q;MrtAo8=hKZ zckE~iRuk`y9qs)Ri?g!A5DT(3ar}Wrdx;TVOBF6OuazGK4%`!+pbp8w5OF80-O(4Z ziV2dEpS{wfCDcqM^1i8FcIFJE*lTtb%Ng{_E9zj2EdNrI0jXKzRR!#4`w#7PUAnMU1AOvZHZS)~*kzZHBYkcJU$2zM@BC|Nq$TEerZ;T`uysYg2a6B#jhTHREN}Gq`GtdOsDbpFp1Q}GI~u%T*UG7 zu0)-(teSPL|5Ie6UG;MQVPdCZ$1=7iP8c~aFZ!xNsZm`**cq}X6g07^$GE9$g_|Dy=0l_1|DOa2B9 zXZF#RiA1LgP0bz(Xm)_otXdxpGwI`=?J>AxbLdGp_KO2MXr?)b*iT(+c|2R=ty^ezPh=rTQhq(+>iTdBh&t3vL9pH z?&ABNEzk!Gh0ae5QgCW zIy($P5i}JJb&3|ntuuF3xBm)Zj&bRJTSj~J~jW-gYMpzijtmwf4_zJQ(e~Y zwD+`Q<;3q%&>3{eX8C@b#P~=>WY=c+yK3w?S~P9?(?@rx?eCaPawW0!xr=^wAU+0E)>$7RZOA3CTVox5=Rkz9r_ zsqeu&?_|Yjh(!{XGYTm-J#bG8Q zu6XE&@DYHfaWVQs|CwHE&+7duE7z}vk6FLo_%zG<#!#hL>LKy}F3Xz&zQXxxRE>7PIU4@lfFUW=)YTsAq8~NpbPP z9=Ycj!m9?gQ_64}LNG63&(^|4gP(O%swuq0+}l*1MQluu%shv4pe~dOx8zYB@It0W?C^L=)oxq5) zY*+8U6=<;4ScExvq% z6lM>APtP-shBpr5`nHXVKWR8mNvM49w=tnakX^m_IvR_8zsLdw0Z<9v#(to=^c6B# zIX~TV%)~anLYD&e$W8jtnEK25kK^Emk1;d?-{o3c=jfY)A-aczvhPb+T^LemD1`&( zn(}HkY{wRL4$@{iKjsT@F7y|9&8&{ z+$3Co3WQ&GVN|uuEUh zhk&#X@^qeI7}C{d$LtIONQaM)^?}l=;=-q2tkP&4qUGs>Q>W^6WzNOutRwQQls%(^=Rfplq7+ zSa#$q=q4u08Xs;AZC#a7zAH0VKvh^8CS1`7f#p|;$0JE9W)+?bj`vM{rXAV3aVTon znd#nX97NQS=}+YeH^5OKUyKsu-f{I_kuMkRPz2^Yh>i>RwyuLPcRtYVGn&_DjMYP% z9W>@hOez72_;6A5>(HO4?0Y`s;+Lnhk#PF@_+FWZ90BViV3Q;&KMnbT1A6B0!fLPh*MjpXTFQMBcFP` z?yQy~$)J({MuiADOdIkQb(rET5sO1O0xFjFDiCH$lNncBeh)WHJ$>+3Z_ zb|yZa=O@1%4Wm`kanrwk_Cy;7-LQPj5vte$Yml$?++*(FcZ80zgQqc0hw2+H@^%>G0mHw3wgLa} zMB&a%5G95N2JJX-n-!?vf395)_xtXYw21&Y`XMfD;-B>hizR~-etRS0i4TT+kBTC( zo?PkqK47x{Uaz5wHgMTTk2)jZv0=bJe_s$CwL!5YL;%xM208Lez_>YpV0@3-_y;B0 zlD#ynJz*j>Hc&}o_pWpRXdabnNHSKWG9A^e7p`8`UCV~r2B?q`-Q3<>aDX$}B(5|w z_Jd6x@E=V9HCG9wC3`{mI9em0Laik;ck-ET=G_S3J5yRN=u@E1!Yt9{R6P0TE^knd z3kDUF>LCV$O0Of=;MA{7|E-m7(KGMkMeATGx%dK^hLCHkaC?Se+vkAzCmKUEP(E|Zz9R$gV#4P11vJG5VTX^y;d+<8nLgb> z(@6(;@qWv^Z(0bUV({n4Mz$H2SKsc&8tmbxtIC@A@6S)QIs0QVDPE(5RbT}AfX1*# z(pr!pH-h-x{^boa;MCf#JU9c!*d>)g({Ftw~&`IH7pkgew@?748?ob zM`f{z_m`J_p#QhG-Th23VW2GM*jPoZeT?d z;LO~2&9Q=$Gf?;P4(c{ib)JL#!DF1LTH&i4*TCWX4)H`~1Fm6V88k;uJC`MVc;RA+ z@Q9m9kB5OKaqKpBiwHy40GB#%-Dr^`=Cf=gGo2AV`JcNDMPExe4or3Zfp)!b>`H)?$>$Z6 z`PuEm!p2h_@}PCI0J^f;Xs8EHPTd5AY+TJnGAOjddj?wNKq*iuq^muTcNBw)aIMzN zYh+JZ*CK&GC4VeZ=6wnro7Y{F)AhYQ5gqA&>Cd&?zv~8cG3^mK^Aq3yVf)Fo*u+b%^vHv49U24X9#{hZP7 z;jvtv6evDu`LdcAHl-W~y7S6Y0Z`7<6opN*gI&{d;Wn9~ zZAW?7wG>W6lM%&SiQzd_g+WJR_YqbLH0Qx~4;*{~N7%a1t9r;s2w{JorUubcgL(d~ zqdM}DO_!OvfGMvqG2EJvF>aBIYKJ6B`IvB26Pr_2d&yB<6u)-L?1r+>S4axYK_bId zCaELj#HMkjhl6J%PeY)PX;lw^y|@BF`_I`S^IYWLkjztqdda`uF3VqU*W+6qEu2fr z&EYj1B-)0jI1x@G!e_;nNfbjq-G*OwCa}T`m&}`Dw@<4&1GM+}np<{Ny8lCW z_Cf2T=-aC7?lFhJ4*`VQcR%Is6!;0Vgtrlv{7AWhJFhjdH1 zHF&D_Phs->qB-&(1JHSky}Xg&+JzFoo$C*6t~p-O9pcp;EZ(9p zBD9Zz51e%TNq3RmcPhXPV8CwzxN7TRALAMnKomhoIgQ~2}{e|Y0PZj5osX;^VU}_?} zYw;8*bd%s-j>_M#t)av)z|hgxPIeyNo##d*PM?1&qEMog=ajsd)IV9<2+z^YeaRzuv}NDfZl&l zn0%q`U;C*Q-r`5U8=vIp8?|92{mjU<{tcT$6)gY{Gt^!5JQQ>m4-j7<#3cFfKfw@A z9De^K+c|etiv1*5R$S9xd;hhp4#Iq$KH|;<^A!kJIYqNO*<33y==s0{pZ=uBA;>&~ zW&bJc?uvEQgt(;#1a4o!^Qim@4NPniSL6@gR03q2iE_Rkd90pDiVV&%v;VpNt-NCU zae8DSBx>uc;(Q}P=B~f?Ng3|N5LuTV|FKLcHBp>?i)V~LgBdHJ^ZKCl6xTDTjNt+YrXcKzV3+AqKJNdGSf7LW1~{|iky6Md=mnDt zsz8sKC)s^qne6qAU2cEMG5iQ+OII6?xP{v-Ktw(pt8ZE`nd18%X_mhh3JItdDC4oD zm0OOQtKHe|0!*mC26@VSXpY<`zd36O$#d8CP5_^EDc%z-{4K;xsH5|M(<&=$rfW9m z?T}3CiYZ8UI#Ug2&OE|!;e}%A^0a=(92qP@!RqJ^cSKPEiA4uUA?ks;55PgP|Icp? zj{HdVGBbSxVAuXH_styPCMq{`{5My-^39d_9b(|jJk~T^Ii&1oTSRJ$0TCHMZPFY- z0r4&s4^a2=lys_(LN?X`iU$+!(1@;(*5MaVze)l@34=m#5!3|a$rE+zSAl^mgDCuT z6Wb}<3w-zt8X&2PK>jK-ok;_wk0m_!WII51_9fuX2UFK3-n^ky|J8)b8i;)*K%~SU zExQAm$YN;0{t+QpnB0|d7qMKQU{9QPsP8o0-K;&yim!Qzj|U*yNb0Fx=`s>+cnJCe z3AYIie)WK&1h0>p^nz)A0Sw8r5_wXavqdJDXxu1t*RY4)$x`oW(20@*&bK~+syOpC4mVT?yDa`qv$g$@wD zV9sPN_13{o{QF&PjHcX@~mtqpwh%=I#bxclL;I1*b30+ zfGU7emv$^?$?}R9-x@|t?ZSCw3S9ztmsk~bheQ8ZD!QN^eDSH~SToN#P(%*C#~Dry#5cBpj8firuh z(6?grb=B$HAVigV0u}s~Mojp=XJ*mN{(-tyo6FN<*!W^SGY;=@dj3Mm!RyhRQ@5E+ zok<$~JYh@|21`%zAhQ6tnN7~97F3?;wAOUNikC13?C4@tCh zFM;&y2^I!ZOV2F*jZzWbk}4J(Nb$C)P2SF)OUaz+eA*RUya;wW6jONX@qH}%Ue1c; z)@3Vm>+@;$_OfHtmBCtx60HHSsASbG!15Yn=m}T4FPg1~r{0DUTSy&h8L@-sVQsU+ z+Wu(H_-WriYdh$*7S~BUW{%XU-L=3Dm`x8Pnld0p8Z2Oh3i^B~jg;xK|D&#e0sE)I z#uN{~DfS~>HCQxpB@}G<|sOF92nKJX<*W4%}OV9B>y@kFa+ZdC;++o=QHO7e7hPK)Jv)~ z(aL{Io)nr?&`Z;xnqN*MlDeH#Pc2gQL79P8e*JQp{337zu19mQ?B9O5&?ZL8!{#`weM{BtYc69tK1;WT->R!W9TSbfJ09tENq|ef~Q%8 z)f0G(c-mobqom+3)k?EP#UtDMpFdZSGZGowUc+6sd*(BO;1T zK#2PR9Zhh3bi72PX|~GY^J@QxcpiTJv=gFcr8GqCxv+cBSgs$i(4w6*I??nvL-KDK ziCOmipPc_$bU^I6Aqa)@vb#3LQZziD!nLo4y9gx;LC*EgpG-hD1F-pUv$=luZ(!5` zKv}eP?}b5npnSnK;Wm6qci+LksP17-B+>fkzXtV3789q^iXsK+4qW8gowGFmB9M)d zm;he>0E8I{?Ki*-_d&Ars+s>vZ0oN@_Uvu4N8dHQOtnL73ITq3d9+{ClxXETSx?$r z7O7cJ+X8K*`Jmn!eNZvnnMRBG#q8fpU_VRH2h2Apqb~*l+9d*t_bt{qywP~yUfqUy1~Hb1_iI7Nx;{%xSHAjjg(p62?BPg5fjr#I6sfpQ{4vX zDiO1w^eI4aNoFHT3bTY~6ptGKmZ%59@GF4##I082Eh9x!8mN~*F*df5h98X$p#Yyx;agClTr1n|r8@lfgByiiPBJhk!TousfpgW1L|vq@&EqjQ=?U zpGH1N6y8Oi9;M`u11%2`@!e`*{jde#$L0eDLe9$Aj6nfqa(tmFJ(>J$ejQ>ZwXi@9 zoIsZQTOIw>-Q^wu&;!xVOF+XCeh(z$q!EBv6rPy3zqZ#EN_sTCkdKNWU#3>+HlOne7g%gRveoKuAD@9HAeopP#>9a2=i zZ1eBfO_~n(0<#gL*~Rz%!KoI}F>!QoM%aAiLX93MD(~kJa=2}z@aXAe1l_QE4!8)% z#@L|KnjYXJDj($=YJt0+1@g849N>q{;`yEe9?N&37eLDX))ricuBrbcc0l|=a!H)pNuG{`gA7XkkY}VjhY^+RydJT;W-&|vK|wj9+z4C6O1`l1 zsstiTP!}02vAd7ZrI`;&eF@2!!blfjhfA+d>#j-4JVgg)9*eu9j6EoqmQ8k zKRbnvGC+(JqV4-l4{|9`VvJGvPqIJ8qs1likh1>%{44%1dM4%@tnBJ zBr@M6gMOWzEI76Vy5NqaAA4)I$8rMl=*C#N3 zc4=VO(kePu!=bC*Z0qqQBU-DFKgH{{W7W5};jJ#N3MV0>9|C3hs0~ElS1IJXMUTx+7Q2VQu60^sCUe-q8H0&@W8Z1LUCpy(6a1(M4 zS($LLb^M~9t^(&AVHDEnm|^cK4t3OJM#s_`^3sl&kMI&H`DEe{^dtOfIhaAqS?0bg zJ6g3IqB4`<@8y#zZZgkNI^zNdJk-DR9&tNU8Py0OLO(3}ab2Tp`?}jz&<_>1mZRqY zZ+U#WsBd_C{~@4Eg>wMIr*iQ}NvN_AO6^P;ge$!mZNJ@(XrFsTZbu=ahf1dVT zoz?i+bNS8%?Z~oWgS$YSzlXg273h@YA~wZCuve+8IOD-~#f{BW9@1z`re2T2_&EF) zUkT?jc=OzjeVh)Uj+hbeDzqoD-Pw3=`&*cvzTBV;x^}B{HV=U>>(to8BLF+Gq>?a3 zbQ<;q(X8){IA|xobf_EdD+lD>56tOwU)v=Wj4n{uJjg8{abNjg-Mx7{lzsa?UZN&i z%plo{F|t$?DJ1J)h7d}~Qr2XtgtAA}jD5zwL`kwGYqn^UtjV6eP?juNvZlW0)f0K1 z-*bPzpV#l7@9X!wU$48|_l%kAdSCD5Jdg7@j#Gc_l6z2t`k3bJq$OS`YPrG8?aphC zST|h`z`0N@in(+LmAnytnSEPQ$!cW^dukY>8HN>R#tmo`@_eNuOTzvxMP_DrzdWV= zniBW+trh#pnf&&!Sz^KT(97PpsB5XOf%*jPs`}Ek-bvenJ}8a^z3>8ot`Q1^LpI!>4!Rxvi1#$x@(&@o)4} zCGHK;Jy;t&24yGPb~t!5AV0f22aMDXFwC)?8|#Q+KMMyqIK{;q0VIQ*UYjr7pkS3U zAsd3gM*18SP*QA=`de4wWysP>=t`o5Aj`o8!)RQ!b+TIbZ6beG?L~<43ov}DALO@i znTua)$!^v-UJu2n%a9#h!Kz4txMLhZgS;;L(t1E)(W!~Z;k2$a7n4;C82>n!Yvlq} zUEqD$X(B|qS798;W*NuV4UH!f*CPlG5SHs&>}9@!A%uE@bO*GQkNzrS!A~wOx0W$1 zg1VQ4_ZhVJE2uH*=_wnmK=}EuK_plqd)^BqkWuy@0dD@~a7z-|!FIGM*dKV+c zKOmF*$k?$_sV(EINL0FO-Ql-I>cF^K!EQX1j5vll58uBd#e<(^6sdt*K^XO=#C|B+PHJl} zb|6{{sA~cDR}9(d$J@?bu4mL34E!FBBuR*vj5tEaYWT6!|9tLGiuO7bM*~|ME@+lt z2(=k!gqtz>{MW?j;__oqtAM)M6!-zx(+WvKjV)@z#T5?+mK18n1s}zmB6V7$Qs;-` zv^sC;S>e_`v0whamb`JFKyD4F$Rll-+|5%^;_Xz&%y-&|@ZU~!pC&Wq>+zL3HV+d_ zq2St`B0=f~a`~|R+5C%ItX$@sIDH${xG1$YS;dv0YYPZ`3t(2B#>BzCbofUFoE_!))V{(J0^ptNvWI9Q%1dhydIF;{qi%BUZmb7ZNn3 zO^8eDy}5CdEevS^V3bzw8hc43ga9&O)tz{x4M4)))JY(h0?yrcP?YqeEluYw`%&9r zZEKi!s;rL(pL@XwzmopdGJgcYg!49@x&AkA;QLpk1Cp7bgHSp>M#Q}dyQ_tM1Pe;) z3wH%C842vnSDU_7v10>l3L?Tp z097A4fo{@h8H_6sKs-}3QAQWMOx!@vvGG+8 z5%>?W$6qBO{EcTfuJT*Sza!!eIvyX%xQ4lA5Ju|G`LsQ*4$)s11d#S|G(dbMk&UDA z7GooGQ@{9s{HMW6IEY)?v&seFgVxx!>WPxK2M~G%Bte}J{!`-44YQ*Ou5jul@5PG$ zF6aDf9y>rfT!+@`6@pHlHNi4V7Xe~UD7e`8>Tc}XLwSaNuS{T)IqIBy%@_wbEum7WNYlZGdG4=W>{bZ;Q<8n?djy1D{}}oDP6JV<=Sb z3G~j8g3$DyxZXM&__6yRBL%R3fGW+5GE&rW;ARZLP4CPRA!C$I@GgY2{EIQDUjLte zXVhgPAxtn5!uSf1yH)!>&?RdBGq&;^dAmyn0?1TR1@5iQL-?T@Sz+#GNxR5$H5d|q z&k>8`X}8y%jIl_~ZgE3~8#Xi%&do*QxrTLPRDneQw=*V$X#9|3`yQU_NjPpBol z-}>mi(O?ua4rZ2oQ+wXuIEb4Q9@Q0zQDL}-U+^iH*w@emlH4ehKrYlojnewI17L#Z zWONk90gy$HeUc(l7(BE<of<& zV=_Vp(@~)mLRQr^2gF6-HvmVvZDFR<=E>)-^T|oLUhr_7gX~&TvUc)S-cIRna$i9= zT=~HIEt^&R1w=NuJa%)_j%=_EZVCq3#@Eh*3Lv;5VOVqM4C~6$_SaST@nh^z1m|F}k2Z#o`;65DKK$5^}<1y$r<^o_S zTL@=QC%{28;{2e>Gp(S=6v7GhzKr^iiaV^YtT4Xrfp;S{NHDlm<~ZS+@0Ml+94{L! zuuXXkhD>cwOk_C@otN831i^L+#2dNO#F8p9GxJW?{OWz z{}e3D5m_K0>GHxJ&5z=ME8GVWp;@w1B;3I-cve^M@ac zGe)uY=F4zo8DxNKDHjsn#DH=y8x+{rj>{PX`k?R@*M0_b6=rNs3l^mDN@oJhYBhWs{j7rP|bJugvebb#sRqL2nV96I&&f>%D19$sG0&X`9Vv3K^tWG73J)+-!)b zu>i2G>W);c2ck;>!#v9F!Gq%vA5MHuaKj$`X~9)JXpFGLs2|dF_~)lX92YQ9dM-lX zg3UYkjAae+B?|0t_}aW1z1R4I{+73{%6OKINIh;0;bw>S>)m3;V<^^52Pm}ICnPoC zB6aswaWyS5hmG zG!P1s7D(_v^93Lhq>f(dnQ2sd)Jytdki5RDCf41t~=NZwEN-M5i8=#ApaI$T_Ifn|CJ)?3}&|0)wIk zMj`wiQbb5BLQHymd9b(9rUuIacplcLipNgT!QFfBE5DmcD&oA8A)!nze6A`}R1%8E zh(aeQ1#H3iLyMk=j^b%4f|UU<>^lIVBu9uK!~o#AcM;Kk!<+|-e?dq;D#JUf8XkP{ zss@#id>IyVRs)63#Z356Br|P5klko&#!z|a&7GW9bOP)4V zdC*5dEwkUG4b5Txf)%TXQXCXB1AsUzUnG|i4f(c5PeJ|`7kT^-;m75|BafbSyQT%T zmdE3!@|!iTiK@in8XKz=XvtCbA|bO|_hc)De>?*mWY&##!1yR_$x}9DjIQ$e$ivlW zvj9cE@xj31y?pzLI4q!?|3==KI&8sG*;v}3 zJZWE3hL#@X@%7x!JrkTNHWNI@_y&iq^J3Ch(qmH_-1DhEoi--Uv-hxbRf5P=pcOm^ z4z{6;tP-Jx=U3E($<`sfN8L;8{5t+d+&JWcBD){oDFl?)LCZ;pnaLV>1g%jF_ z`c}&3m<#6zxZ0|evLccbqVfToI8i(I8Anboq(0r6H@sbwu?49&C=HV~V9N;XUSa!) zaRfDs*WBju{rYdE99};mB95D41*|#zop%Pca;X)=ZV0_Ym@cx%MpASWWgj1_VBmrL zy^Ylx7z)o9hU2c-ObQ(lUrsW7H4G{E6?FG-{f!^dyaBLPWpQ{l*?NSxhFCaLM($k` z%Wz?JlpZnBpjJh(u>dMB79CeCT3sBXI)m@KSt5HjaYgN0%dsGf^dz+Ov2EsthW}xh*&+U%0*= zR;UOpxS3pnl|@}MKOIrU;i0~nSf_?V^H^?57_Q=!&h0GP*QR&n#H*zi9nE3^-ml^- zl`?n?Tdkhf1+OP?$@_`hq!NIaTmHhY&-=6>wc<3J;QEWr-N#sho5uD+JtwMn=vX#6 zvI2~fiwIbXl-GGF^+7SuFMN%YC#!c*$BfxBa8lGNF^WXesWBA$q!tD)b=<0lvr!cr zt|K;MRwJ>HU zgbXkp-M0pWq4-_AP3tW%ntDIj-Y&2P-6v~*MS!dzX)K-Wn0@XuI4CDtUvCD@jP)j) zjrw~D6`?4Bw1iB3Tz#0R`@**aTiuBG=m#eEI@p-Do>$!E{Mx+m9mGam<2S0On3Hob zbiCWcoJh9juasqygK~qz@->=ViO)~M6M<|QM|r@PyWeAJ_UekcN_)2|)&?t?$K)Bv zP=^fw{R)?K5+H<^e*ffQqDOBA1Juf+D4~xwJd+@W5e2Y-OcT$ngz8#o~6?sFUR;kINrM)z;rf*85 zgLf_fC?*#Cf{=`B;@6ha|8=K`M;f6fb)h4eTdJ%AOX`h%7gD< z+0E@th>YSJeal2lmKidBbxZ8f3I#)Hco>8~u@V!7lo|q@sY$9^MUUl$;V01M(qu<$ zC4ZuOZroeS5bo86;6TZ1GH3j8htDXhj<2DcjNX}B0mG*|OPkC4LW>7K6KZfYp*ro# z81i%ztlz$m&m#Yj)UvJ!7r`VQdruycp)-p5PRbloe|TCanh1>JFT;!L#_l>KO3%bv zxUeY3`@9FE>YWMIpRc&JVW%aJ7koKQlE~$-9@Gz(Gb`A(d)F-s!6h zN;Y=Y9>OZzzMeQ6`j?{mCq`?X2 z4}U-ZHux}NFr-x5jxOrUL_&3e*?=!>w7;8^f|w0|8t z5gXc13$7zm8&A(DamSzpsL>}M+<*EvU6-4HF}U_t{Vb%v72HsL$X}P7{GX~1Fa}wT zBMMNbxCp$8dJwR$rrm_~yb6F_7Mj#V5O)nsr{@V?3FChx$1X)7bdzVl=_Z^gKr(+Q zj;ST#wHi<|7Jsy)|D~z}ySM4L;@_-Y9#w2%6KGBzh5sWD<}*U_z0#X52;-HDqfh-? zw<5_+!>roZ7oDo~+mDQROua)R{nOfM!?S8ItdDIZ&VbT~7o@qf7t;5j(JDNFjdnHIXg!LIyZxL&@MBLOw(ixfzzvpsY9# z`TA2RnTQM&=fhu<`Cup03a&49;P{dYknXv@a*xMQyqWO2qrc?s={Qk4N7J_q}N zWyyEoCyY^4_T)ebQL0YG((MUQ`pl8ftB%D#to_u z-G*5}Y}mI45%R=oBF%@Ohm9T_UbYawB5*~?VNJhRlT}cWne^N7XSmELY9Ag9EXlM{_Vx4$3PxsGqT)c=sxuZ_@zgdL3I)@y%#*)CKzr( z=Yuu zo6x{E`c2OO5^ERmSF@*ma*_4EK0w9Zs-_2~;XhL$y{UJd9j1tE3cHK@ zqP8h%4@69d!5J`js;``Tk?;y?=7>m6bw9Bim=Ly5NY@xe`USLGB-J3kGyx0WCt;XA zo!>DDJd6|^kZ+ni&!n`WZTuV%b%QMA|LUZE{%USR_ z3??w@OobDWr6-0cBPm<BSfy`(AziV*`V6xT z0A%4+B)~C}OKEHeSy#JKG~!EyvjFH#Lkiqna?jNqb|>|MZ^}UJLi3iS(sH~QlHwV1 z5LtzFQUU`uhxNN7CS-?e(huoM2MFY{$}Y)YI?_-l_!+T*a6<>hL)VK+!WQCF(+H|RU#phjE zn1)m}GKWsi@N|)xrxb~%r?k`8DhB{8s{tdC#EC%sI-SP4J)o>F>~W4`5>DR9W>(KV z-2^xUzXo$#L5J8VdG@LbcV4w;0irk8It{#11)N#a=0=1;84ad0!55m@GvfQ z!>gJ?`xh|cn6`hsTU*ifo=6qF)_nre9q^|3Dh;UG7Fa{t?5JJCP|TVWzoZ3~XTWV( zM>4Ap`H5eiM2nb zA){olRh`lzxg;sOkgGLbOR#&EBFfcaK&bU(WFV5 zxBVeDIoS*Q121yHk8|dj=%}AaEZS5TnsabKPl6TL<0_?IL$X*p#FM4Z(&^`@k`gP* zPl!;qj1jBL%WMiN!qPm6^PW&xp0eK-9R`SE4UU{2*SBTI-OtzQ=YCAk-sQ*dWjouc6e%aIMBTmfVCy;t z^dK&jpNQi_69+9Mb^VPUqi)$7_@pv&UC?2nM=Kn4zi=%=@6DsDfQdbP3cF3Tlc}BI z3`Dveu$dd?*G7TJU7)#Ayo&o3zU2y{g$*)wlm&mcpk3T;Tc|WHP+PPjuu{a5RDMi7 zqu^!uYsk{4KKR}d7=`IQWX_X;5hN2VfXF`%vQS5wdM5&E-aj0lcw5S*?La9^K2duk zK>ig|pmuHdV+_gE`|?*-(U^dcqrcoHpokvsi0gDb2m&Li66p-0-@@o?kou@9sT??_NmRB#j{i3it5 z>mK8Q;lz=zCFu<|&wSDLGbVIFlV|A6N+ng=G0=^?x z2-1trlSwxSTg|*fnLf=Nk6(iPP_7f7d`y%t`sy+qd)*S;TKJbF2@HBh@NWL54y#+c zMaahcphwO`QY6JsU{}+p&xZ|?6G4O#Wm(gQa1#S6Kc9XkXBDCA?~V-!WbuNkc(w2- z>A+&@;g#R4Y)(HG8-oYU53E%n;m+G_h5Imx{o18z9!W}Km1|PIpz6!!Z5jL`-fbbZ zFbY2yKWv$gs}$3Osq*Cu+wom*;qaY$uWht0c+;S9q2f!zqa1ax=kY_(vuE@tVuQ{^ zuf4s4Ku4VN3nwI98k12~yRy+Sb4rJK5c+4j&a{LpDV5#YA9&b%6IR*wlG98YVYU`8fm0Ic)G>&MJ^ z8r^^1=B58iZ{|7q0B=QdB=!;E1WmBvOzF!77pQ~}DnFa?oi$r}Q__3`vame{>HAl+ z0@zZCu%$*v1=$dCcpU)oQyw9uXTLkBjX5E6bo}F+m?}0?bTKc#6C;B!U_Gm8do8Q83T%YrxXf#-q0-87E6q4cPTb zu2b7Y$O+X(*LzrI#!hMP|1M0r~0Dw~vnsAfg&!@_W)@9>)XT|`xzOdm$9jqRz|?5f(f9vALn9b!>L-<_EY zC;T5lk@fz=l69ePJYpT-B1v=WE)RMuzJj&w6MEx7_M#qj_$v=jvJaMrG7|W6$n%ae zF679|Zq+0cmFh}KeWg^Nxz~LGcg0sWPL!85(o`t(+G;bE?L%*c1z^aLg3IM$q^KVC zp5pj`S4%PptGbHj+&!tLYlC4kNeU>>mft=w%10Sy1?!E}oRq_*)VsK)uX>6L0OLqr ztxdlY$s<^u*)i+q9O}=0HziO2UC$>q-d>@siftFO(l1ms4^zKI3e<6+;zt?DxFpoh z@>$ZEg(l!7%s%@h<{6114qj*MwasVNq~IzQ)tuH!35O#dWo#(+eP< z-xkB&uQEtV%$XAc-;cIyITOLGw&r&Vbd!as6IB!8#u#GSfCX2F+@6l!z4AW*Ug%Mi z6bwQPMzz>}*A1bB zE5F$&Sb$W~CtaqL#^ruuoF?5s*c}rBEWQDYiY+0tr&Mvg+U^|@yArzN9M!eY7PH1< zLqbRstPZu&IoHxf@H8VkN16ibA0wmWtIHE?{n2#>WpIS7%X>?P+ftVcCa;fw7hug5Q zw?{s}M`uhi6HTS_!5U&M?5Bpw2~Y{`q>G_HZ=u z`M+imr;+mo_pc-(J}AoG*dMJ#8x$_#OOu8>7|d#8Jhm8UCb=MqQ3jvrT*?mZ0ZK#prt8D?_1{rib0-+2wUf{b-Fu_oOCipuT=#WQDV z>0>vT7&Cqk?xoAW*A=m?VW^fR_y_4&Yxq+&OxOk5*3Ex^s|tZDdKX4Unfc@{2@PFQ zP7sMnGTK_uVNRP3_g&U^NFZU$e_8QB0F@NJbVi1e`*TDdm%dus^ebqbgm4*~7bab0M+@%I|8Kyn<5f(>PzF8I%FdD9@6%%NG= z?DftjfA*eJ3xH5C^hIa9#fBcDnNr27^j?`IU;`4+@mc?vmrxHmjhNSZQy3K z?Z9#8v1}yIwXBQ20I+-!oWmy8x5xS>PJ>SYQV>6D;!)rM@!n!v1LP0-9k~|cPz8Jn zAg@>95aPOtG!;qoTuLi|W?bRUJy%|DZ-bgXWS=wrB_=igwc?fF zF{jTVedCJ2cJ<0QPPeffXMhPh>B!WuER0n6I4Yzw1cl0#def zk5jvaAQ|L{1z_^je%PE700;52$5{B#@_Qh2IDYLL;3YLr(u%sSfouDJ5=?-s)uXU_dUAxOmEBU~nl9nTDEAIBdVs)*_o5i~J|1 z!OGh?=@6)zqWo2otD|6McCnl_1QftIIsfK!<+zjD~MsFkKN!%oVdiHNf3^SkVYIV=C&E zT0fLC$F26z?LxLzjBwDw?^^t*z9zBH6A{K`kv>UpiKUc=`T}d#)@8RU8 zui@M&rI{Kc2c|WCF@q8+hj?_sIRT|pxQ@{U6#YX)cVJ_7mq?fkPWvVNQjP|$tJv{= z67O$2uCGX2j?d{4f;yGNO2G3BmpB{45t>ZvXDd(jc-F^=1|3lt5vKcpf(Bg=IKVwp zV&)+zwCI~y@t?}{^8jP%^IW!T z-<7=Ku*`UVbNrQKP-OSm!$sWI^t9=rTIt*mNZ+z{=5J}_aT23?fyG$2M3a5;5a2Gq zrPz-f5R3`>JY36SXbkkZ64W}6a8v5Hd{{WGGl~pFyg}{xJXP;Ds&6uLu}p$iA-}z@ep*^Ap2n+~HyAsZ8jB zG_a)4s021YE#FW6J-tv-aPIzg9)g(8$UGpmxBggPd=Bu_E$f*T5Qi$stuuZCwSXFB z0wwdQ`=SGD%yeTV;7_e*1|E6>6=|Zkky>=+lR}|#Ju9A3a**!X^~qjP*MJVKntxi= zU=Lcsoc?~`nRgNc+xQK^u_7%X^o>v>&FL~%C-6AhX+1@!#eJ!IhH;|^8BwwW-fPjq zi@kH+V*aF%8xc1u0puhQAwK)cl=dj|EiaXr4>`!Kr$IsXBtqlnwrK71s=f{Y!PI>W z$$S}l)vDW_ho+ic78`@#`+$w^6MKMoQYUmDWL<&8|D19Jutg=&56Wy6Zk^&GAl7-n z%Q~Smn$!2~PQZh=0@E>)MAP@h@vTpU%(ihn{}dL5KPsW#S-j|!*B_xtl#XCaI-?=!2PN{N6c)dz3P^BYakNaVI z0uMCO_{Q^SKATnX4}9|WnoFeDBEOxu==O*fJ@cKq(jpoCd=zn~*)Rc)q?0YoTU9t8 z@EyL`^-*(lKc&4&!GB-cvjkbK6G>!(sX0&V0_(|Ei=Cyzr&yA*42*WoWcll&_m%aZc=QlQ+ z9fBwfM<9NpV&u4Q_>B%lDg^iE6zO>x(8_J+l+>`L>Da5~+@kKvv6p5yAGOt0h}}P* zl-*Gcr~X76bUbO%uAsCK=@VgQepj9i5U7U;;WO6H^Mro>26Q9V=Qc`ZSJP><2G;A@ zi{+?a!%vs*63NjNnz%FMaJ;h~UqnQKE8c8GHZ7--x;x)ae@dm3829~0hef!PGlk>z zd*dV*(sR}XJ;7qht3j=o+lr{YY%%5WEPHW*i(q^nRZN^e>KQS7JI*LZ<4RPe@G3c6;~gFDJ~VHoG6dx zUSYL1+nyrwd&Shb60!G^(U&`N`38R4YQJWsA&27I=9~H;E}(nK>C1&&^c1H`CdJ+#A_dG8#kwHgOG;v((+2m3kEarh@d5NIYVHRTlw{E+b{6fcI0>5b4|*KAR^b z0S9-w{+F?MbKcS(bqe0AMP9d2BB8cZT-&J6_3J^iEvJG%%3UGtq6(?fAFx>r)$Dx9 zaC}^jvBUjNDoejor@&YC4hyPP*o47-1-hups--t$&c`h36Z(3XDgFhe)_T<4HuSKT zoWO9iqo96<|6mlDGVQ*KZwgfsA!n-KOyAh2&IU1Gz*ga_KK36QBwI53+GPH`vC%Y- zwX%iPnN3NQg1wRVWfCem*VF1b`(Bnj2YkACw2@k6#ramA{;&-#o0s;fGF_VYvDj_``b|3VQy69XzD6o|_#L1noRpjNf4LZ4Dc+YqC z33vy_&E}y|XOq01W%Byqd-XzYwEQZ#F7m=a{ny^N&sq4iwPPwm!@D@vdY{tie%UMgA%ryY^d?defvXx}?no3l5K3#XeMX?^KwS z&?B5a@m+uC36nf!@+7pIB6noni;7#ijZZ8Y(ckJ-pD%dCT37c|>bHbb5jt1ePR6{- zrwOeQvb9dpTk$x=ySH6&`?b6M=|il>{pnJdoV6}!-f0&|y(E}D=O`3!{pILYt^>Hy zhJ3t!B7dXc<0U%pO1=KU#=#PSZ8qDMgDw0_*#rmEjoE8EGg3Q7?^2^hZ^NAT&=kS%xuZb}5+ZE&`hO`$ACMj3hY$MN{sB z13W11Q)4u~6{h?{et%xODfbcn#|xqh_!RG#Bh>YjKl;4-YkM~;n7S`fBe_GJ;HS3I zoAk(y{eD$x7dLKKOz0Nwn{o==t)Z!!K7*e>TQG-SUzjoVi+Fz1i&)8``;+D;AKO{I zMTUhabHnjGEN&@;Llt}T1)5fSD|snE;;My^!1Rt^JOTgl)(f9SKAKRk7CdL+Y4jR9 zh1p0;vyJS^{5)r7ueRQw7ysi+-qk5%toc(&k*?omAHZDu)Bvs5F;s5 zPN-I$w~HVY{O2A}6^1uMchBrdaX~RZ+Q5?|QQ*S5I%J`2-WXt;_r=Ai%$%lW1T7{w zs16#0S&OW`gYo!AON?3j!y_o~v8{)~qEEQ>2CjZEEuS1=n<{mP`{qqFhK+V@sAuU= zB65U4&%I4Fvq1Ps<9Xys!$8ORFnmU~5=08(+gZIK#M$AC_qkI%Fh~Ub^U5)=<**^G;K-jR+)es$cNb_r+`IH5IID@flE^D2;{OW(sl-kw8i8?%?862bBK>mO<5J$|kIOlpHk?umO`3MtTb@JXJ8q|;HaPgFN7k`hyGX*(G zK5(jFCQ`0f{xWl;wVCGTP0fnr&;{r5FP`q$Uj;x4Qz}cnqNF0?;{qmo!5DC<^L}GK^|2Psk2DKUxXl$U*F+w)L0r)uCAijr1DGX(``m>(a9h5$ zj!kn){l;2#@r)12M5g1AfOW3`T5=cRnIP$&k1I|g$x;jiz?TuY1WM<{eAy3FLY{j4 zTzqtI>}6yeaIl(@`b);S!YnQrIVd__D#SSfm_#>kU2O-pB1T=Om4BW33CEos2;c6H z+6vv0OM%G{v+K*^+C2F}=g*0O1jH~7zzD?ewHHidec1betL_W{Qptv5XsBKax{{tm zYm<9E9iZMb`_s#=m{DH>2aeh3SL}NYfh-I}qq47O?-(ia&Us z=0Od%mU+REPoW=>2E^<2DI{JQMx{>~oM0Et1N7@xD38{CO`hxUZu`W3V7wT)2|xeg zptH=p8!2~>rk`H|Wo+?N>$zDZY~l%L@HT{L@J0J_v+keyP0Em?C?=gh!jZb+A!Ae# z0>L32+Izq{`A+`V4>=ExhboKR_EYSK6c_2ozT7k9294$^yghZvmJ$qiD!{L!6Z$;S zC#2o71xfQo@OinybL#B$$$k*~SRo;5+(z{}iAb=%OF0>1ifCKF4y=nW%Fq-k#si6{ zW+f1=3wGKs4wKE!tJf7E$IYXa=ME%G!Dw-5K=Kej(&06)29Zxewxwm&-_96LrpX*dz$r|NOjSx8j}~#aRZmUGF~VoX&h^9Qs??cMR^%y zrK!Cnijh0>ih!=+!#-@al;>!PDX2KJyvym3dcV{sU#4zyI&c@>ZsgHYQ#kXy;$dhS zTf^&dVvDh2y@2yXcL)4Ca-v2US|ncosLt4TXVz1Y4vq4b6XMZo{d~;%=iS@?{m4G^ zOxN2FaRV%BR{ZV~06{Sl*YwP9ce37^q7bWr^+4!j(>ezmo=uc|9fJ);b3g9V-Xx7P zt=f&SskM$@Ll`C9X-VLREy;}oV%QV=op5t!*yxH7!H*l}?DR|V&Y9HDsj-J!PNqiY zU)ro)tM4?z#7h4bF&U3@>dwA!3xNxyoJP$NFC}Z;GyDY(JfZt((r#B6UcG;JZO00y zrC}gnng!!QBZ=mb#Og$^_xvLH(x(#>-xE{mFUFqX6g4Lp@Muly$Ti#cL;KUQNT<76B7`aAa5Newx3b)SpvBpA~fkXIUnG8cx$(A&AL@WJOd~ zPgWWgD2jqyr}ajt4RPacr|eHftzLBK zQ`j))$X-8 zsh=O>B$LD@EN$+-7bi{IhFuP?ehp(ZY~`k)o&;|80xHA1WeZ_*|W$3LvDb_tg+nC>?ze+IoWsv#M%Mm(y&4=QlKgNY+CFKnmy zubJ#^h(;a2^@3#=n97#W6oRm?^i=dELN_8lg;Ig=dt?nGXkp=~Uk!g>`BTN|k&l zGVJozp;H`xe)edhvIhjBiRTQ515nG z{R95aUsB}FUUD*-Qc=EyA@uzTjgTQn0)kp9I z-BHqaNbAn)gU8f&ARRUG5y>Osb58%X1fq-3v|mU&gn2PPe7&*IHXF-BSJh)g-#}1i zhO|~in)`CK%vAA)e1JCUX5yzVZljTbmA{v-W^ILi+66-?gkv$rEWrcn0*af?4svX3 zv#nu&I%rGd4!4XYSZ+nwToC=8IKO!5f@NQ5Dx0jIcA2J_ho6Wav7YAA+#xikU@{kw z-Q@_kelkCjvu1gg7(++K!n)JHmVtxQ0gh^~PtdSGnP%OvVarP*UjB3{7tKa`SoRfz zT5H>CBr+^_q>A>n##A8IC=hL*d7%Y3H_{uKPv+5KFg7dw5^F<0C%UJu{umC~7s0@G zz*2}|a(|1MIENmv&*ro6gqDN~n2O``ss}wDLk#%R;RB+|d69Y|+Vv+ye(HHa^g)KG z3L{8BqZ1P^ySTWpS$yL9`RpHZ#N|v_L@b%iMftXlu;%D4Pe6Bra|*HUSL!JWrjR8d zT@l`hhNXtKgL7`Ug6XFVNSEkN*sw3ddKUHTf||n%uW)UQH;Vq>j^|E4?^Ga7 zX}Gu_thgI^#unvQ%mATIO%k^+VIFb`E@x+rEuDej1)M*W{Vn1d|5dO@p9qZ|JV6$- zdgthdVd~R48E@~J98+;?yAszWG3zEAQfOUK5#mFW?jZ+q{Qz0`dp%a@g#!=cbvO^Z-J<9Iq-Ao#C}v6A7aEKme#1uDjS5MLOb^!% zmqTzOzV1HWvfY~mrx|bCh10C7XOaX7vd#4XQ#DlIQ0# z50(DhBp7e`R&;;8W)LV>3GZQh@cHH1?dQPf2L#2k@-TYA_5E0m-t`AMlKTM%+|;C* z0ZDG{J*xpV8xuFqGB9!r@83`U6EsZ0E0s?)tLJxVz8jEGW)%tH zX8gYp%A~!+eHj`$XKZY&{I&M@50{)j!8QGUuZ_Q`fvd}VP9Kd~dApqtE%y;clje(G zQHn1TWnp%?^DFetf4uciklxwnA37}SEI{5sv+*|mgn!?M#hrqg{~p2r`OS>}0)WWe zbP&7?ym!`+M3gTwt;%KYE2Hqb+!3EsD0VoOwSdqRi78yRG)vR^L!6=)-}#JTb;ec& z!uX11NwavzGeZ(-Uf6tbHHnOYS1h?yuQ67oz)x{Y&p1|p355VafxMdX8@zwPOcLF; zwl@Ap(V|=~0xZEQ`PW4Mp8-qJ#C7rF`k8!w-(j2CXS>&~?Ic{=ZoZug8<1#mH6&*I zpGAu}SlVn%YwPcSgvH&ASwAmfvoQU!6uyfmR2;CsJmrRfHO%M*EN^eEX>M9Z7_z@e z-2a6kBRK6lEGyeLJv}XIVAA`k;h(_OhEcD5Z6qTKk6if%_=l*ZfzMJn@AJO^Z`P4H literal 0 HcmV?d00001 diff --git a/media/DownloadView.png b/media/DownloadView.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a44f1458da44bfe996e9e936e61c9acad1438d GIT binary patch literal 24368 zcma&OXE>bQ8}^$BqC^`t(OV>X3qcUQMvdO0Mem(K^kH<-qDAkW=zS1GuhEU(4Z-N| zo#%P}@3Hr>zib~IH)GbUzSi|S&r7(9k_-;k3#>5{X8cY&kaKh==5HV7gH<;GW{kLuHZ#x zjgm;%3X|raED_&`!-XHl{UaGa)>?YAnoQx=z_Ry4@IMsEzADJR^jRi;h{VIO4ed zW<>hS%X`uqBg3;l|Bg8a#@i5NE4G&V@q9?RUIU#$bKNV0W?qxN$Z)Mn!vHhcni`@E z%`mA86ytaI9Z6#*nCFe!Q1#%s>0@WQ&D< zQHP8M9#0J6`LxyVq`>Ur4 zq#RxAOferD%y-ytFM%Lrla~PGhr1swMOcD=^vT9P7 zU$6Cq$jmt!-(7y-EhqnHuXrTBngAKyTaOhBVmQ*oGy)^g+HX%4B%?sYl`E|m^4@j0 zA)K$w!(aI)Wuyn47n0I$C09F|To^&JxX{~&FNoh|wSSIPUi!{q)PWxej?Nii`EGJ8 z=(&5Ph8cs3_y}Q;jwDOrcc5xlz7?)fIHG2YNjby{2$st2~zSiD;C4);h2O>tHrS|!a2VF8J?adrk9D*q%&U_N@nYU z5YV5TtUY1Wn;A%8;^>Pe=SY$43BmUNUX+%0VLlL_|MMFg`ADWvSj6U#T#GW7$%gDl z0tK(l!Ni@Z>L=|oDSV=`9uroc{$RJVYy|az`XyjmXz<0Nty0+T^^+Jy9TMTAOsR@47!jd3Sx; zuPk~OoGwtqB4>|JYPZ(SZaLXZT<{?+w6gsgi%ID|xY23d)Q}&D1Ahsq!Ps4Fg2uEgn+<)FI-}PK#U&5DI277h z;V^8aAuE`+k-dG2N13!ef|}eN5{$(C?tUnk!hXpsw2M6Mx76ha&J*CQQ>GIsg)+3m zdlev1)|}?aw{i(z;IQ!A1P`**6QiNg<;AA3euFR+szN6gF-gTrLaLaYRw?c3yk(58 z5JDr1vLYvqU(V|Y(Rr{Z?fX&wOb8J>_x#2|7$lp%^v!@cb^?jfw<)WsiE366knGvk z@RYes9L_+193m1&vs@R4$6~lU`fwo;DLWz)O{I?APxss=uy9km(4DRRfEgOk>wfT7 zyWX0y!mup@iJ{m@o@eP5%WikeSX`iuaOkLYhNSA z;}z%`5_ktLKSi7NM`v(ao_zA9iuX+Di^5lci81*L=I2=wLy^%`!V%(V*suEZe%L0q z{=C(GHT%YTN(F(GtAIWX^Bb0Fl}5FCIb-W&jy(V;CDs;}J1eZfI&m<9aDfq#Pde*V zZ6a0eF-kR6X+$lm^v#yF{ma$MVS~Sy27l?!aF~|9I-X^?&MsEEWNHhk76xZ1{%V@P z{i@ha0LGawilkB+`YcaxuW~l~TDi8Pk#u;7Lk^SpEe9xKkmniul2A-9Q{mdtq#gvH zkB+JX3^{$hPdC~ib+R#S8p3!@I?m<449+8fLXRZk+2yQ(!Lpplt1eL0Z*{$*bQ*xQ z8!rh?m1yXdla@#*KsZBTGSC>9MI7|}cylP31rY~f*Kf^p+f_>!G{-9WNbB^AG;SFE zBgmN%ks;zDJ;}E7IfK_Kev7?Arv=wyW4rE$ESO3rTHdXy9 zFWF>s4lW;6%ZK4o=8X0ugk0yIJm)rhU!7w=*XG0jg4dF!dg^r_{A@dBoYw)^0e}s6 zgsEK%PIBw7i-I}k>?R#UiCt|k`u^)SD2yeR(3MKf8uU#}lqE{+{yv_LBz5r(?q$E> zF99wp)ovMLxKA*}3X$aI6iyMn!uHQ-)${8sJ83t*b=iOl2C^qSA8NO zg2W)E1D-r>y;LA$M(9RMe0GwVC3P;?ziL<+!89iAt=VLW{Xinom7hn-_$OBe&u%H| z#hVxL0|kdtn>u?_<@>pFuW7QPpaYMeT(8GqliuC^@V)sH=dcUho*S-i+C(nU&o;>q zCtFD6lV1l>`=y*@4IQrZ#@H=P;k`w@O++pWhgN;NJ+8+$+4)I;FlP;akcudq!CgwD z3s413ep`g9-`|O|Hq2HouWqf|q=3`yJ5@Z7u84L`ETqa^%TI3W4~}2Yw#OjLw4bxJ zD>!cuu%+%zml_Z6P2=i-NxH`1rEI|io{R=Dt_!-=0tI&3Bt}xSV=YOk-pK#N7LkjUE*Fjn-2}%{t*xP zBx457k%DfS%c8_1b?YqISNx4}dQwiEFy3Y$4Kcf}>SF4SdgvZVuiY%Gx9Gy15iF81 zS0V9_nH>EN>iAOfj;`j_U9Rkf+d^OWhwdC_`iMx(ztvF@GO%G3`z$P3*vs$V<*%PX zf*2p3uQ6w-r;_9If4Jkfo+&ejA`)43x@EKqJ>c}ku~QtSBX!cZn_k=ics%Z?X z%mjkhc+yXuv*X^ShRHNlszvI1b1~U!egleyC5svv*4an& zeaO(Jov}4=%8o-u$g@_O^vch*`=&8V1d$`Iw)XTp{4$ygA7aBv}ud`A*Iz;keg-KjU>1gl2f?c<}E)ztm)=Z%WBX}#8aTGo=x1w zbcIdyzS6L5nmI4FMC4BF4;Srsr;RRoO2TR@hPMaSs>v z#l4HQH}swV<-f25=5BPBcg!-^0k0>5JM85 ztTRDakQ`EMczQRj_mUQFI*%2iH2jU9bkkbHP4zq$hcu<%{sU zuoU_27sp&v?(d#jw#E#?mEwDT7pq%*pl|ltC-FW%$Ua(iHyGI`B$MJ&~ zm_O@wWm*ni%i8|O)vX6dUz%>)N1k3_6CJ7Q^ zMtsCHM0|7q|Gi1&)#oB)m$kJwcmACgrM-!G^WhRuOYa^!&-SF;gzO^N|w_l_2t7T&cS5- zzB|ipVWe1u5 zndG6MTitVZEQ65P9!Mcf6~69vFTiJ;wIbgWit{HUoGFRrCRN#_CQ)i>>4%*VIXalM zglFu-%$c#_6!g6X5R zJ#O0nkTCN8GPpcF+D4d_h$kD@n-hY4?uzv?py7B-Od|vQdv_*Xz$MAP zrp@-Z8gYT`V%?P}3AL2KvPQmd7ef@MH#$^?}ghEBP6r^7)!+jdRgK_MJ zQB7VV&ZB~XumNJW<1-QHsGvd6EGo%*<1Gj{VkE_sS^`sKp9RGQgPLDSGb){h(IU*Pn|ACvTI zEFKoh#AK#$nKn1lv+PL9!7W%b1|>m6;W3hfHs#&#w6=cYl8Y>2Bb?Nqu*Yjw=tliY zU1>VeS=`LnMt`Q)JE)ZTE~HtzP%*R2UP1Re_~G|xj!8Z@m0euDN3!9~#Ubyz6E5Jo zpXDEkvtT=2!bl~%e0U(>VmB(}en4g$kMr6+Ty~flOlq||erQYFER$MLr}K5v<7n}m zxMh3P2+4xD;@6};7eiAsFC;K>q7~^=d}U9oI^OJavWGikm_|?ZszTxFxCXID>zrcw z?fd=4xddbH{^$cy?~optQh=|qbv@nU_wJvpi5tOI7D z117S)Wj&I-Pb(RjE|mqlxy3g$AT5g-<>EI)B|dE;xcFr0a;C?{MC7-2eiKrkA$KM= zux@US6TWQxbPa9wIV}Us!3ssHEge*4z-KK_>G32m{vFC`FYBXm*zj&n)l5EW3QE2gnY=kVr-kQs z=2so$NF>uvlFK??Xo42<>Xn@jCh|)`bmcGG_Zj7rKJvdNwP$E2pLLKGqVM!{Ag}(I z5@St3EsPJgC>IB!BIf#;1`jt~)NOV`?;5iKyK^==dRpgP@2zC#*<2Ail(nQU6k#vv zy07`x8sx!>*~as6QeQPC>QrJVgips|+eYiMH6yfS?W^}4B1F2sbOI@H39|K=l?SCg2dYJ`4$ueB!~k{-=i?gOHikL<$lEa?f>JanAdcly(IF=Mm-_H|MnNFS6;KpV+)^sbE-p7cPN#qWg8e|H;Lp+wCp z;-kgndtx-0nK^A{G$Ij(n=Kvntz@sR0r?}mh0|)n%o!y({fM2AVLgz65({Gw>J1I< z*H~(ZKb!d|vZ!Gq;5_|KnJ6D%$TGxNLYSt#gBsV5>k<>MbOnNweZ08?mIl{NGwc?A z*nnRTT!wdb`lbD_WBkFVw(@*vS}x~vM-%C5t((?pE3724o*E>u!)I5Fgu?CNBh1mw zf=x@h&%?1}cjibuqKoMe9Lal-U!GBg5N8P9K4;;0M>!A*+`d@P?UmVw zm|*o?wvrx&%SQ%@U*RJ@q?|nIi=u?K-CXSFK-k%v-yO1v9HGEcjvs}OPgfY|IS+e7 zzi+gI7)h_V5?rYekW(9jMGqIqu?EO;p$YyWcYCg zx4M$K=go`#iqS6m(Wm0pm9ebWfJSe7T=-PVf7!ET<92qlUs_ zL6MY_KjVr0MH;^p_lNBs8)6{xvr8vM`nHFstvbw~8xZOXv=I)sjwg_jDcCIL6@y&~ zr{FA1;S1on@<|LbtyQf0c8C!=-gCMD|KEvH&VR@%zdJ|h)hv-D<7oLM4Y_84TkV~h z(e|s@;tA2{4io_XxRGm^ePgO?FL`~BEzkT!)L!Xe(eR*AJ0M9sQLnsh-$Rm->^{Tp zJb6iD&cnxfy(G3m35$yC?d33hUDM*DoAZN;Qo5q)s&$gD{5OVT+x#TyrC&D})GC`c zs$T3$&iWW9S7r41uYL;9R7bxx!Mw4!`Up2g5i$ikG2%rBVwI|(DR?k7Bx5sg`od(A zjm&BB*>lQ*t@;LDDSo4^&@FYOoqZ2um@$(BnRGXm+7S50T+9E8NuwCk&C`(85^5u0 z1;$!4GUkxiegZc0G``0~HPo4(u5a>nbajJmqnCJo1hMVjM92NL!n)bT49kj}9}6|T zJ>r-v&!ewKt!)L`^47_CjW&nNueJ`kbFM>6KB5=0rxhxr6mAiIhTlU)-F>92x;N3? z(9l^Nt3h1hX><@CWB5q-umDVfaxV^kr+u+JlqL>7`&f2*JIs>@O)`K~vikYBVjVRk zDcmY6X(sy{4qW-vUC;%Gzd9PP@??f3zjXi1`)iIsi`p>uok#&stHP%S6R;uS+{6Cf z#?agkyR-)yu~|B;xF+ZAB(g;kC#J6mf^uED;;p=HVi&RB*a@Y|H{I@ha<{=ZW~Z-c z`c#mr3#6bKkN{)$SJ|KCA4=pR_a*NS;c#Z5LC?91#k{%TiL=Y|w8M+TNz$cWv_B5% zY(!Wa{)H18_qmH6ll)MQ+}PhuE*9sxxi2^p%3A-1yB|)srDqpoh3Y;HKN2zJzev+v z5GBVvxjo*Fdp~8n-0<}E5r^bRd@K^5HnH8j)23l>hOwcO-E zN5yVg#PAu{depG(W80AUL@NiJ2t-Hv-j7zqa5C4&<2Q?Y?cg7EXz6_w4B%*%vVLN9Dk2#ZIt8Px^>!~*03EF+RXgEf2(D;5dktd8jR)F7; zc1itX%TvZ5x~k5?a$weCGt=vM?ux~Fh_&SLx4Y#tg&nzN_)f)OXaPcdZ4-(g~M#t52^G>27=3;KvI`up7g zA-hO`!NhYz*=Mm{;N@O6P2ES~poK$iqG2<0)i{EX#es=XnB0MRS!l7y>O{=j(|=rm#lA1eT>|SzdwC)5)~}V zK+0$+i3v6wV1q|9S@_>+xYW($$rd+F5nGAar*Cx#m9fMH((306#EquTt9PP4^ih2DqJ6yOoojK05`t@6Y4NfmK%hth4UC+b-FLx}k|5y4SmlRdf3u1VrQP zk-L)xd$2*L@8I?pTT_|*T8+l4o2za0=B3Q~eFagu*eoHBXj0mteqFF_mgX6tsk)NC zZx{L~s9CCMuvD3Zoo+=$FG(hmvyRCeNzc+=)RT7Z0x>@2ozv3FaywH3LW%Tmb-zA$W-(~>B%aO-A{m2i~nRq`HJk8 z>`pA~=(^hy8ahg4NH2^`BFKl&%*-uw;0fEpwCLP%HWXA*MKkweM30R~-V{>6nP)wQ zc|b9S%l#=mZ4A<6=%bd1@DnM6jE9w)UqXm0K7@aPsU_9Wzd|{x2+Ct7P*(ol*AGR# zgDvbrb+*mzDj{qi-6l>IUNDw3)I7Y57?HuCe`t-%5QO$tMBB=pep+h^M;=~qK*;#w z`%roM243$CZ@+bs+DVB2pBG?1FMS06v9h6v=CnoPRMg3ox{}377XSchLEr0rB7{k1 z0_tvm-|U@uv`^PQv`r_~AAWNaJ$5Tg7`5usVKG_iym^2V50#u2uOw}58z{o>yjS{` ze0(ob{mU}=%0zS@?4~b^4N9XOE_pltYA4T7#BlzqCqvzE%!6LD8;)ia%RZipOZgv6 zdMv9W z8-D{-8)97+Oi^^5Vc%>18qezLu%ivLLqsrq>~vJfDL5TQ^N@E(C*HZXB{`2Yh{s*)4^^RI?=emg)5Fjq~2y z23Augg$Sb8U?1r-pZ^RQoEUTXj#!A_{WC{Dai6ek&Jlq=0-?;C0q&1GD$S+=nN<}> zBOVA55-5@m3(>Y2P`6kpW7>&D|(lLVe;P`VW#RQy1*~ z>ec1T1o&(2hbp?8LhG|6+r4H9kdCsvnjoQAYOp;)K_b=(7oP3j|I8~tr8|pZ76hPj zP8*)tEVC7nqfhwk`koufXKgz(d3s;1@XAaHjLez^L&ydoMi^^OMq)=7Bf=Ow14`t8 zirjFR{;8}r_HN=^;lFDtEAY!?_~_oVf$-jWP~_7r`^2_8&`);*0q2dczE`ilcrlw@ z$~T-u&@6o7dMQiyj=50MA@(pDG(cNS%%WLi*IH5h2 z{w7&gkjX%PLhif9V~PfWb@qov0Jo=S^iNjzgvCJQHJJCG0|e8q-8OXMzuoE?N;KW- zF|gQRnXR7gbKj;*H`AMqT-VJrbw}3SJQw9sYc{{)vvt#3U0*giLBzvrpftb# zt?{3do%lvSDLl@m{+W|BFu;Mt0mE(cI{6~`rC9Kn+~)2)kyq+p)6(1MN6N`DG+{hv z@69bJ!aqYsoen;H2>OzRPqXW^ovmGMQsSLTUH#AGUdM2(_B>wpU2O6p#Uy-rYj(;5 z+kSgdP$1T+jG^D+{y~W_JTS$`|FCd>SPJ;$P9aqL#n#sgMj|q;o(K_4kOVjjHLGck zW>pAi9YxdTL(0meV@QHOYIrL7t4D~H|Wa~jC4_dDyzvn z_wNP8e=Cd(?cC+*paaY*?HV_$$2bUI5O~WZ=*uzSqdKFcSMQ-&eT5Q=q>vh%;=w?r z10GQbz%KivxPWykYbo~I(`yO>PS~YDbct6%r#R40pJ*M9Z19nQK#1@~)h;Lz>m&sp zQ?+0;_|N`YwVt65xN-q?CV~UtWA0&87>{q1l2!1V6z=GGIfba-VgvKmrPBM(xN664 zyX6JgUqOFkAmL`4O>qIRg9UxzX)jbEW!L9~ZEt9W_Ol3Z|Bgpe6mM@Fg%oWCqV$a* zRV1dqr-r@306%(c0agx0-mVb?9gFw`;G?1ws{{}~@62WTF4&J$Az$Ii1z+V<}} zBn3?9k1c2bYuWQx*AnEwyB>cO<+Fl}#&o6*0p|-5&|WduPtOo&839}{QrEujKQNlr zXF$^go=Evy_TXoUe%b4PiG#Qzc?u;$s|Kf5BNeWV)1HEM*Qx?Vp^g7jHu_5j0;AAhzY#kKQ*xwguB6yRo}6k~5sUR~ zSpeXYLfh;7mDYj(1RbxJdRytnNA&uF8qx!pf7~XU@s{_I;Rz`sE_{F+B)UJ)piH|u zmdC=K*KQGCE`i}{!;geb6ohZlYe+B?U z6g#~J$qQSZyW7=6A@?pL|A(ke1(NHgs4wkf_$xv%Qg*|@W#6Zt&O+;D<8GIBrxlVb zVUaquPUm}B5DEcqtc@Y4p>T7FMhd;M-&J%;uG`R-?&VDR!gVdE7itVga{Vy=l_@0p z;!P2>I|Qq{+|!CRou9mRd!(Q1cQl9M4(BVK95V0AgJ@3U?oJ^fT(|<|_DA<$ zj8MWz_)VK?^2aMausAM%S{n_+B@cfRhPwvn8W3uZ%n|zYy{RAPYkg5^J2SQXxRe*2 zq~kf+(&r_s{771@?argx@*r{eLhh`0OZEG+T%J1^2cnMn zqnW}I@MBQ6Rf6;@qaTrn^QQgE-(woJIrJMLs4Fm;!stUT`&&tl3MKohcP3M0=^`%Z zfMzBR$mioNGW=lr^AAqX0%#P#$stpMbvEV7YrDJQET_f@M(EY~Y|806UUMKf>?yK8 zPZ54|cX>v}XZHP&?XMI=!e$te3+mUd2V-*QDQ}OF&(ydH0kX@ZL|DWpF4#7{?L+ZK zB;ItK5KrHBLT|r~!*Xj#x)=6$qbx%>R(Zg*%}lmwvi;6fHf02<+mjW7<~uqC3dh5e z&7HX>@}tEzn_7H++r`N29+~d5`oh>=!$aKim&rMdRmO+%j3eDr5%lJRL}XJP9NZRz zkS9;^vfbN4Q#kGG@IN6Q@Qr4V+E&|rpQ2yv2f6M}tZpb52B+UZ7pmj&9r@d2dR`6( z%d#88s=AsjMVN!rF`z}Z8ZC<_P>R>fNbv;}pV7RC4k^TZ3_N(z#2g`ImUrCs}+{^3rxa-4F zOylhuA}rHsp(12b?oEHL9!Jx~ABse!e4rE2HBXx4i4Z&j>PqEILE&%Vi4)ld6!9~aWx zQ39e~u%FIJ1ymPyd%6lIiA(m3R{WJVpUXI54-wbn`R6!$)78_3Xm4#s-le~DCj%UT zJ)10AQ_i;+3#dN?8QA(Z(Jzj3T|OLvL%wPQn`ea^*@`Q%IN*p~^a=8tI> z@MT#DPEY$`S&o_|sKKmvJ~(a7>@||bLufPWFcw0K$(o80pmrHQ}(i+paQLRw4T4^@%1B|KbK3JUag*q>mzR0XEo6zm`A&!neaY#Npr~U|y zQm4atH{a}2i2o<|qtS8oCHA?1siO6Z^63BmIaEL*KYWmx~yvX!D@EGlI77Cxy4 zc2~anS-}q=)V{92Z;e2`E>ui2zVWInQgzyc5!_Yno)#N5M1x_uy@yvZ&0y(g2@V|@A#}9&(MVC`A zm=1Z?FKj*^X?^&{VSaArPfr+L9G8t!Jr=Z)L^|^}q}u6_IS<5AAd67j8Lx*nO9NJ? zTqvz>NZq6UnCJPZQt&j9O_@d_b~Bq=#VdK)1VQ3ZT&kTABpGgY{txHhCT4>vU79Pt z3+}u&ztQ#hDkOkg&UCM!*Pg4Bo_7)2^~JEzxRPoEowb~))Gg<>oAuyo9YI^AuU- zz;CQ)3Ass}MGkp^1=6SdI(OGSpz z&S+bUV1wOC_*xAee2=4}42F!4NjssZlZJe^$7y#YWctumvE;*eH1-Suo9&QZ!~r9$ z4Ems?vw)hUX1`RC+x&cQw!GZ$ssvP3uwM}fZcN9RsaPngNMgj^`f1Jg?HD4YO<^QHo1?N3#@efe({8Ql2_w9=6~^5A~uOqfSF=(maJ z*QgGV2cOg<*67Ac=S`L(H!Dg`Y3Kb5yRW6%X!aEq%@H1-{~BgK_&KoK_qye9Ftdw; z(%TYYg8E1Xg+$y8Mm{O=Jn~xmLtW4;p|V&e%3H5Lv7ko=F1BGw@@X?{DorM6$Mmo%i{1iGeWZB8-YJ;Lk235T-~9V(3it{5wouX zKr5P;hnCBGMmcpy3fPGicb5dzD-9Uj4Xg&dE3>mvs0~W2&8AdOTc;RlmC{5Aw@1>& zAH*c;aOK9@Ptt}G_9lhe^W?D3VkfmCHz4CX6(^hY$LKh zN_n|k8ig%IJ~)d(4eET|aqv`eh^0^)y>7F~3qGqgDa9Tny^$pPjg_%rDJmLVkICsp zsR|9J$1;jyV$9bPk!DXaNTpgE$${2jIxFDZEi83xmR8Rn%Bv>6AzLB2w0qm=k*vMO zRp*7p&K)O(Jmj?h_2ks`Lc_zOYaFuRD;En|hsUG`E4316 zOi8`luMnybwOXaS2W>D(T$6(#2TI~ijdpnyBlflzf%!OE7Ok&0qsT>}eNf+v(shbY ziF}7baKOygk&GnMOB3*^i12MB`(x-Q`VfYtvs1v}e(OGR?>qtRm8n^v>85D*-aXCW zvcdHu1l4iWu|i4Na$x=2n{bnpFMbbAMqi6m@%fb~EZVQL?DT*ks=yl1{(Q5*?*KT% zNy+)_W*WPS2qbuad{PF#R%eh2=O&(-FEy;MvFl7x(XCK>6ZM=y;Tx)*kZV%1FOgcl z;_mwQiD|iso6SGZeZ|6XsJ=LYm_Dsx&sJGsw}KI%{9ddLnQp#A1JV(1b(Az@YpLLs ze&p*v2g_1g+nU)o%nq50J1nKU{M<_V(+v&_FQ!X1yf_ed_x;p@k9E!aM+{0vgc}`_ zn`0@RjN*`u+PlBoO3NvgB{j4q#$)c!5RUa{V^+8;|3vVFj=~mJ5hc9w}!+x>N-Xez?k!A25{WFb-K$9NoaeHQf5hQ1)*=%7W_zk=-xlk>$;@hekU-m&c}8 zSUUBC^3hI`72sX;e7xmU#;Wk+?htG^-*YRUJRq1U@tM#?)$aJdU|j+`#f9dj329H+ z%%RHQ9%(cj->`}t?>-Z9Ka@7rQK6V?A?%QSmWW8jYpQ&E&ma;-5Z-G{49dFsK{?lE zTFMhf2O|Kq110>dcfMG7G4we_h9xUKIae;z=EF7iJ<@dvA!af51|O%r&PPQx*yOnL zLVCMXjJ6J%rU@t2Cn!?R`qWBnrN#tZ3Fz`!(l>#Dnfk%4#*mbNumq!g@@$jYNvGf5;rFVr z>V7meriMmttBfs<17=vtOu<|pv22JB!o*(w7sIYe{$OXm3N5eI;(Par@W?0={K({3 zTr{bRYNbLy)GQs-t_UPVIOOGRimdE1TYLN|S6uJ`n}~eykX8lzhU?i*Q?GX462=RcA9Tg;c=Sw2|UYjoiE!j!}VH4 z7Yqj60A%$2NJWe#uJpvobeW*Q2ogix^NJeV+Yd!aA z(8>>DA3th1QRjyY5ebjRHE<85J=Vr3^z%fR=cz}j%G4WK=ZBqpFuU=iW|`MS%rWmL! z@Z9;zXe3At8z~AAH0g21Wnh5mWplghzJ97 znFkH0<@Sw(!5>{cxVcGQ`LTEfQcMu z-(@L=Twmmi0xrR0ScA(YmE0CZaaxbs^uTRWbNqAts zgNx!8iK~*}NF!d`3H_z^UmP_n&EY5*N3C6REG`Mn7=F~wZq6YGX*UsMKwW3jKF@Pu z1i$-RS1&C$X;Ndf58k>qNof;>8G0%G4d6}Y`jH%n-b>}9^u6O4W-l|=x)+6V`qrbF zzMjmxn2|S5EetkHpkvtOYL^5r$u7_2D>CSJPm`t%%!yel>3HXk1a0Fe!1$*?Ymo%h ztL__**+4~;mm)_M$6{*W6_|ity7TBzZ(NIy=_CqC;bin2?y|M;d7c|1m=!gU0TEJ0 zdvay8DHk>>k# z$S&XRY;LB7t9t1h-HX4n{kCK)Rh%2(Wq~_8PoKhVrs|rQf6GU}W9(N)-GcN1n)HXB zYl#~JNdS-~fJ$|6VB^BJSIAHkFK`fOiE*5F08M-fyf)G`zFSTPcM;6x&gTFGb3u=|9}A@w@qaWO^Wg>jjNWmJJLo;W)ZgY&k^!}}_=kB_ za|&}|ynXVwI`7A+=K=Wk|Bt5un2+#$P0zx$ukIfx8QJL~Kz;gWcM_fIFLTGl;I$lk zKWcXS6*P#yQrKxx@dg7K4KT75F77vfdGAS7y4%n7VUc_?_zlsYU-jsZp8^nZ`;lw` zkhduIm%d?qEe3d=;$MjM@_K7IiyTFXw*A{3Njra^hy7j3C=SorJM@4@GC+gANZ8vW zpVNPW9P?1=pIK(%0evWvRn4mmLjJ{pw_KdU01%CM|Nj5dH$DFx>F~fjxr7{TRjsKC zohNa0Qm6Hm_d3SQw;^Plp0DoTZa-knw%?jSs5P9Vl98f~UD*q}}L?@9a+`X=uX#FF*VKKYsS%+f<5>jraEe zOUS6l&cppS^#;pMM4M2Otb z+OM>J@Xps;nGa0@Ht7Esx1!pcstE9QvtH;s|NoLJZ{E57MnV7kP2Rt(fT!a=0-)b? zIui^4hd{Qw;b=!R-SKbFl$LBD^WTgUb{V`5=6PdqksX? zZ7i}y(sDkJU@)02cUCcr3w!+?mdLEp4K(fvsxlrPo?;5;V{8&ujM$shG&0mydVC_t@z${3 z&(wxT*XO&86=N^7+dfkYy6?VB@DU>7*b7Z-u+O&0@`JECb=H?A<(h8WH@aL_42v&T zIq`(zQe%$JW}dvQ(xOI8(PwFO@r@{^umemXnz(XlJBwnSN5=zwVqs~<4g!6 zL%aKu_bsPWd_1Y#FMjw?7C+u%gPqL2J7u-susnnOSNzDyZ*XE@x!|@EKuOq89&G2T zx&r3^uJtPnAi`Q#XH?Fh8it{)Z5YK(L6Y=&Q0v?_8QI=hg& zjZekHaH9-;ujzH`ic&fpx%evdLL@N>O?GRDtr;nWTd4umsR1`#DA(n!4bblF{Q!Go zzq6d5Knid1I2Nhd9tk@#5Xu#66Z~;q_sC*6H7ubYm%bH$>|eg53F&3dAJUNQd-j~O z%AZ=l!|6%W8L>Ek)TKJr4N5uNcbS7J_-x;XL5=}CcB3N#1cybl=^6Kq@mX%>kA5AN zp6`#&dY`yg&wG(1VxU_tq4+nmGjWK-G!5T#lBC>?0LU$5)-z(!Dh&s4pvirDYC9+k zsy*y;aU^jk{UNIK>`7KOz|==o3#9%@L&t*2aLaz$1~t!75hEmyCnwkLB8sxlB^=Ra=(6;1@fzI zF@QuxTf3y!MwnJ=h23LaPulQTx+KD;)#$DMK{8n+%C$*$Rp#r041l-Vpe&(KiL@a< zO!vFPN^A1%E!v|;R4ae~F96{oksC`+o>^SIFl}`;Zboy&!f6>`$-eGL7YPFHf@`z2 z+aC{K9~2*H#oGWWM|J)%n!hpGLg~}xR(z zzcVcWhNIo$CmiiV!3*2YxMiR;c{bsLCoDaFlZHonnNHDg1W zN;oe;$kf_4j4qO|T<^PcFBTs>jo+uBueVGbo{Pq73(*2)Tg zYj>@fF61(ZpOx@3WHcTrD+{Efb)RkyRa=ZwfiIUlEXQ-u*bQ4Dp*ZAw{R7+p{AN(j z)W<|rcHD~tIdLlA-#>;C_}_*>IDoVoz%LzY$m4$xzJfT=WH;KyGb)6x^@IsoSt|0N z2YiT5mrXFIccA#A?aIIy5F69Y`u`?u!b zbo~KG;QNlpL7YaXE2kumUH8I59~}WNWi*I7}t#dk+rkIj9)}{m9 zUOzM0N^!;jEKMVE{YM^rpuB`0RSg~xHycPF&@B9L6OBArk`Nwnq&v`RUKh#53|3w#&V_3xG#dUqiZmDU`(Q=o z8+m9@Aoww+L{_1$O3W%!@p$f)nkI(3)rz=T+w@NlHVz;g{Hmgrd77C2qk~Wo1Fflw zHFnQ|l~8}IG;$#GgYcj~2-f~J1bg$PpKyEW{IMs3gNMXw5dH8E{glD9{C53!sGpi8 ztfe%m@T0v>g=>p1Gcm_QY32;fwn}}xvD|#Aev77#(i&N1(YlT#mR{Ai+uo5ZAxX=m zF%O=)H;=%VYdolEg&j+Kay%WT=Cg{;`nb-{x2wW1Uh(#F)K9Qv6#x;@Q;&J)y= zR|N%Wzi3C6k8sfnopK`q0$Rb1cErF(=bP&*E^itTM0rc=I5lS(DcH5 zuOB83RqG)*kk%8IE#OuOXKBGm{q1oYNw}A`{`!pcja~!mU;-s2zD>ZVx^;s&3r%GY z4zNzWZqr+crVV)u#D2(!zr}t6PNS38z&>+mf(a^!LC&-N`OHFrHnzHhr5e<&Kbm4F z*BO?2wsVRU06Q+pm^gHkZ=D^}+MGqcb;?$=_YNFxq5MRxSj6*-{N14snWj9GsN*}V zp0)a@*m_pYdxP+nmb?r+kG#RW&$hsxsTHxWG&t;7UeZ77MQv_!mW>{iZP7_oXGg!{ zxVC~Mw)Xy{6b6F1Go%tJi+!G_*ieS*gBPfnKp!eOBTlDEbxX8b;HY$N!~6U$E0&jc zMH;rV>Cwii=EqwzZr7K-{Fcs(^~x_1NgE4w#r-E{W@a*Zb^Hspw!L7Zj#PzM_#ab% zjuwIUNA^4~+vZC{t!SU(wGjmeu}WR=4wpn1_~h#iqU?=2D~ssnsn*ci4Z9Ch*zZw(t>UD4YB$zL9<`}os;A8>P1%^itm-{oWvWC`eiAO~8;VOb zCDE~-$Rg`@zwfz%nYq)!+9Hud8k3G>r$ih##~i4p|)NBnLWuPjn76lkZutTML1J2GZIxl5L5o)lT4ozE)0o=P>HR@OC*tvb_U-FI(XEFTsjeOS5mSu?_TgA*;Cjq6 zYjIDn1lc{b9jj=f!`jzR`sQ9B)<3eEA@1X{5?j!+Z5J2B+%fk4-AM19$5`F*AcB;A zpI$6SuT+N%Qe)_Me(JA&fg4Q33{Jd_5%=~wGjU!N6lcKPkk1@mVDKPZpq{)~Gdup% zQ#&yt+o?p^6*3G&5_Kzmm=MbwFU%grty6#pLgzVXQBou*(1-)a>kyyC34T+;z$@nn z(iZV|(+3l)L%RL<)o$eP10^RnYLvl#9EkH-4gzSF-#*)9H+yw0p|VT}a2Wgu!WLi4 zKmhV&ONTh73*m|2W3;T?WW5b>P()Kt1mT6UR@f6tB>N9LJ|Q3ifd;i;enLTjb^jsI zu&|cuH9zyr_5L=SbWAChkykkW?x_dED2vPva|Yh$ty9~1Zd5+P`Bx+N7kxDCdY*I@1^Ww-kNlhA^O6~UifB*II zecCS&{1$NiF0mBzLD=;vKZ62)L^H1s8zlk8;&Bnn&>Hb9}$`dR(hyw7V=9|VJO zV|sVkHM2IN_R4KCe=?wuLfApsBzPRC;RI1}2FU=YZM$g>?F2yw9dhoi=*4G_K}a>r zRNq4?>#mjDv(;}7fqRO`YizgqRgOj%ll9g1*I?R~m5*2m7!YMjg36cyy4Rtr!$R`R zX`UE#FU_JqiFt7WjwX~-w`c__eJuk5#oGCbggj==#9$hn5u-!{8jmPnF>X?KQMX7f zN;VYt2e?gcOyvJL>$ucdk+pc;OC-JF55nXT^$t_0`5K$^0rJqUVkTmcp=Q_Qn=aMY zC9>|gS-B0WEaHJsU~&1@Y$OpF&-V)p_V=dKi!|?fd@Lv_`Y|*EGph5J1j6i|WUG%t z=zA}zdu6E=OSxLPSS5P7ZM}0J&H`?(Byb5g)>of_w_wskNqYUs?w?Wib44k=(6fIZ zJ{rE9pX@kd_l%4X%102$Hn}Vx`GC=|2gvTnmR+~XO;7itEB#J)RV>+5QxV`3bVdl< zjnaW1;)z)X-d4aTZ*?~SpsFjD=IN1y^o5_8#J!?C47LTl3a+7orD8)Leo46J?|WQ^ z70md3|9A{>hFYv0+41!KnBRfkF#HH04niq^L>I;+i0Uf-i5{|O#sg9WJ%Kp=_*D|1 z1m3`EG40z+DmM5=$JRL(fA%g~>~0yju0Oep&2W+J8CWsm z1l5Oc+71qkE6Nzh!5C7{vcucNfx^mrraTOFo}@6zmAlhGNklIe1}Y(Xr=|`){5roL z;*eqmt3x2a!ec(>_#ki3w^{M(uxb{);4$wYefoN&e+CxFQfnl6=io1eDhBfzuCE{1 zr2zsIKg*lpxC}>#VI3GK-)VEk+d~a>b%_>_ds}}!p@aW>{l>9!c;f^z5e*{ zY9wq*99^Sr5_socE3-}iQJSDt+xPW#3k{o}8#N+_+f`52+n(1JD36!Q`~9TA&j?Ry z($5>jx}J`DxRpsO{X?nTw3B4c^;<%M8Ugu-akVBsdJ0!c6G#UMa&P@crY6z$vHuX1 zTFO1v?7>|}13r(ED<{#zJm0!UBK$9FDt4ECrVE#tw6LTLxEadN?UmzR)63=33}l=)pPxsv6`E{g%#Hl!42 zOX(e-hy=fqskVmg@4Wzk_#HneL&#a@^cCQWWQXIu@F}={7HWjx+)e&sPk$ij9dibG z14W2=tf{GGOVNW-QE3^>a`pDwUKLWQ!QX0aW8hMt9PNAp+kp=-yZ@WX;`4tpS@!awinx}zBTQ2bp`k*@R`$k37qUM zSv*=(k?UGMVj#>AB&+($7E3K;Wb;-jT+8ohi#ts4KZ8HAK!-jK>}GNL4kxtekNn{n zJI0Q($&h@1s-Gva>!w9D*K$BHZMQXE8TST@lGixGw)XA(kB+-;s|aoD;mj)H^W)v9 ze=Ypeq--b^@76#W1k@^=-=~QAY%{;3YB2sQo|uu>o2m%~xQdj70QG{T$7)05gY+Ok zai8smfNq>B9G|iaRX98j(+qTm1tPzHNfyBFkIxPQ%6xVIdO4Co5}s&MLu#9#fXXx% z_t7&)Bv?J{x`S&|^qD_O)a{1|+W2%wIw$}e*XAU)6yP*tO6s>xVsMqd?A1M#Lh?vO z8-mWPAF#f;21i41!o7+RFp_q6hyLLlik>mF=m!0Ouh9!o9UfyZN)D}CK$G{LA8*g} z2=+1Ub7DLnn;T#)KwqoVZvHg?$McaYQok0)slMrAo-Rca4^#4YrEnWg1cCwB^BeY2 z^V{0k|3Vdoo5(5=?aiH0M?syN-b{SOHM~tFOfuJ;>-SOPW#k?R{C&w1XN3Fg{9;R0 z#7}VPPeO$d@Z)&=9-?TVbI>*_^lXXdlA@XKgvPxUiJGf4HiwOy|I6c%CPN~WbsxX} zMs#*Hm)+2gPsPuy@oWA~LyZLGZL@Q=1*ZZH(ibUwNu>1@tNAHk`>>UVxIFWBzqb-C z3Av6lemJ|nJk)f9@m-H`Q*x1e%E}T%I_KjakLR0GnMx`xvZD*tGihUOYr#YaI3$v% zlqR7H;Tr~grsdCHsJi~cBejkYs$pOxihQN}@-0saWmRikGEH9gpBL*EC&-KrUCfKP zN3u(C_cu8&2_0?EjR|#qw}DW~p6nql1_!z7afVZQV{{5te526L-FXLI#PIi`- ztRYhBZ#-MvZKr?}P8U8=cJl{5hCd7UOj=y@_f((jxV}Sj)68E-@uxqmL=yJXg); ztJpCX^W5Tc8LSID2hSy5c=9rc){iMd_H?~;!u{5!-5xYbN2jQ6f8&a;*F5^e&a*Q*cyd|>3{{^eg%j;kMWup#L zMGJbFc)@M)5FNvH6r0#K3*O=yee#*%QS%#dY9lK3hwzwb{eS$-(s8-&vc4a!mZ@nNV65*dSU#S3j?W$#$R;ZDQI&E=I`NKXV@{T1DY0#WRYQl&SU8?Ns!Tu?NbrDUVbGB<6+}M-Ss> zm2o|1w(X2G#n{H9=6;q}{pu`>#)Z2E{q$6-+3~(~)yIbegSyA-vn<{2UX!Fncht5y zQks)Cg&M7)2)@pv6am$K1!Fprrn9h${GAIxyR4eFyeB-_`<@#Sq|bq=EX{Sze?;w9W|T{}*!U(2 z$x7a>{7L+oK!=d)2?65r+)=Mw$6P{cZszJ7P(Ti1eYx@smWzq5l^WpS!cNyM0%4Zx z(__-G2HlD`w*HOu;y$^6lV1!7hWxJ9MnJd+;S*`a_M|)NA#ToPEwuJh%su86U@9cDgwGp4f|U_D~in9qlb`=O0jC9ca^_ z4(~hz3v%Czug^vm!P;{yVE9QiA@xIk{aO)#!8#7p*JVL{L3PDrDD<~0dA(M%W%jsv zCAi&NiMzk8Qm+`e`&raiFANSRKY5CtctgWhrbXHfA_^q@FU|B|I>yUYxf~A3J#?KU z`2&$gJMqzm)F0cJOR+1Kyc5pR$@ABwJ=P3Jfv8QlIkq+Qhc6slHPcDo2c|DlZ7(IM z?f`A3{TJ*M;boG?ZBQ8k2tIP2Gz(oJ4l}E-l`4hNZ+>eN^xnh+|JU0U$+d}plj8_| zY02<11P58-C<fU-%!MH^9R)fO%Gq=L~V|bU#jKREHo!+**G;R0^f^HmW&E zQr%@=ZX~a*{w#J}7dvb;=qnXUmAEUT3Kf|*-5b4*FFzqb|E8)fG7k+R!{~1h>yPTX zxWP=AQd@r2RGz(LroXFbuS0;j5g0rpNGpdiC*=P4F5$h8;TiU6`KOk0FxF0vq*Rd) z?rlH;Wc!kUra$>EPK06IX3r^HY>fWG=c&oM*HZl}VmxDvePO)noHZMWaW^{8(q{>= zG-ScUbS(wrsBti{h&8`jx-H(x@t!w?b5ktpcf13&F) zG#aZtdr=08#|(AB9&4Cd*yZ!DjexJ4*fz9+KmuWWBBH;2BB!V-uwhVfiS3J{J>Iqa zx;a(63S8LvCf97z#CBK`&Y)Z^iZv0`RPRq80ZYIV@Cfh2?shW`j-&}-JI+T+?hIsnx!)}Uuid0GcfBL7%T0Plw~=LQhMEG&CkQ;4%F4=fN2E1G;$y4<+gP`C)B|C@4R`v-mO*-#SV6{q+PZwIEi74)Vl#nXuKQ;QLmme ze+A}^)E#+`3fYxVytYJa!W;vR!+41dLL2WRKLwe_!jW> zb$42*Rk-^Fv~{nPT>mT`_jH_GR-XKt#7?x>8HLxXzpw1&~8saaliGHe}~1^r4_F!0+O)qkQg&nAmNXoJyk_#|rck|q$;{Xm%3 z&=XuoS&U~L5>hs3(aX_K(YUvZAHLn5*RTdIm5I*4 zz=rz|1nq;swy%u1KkKaIpg`5(@(lg%{D{+@;psJCS3VeaPYdAT@PKa#7Nx64Qy>Z6 z0b-!?iGMIl8aby9N3MV!bk+iB_%>n-uyq{=Z4%>>DnDXQC8YLDQ)yzxAop;CyD)y{ ziWTGJ9$gNCYO-5s4AVS%83S%#he9}%nCHg#^{@z)!NWMFc!9UE&}hI;v7D{V;sz(g zVk}UJ^WckL;Qy!sJ$yoCA~9G~B>lNe;J#MvRg5y%y(6o~^njg{0M2N5n*b4)rc)$; zNo?5WpR!D07(+IU@E!4c46J4USj`YL#@_`uG-ikT(Am0cqTleeG!BJ66VQZzOIbnV Kd8M3X$iD%`_5tVs literal 0 HcmV?d00001 diff --git a/media/IrisRandomForest.png b/media/IrisRandomForest.png new file mode 100644 index 0000000000000000000000000000000000000000..dad93eafb543ddaf54730b47c07f77fafb3945a9 GIT binary patch literal 84724 zcmb@uXH*p17A@S02$BUPC&d7Wf*?6b#zuiANKPUk86+xM1SE?#ih>|ui-6>$Z)DUJFGR=oO4&0hMF=t2@?qlg(APLqM(UF zoy5Waorq7v5xK0-<0upd>b8QcwpZffug69-o=5oA6W>-(%bq2s%4y<$LrwLNgX82= zuJ8{5CwV?RH9Dtw>Z}6c%*z)ge>{5bWoP#qWb5)REqRn1?q_AYd-^Xq>U!HR;U4yG zFH`#8CZ|&2m*?{FkxcS;V_3Ue=k~k7)9R#!ogJwh@%d*|az$aCTQnT-2YgD!{_~%Q ztcu*oSHzv-;hO)PmFiB5`{xve1upa%eAa(b1&tD*_r*1A~Le$M$x|Ta6Q|UWw5bPEIl(rkuq>va_$Tu&|tdz#^S2 zGu`Oo?98A!MHc59ZO<|^yWzxg9iLas`W5-e%*?EYXGHG{!yiMll69g4#T}i~qLoVA zG5Da|T)vktUs5qLHV=l>POVZ=Q3ZVbc=5Tyg?2wP4-XGw3JN7nP3osXL1O!XgTup| zyu4($Z{H>+Bb#<(iB)+9=kDz7J@R zII+H~a_5c$v}9ytB+7b)oBIs3lK8j6*vRMw7W-^x$4d>ry0UT$&VcL0q*S~fKRyp< zb#`{j-%qAtV0aF9dKMh)A{;HeC3fP(iNwFI7dSaXd!(;OOS3^+RK%wegXeB7yHeB8 zh%w_E8&97MG*ek}J)N3<+BUgfM}3nC$HvCi)ZBccrQmZ`mb{)G!xg^v;bG?8-CZ+% zy58Pi_^rPmBnAYauyJvLmiqAT^Bf!juUwwVo#)}^l zXdCVT_jwi?>MGEFYsuBe*B4`CME2SegTb6g(P(NG9U7ROo}H~99!_}WQdd`}p{pzM zU`q_{{m{t?np3%bdxCfR^poW7&d$Jr0X?;U2Ilr{MuGjr!1;{8p;_l%txBbggaqc- zy!t1@6rP5Mlbj+XbXl8}l#Oev%-+MFZ9V?h&5||dCA$;b?QOlix*Vdy1MdkXmzr|+1-8S0n1>Z z3Vf`6O6dIP(d2`~rY4n}LPE$zTZ@BfR?|5@ihw6+c%EVPEJKU7t*ojrRt zF>-2p`WYc9-K`6;&SmoM?(Pkf4H57_8pg&^a4WS&#?QXdrKKWkYik^ER8zBVkgpDU zh}W=$EGa1|F_MOs_E~s%`1!()u;PG{j5$ieKTo)A;Kb>-~I&qobq5XhHXR?dJ{m@4Od}>vlOf zIN+d*5R=+`03pQR-ygncx1xRkbLsp28|mrg4h{}CEE>t+u&B8BBk^dJi%(&o56VRI z^;!p=b_68ZDDUUT7rrlvOiSa0ORQSsYv+)O0ryTk4B->h*k|G6jLD7?esEmw^co8QyYoar3F+@&I zPSD)__C&En){9<}Y%mLv=YhMl|Faq@E2Ur}1tO2Epy2#ZER{=n(d}~o{{4_vX*~4a z`tLS*xPzpmq$p#3pU3#NSaWl;vxmoTdlpK{7+5NdO-W48eJOOMdhM`Jyu3KBTp{9Z zNzKWjFgG_(tPq7KfCv<1sShiiQ&cqmmCMPKCpGTfI}K6l-n|fruEDwL+bfEW8*=ul zd`enoO9=xyca{I@@)l^aRZha>dQRw31F?z0MgIP61qond!>wKJy0|#g($W&-EpBe^ z#9%o&xs!UY2_e9%sEj`#laP?Oc46i;X38(S3L{9oU9D3^b34^ly~pmg%nWVlc8m9XBUz9hc0Br%D4xf}D8qNq28?Rm zzgbsJO$iP`x~HP0{oX7J(GsSDUX_m+Je`Jy21-UoMy(OkrxlagVTUF>c>;#bI)!WM z_wUoOD&Gg0xu#}j2xC=FL1gy&`ZdtlI8=9GYht(J$)b9;c5}*?Yof-LMED<dDzWmdPDXHn#GdL?#=rp5=M;o`?i{+c55)wh?4Dd@cyzfwv1XDr$HZ2uJ(gonM z+;y5T1>{gP;5C?Uq6tf{0R081T%5EoQEwa^+^t=Gm!^Sb{G7D5vhpIidHhjgs5e?G zM$CS>YIbnV`Lh?1+H09W>+a0`bJQ>zEAxGopY`JVrx-{TUDgIWkD_HmLWwX;w=n1? z&aSQeV5%CM*aNH$pUDC zk@U&lY;PAXyNJfrNj(gyn#1A?@5jdboJ7mDmxR1BJ_m1f$M#ATvn6B>#i^t(hl&dd z3TB(S?kZc|zb^-OrV`;zEAraXOdJ|W*`&h!Zkm6;v*4OL`QuxJ0)a`cztVzC_hCky z8T~yo-TOCwa0-<9W?QPASDd4oSzL^K_l`*gr@8i=gp}0W%1Q}oPlz{dBkY`xsL9Z$ zO_jOkiJ9S*xn|EIwny@93*;TPht}mn!t{Yh-8KAVWSeAp1D>A_>?EevZ#ZPKL!$uU z(l%c(+rmFj-V60^t^U(10_bG#iZjahmKlC>Joeoe^xAH=@XgsiN_yiRnOTzggr6)Z zCc1jiI^fJsd($0*?>5ty@R#fQf2n3K@BZ0I(2FY}vmWF$IMZFWo7(ALUI1i2kq}A_BZ3<7F=9hKhg1x4GmDx z2%I8s;qrCyP3XEc@guH~e)U(J|K_(*9KCn6T8YWYD-zPu(k>|-JK-c}&6mQT%F^SU zWVT5dLS*r;t+Ey7!rYgns%AT8`v_1bzsh0?ll|8dg^0ISf;70apYRI_3y0+AufB-v zDku;Dgv=o(#%R}{(-6w;M~oUMuvD$a3ke8x4cS%u>uYDw;NYH+2uC@U zGm49a9zA-LcfWyz*QA0$R#x_Be?NX_bt>Pc`*JaRcUKoR0A_=*uGG{EP`HJBFlWRm zpLW4Yquny7ztoGNY0Cwj-~*Vh~l_>IV81+ z=-RbwOcA2e$&|Xf{f;dnjw8f0G&E4MAw^$NbgDLCu9N@ivExI#gTBW^o_PFv%b}j1g;76D{SdtuY*o0$I|@LtVwO0D}6q%7;F2MPdo!- zeV6^o`|J_l4MR;PB+-_#Lz`pk-zcSjEbJyO?d%6vPi}RHxNNsO?fhOlp6qE%?}_eO za(TS6nv~gTr=%0s6--J$ITa(*xHMe4n(Kc^I$Yuq1f@cqIDqq=ovE1B7QX87vEw6= zB;PIlJMV7ZHfNQWmtPzzCWWr6p_DlY*xK^o)i3xshWWuy78x12vQ#=Y`8|wg%@Uds z^;l%6I@+^4*jvcm`I8ot=e0WND7&{(-SUPH!X>nKrrdM65!&}0DRU>)%`uX7aJWWB zPJXTt#;Jkc)F-gLUCn2`O+?gti+6EpX~tCK#tm7({Z)JOS4XORncrMDu1geirF~ko zP(3|8tsLG3aRmCmwe`-<&Q48J6LEWc`wMh=a#ik^FVD)$CGOn4o06MLsj8}a@$%)Z zt7x1i_wTj@q7d^uk0pcM0)PQ}`uep$e^OcCql2rfWl9`|KT&-&HnqEVkM5%;w}5~^ z&Fs4Q{re|j+Cb31Dk%(6SEWK-ga!#QiqN)9Sdnevn!gn?P8F8 z)Y0MhVd&0WDo>(bKLyGwYl(2T!}>Ut2U6$vZQbK2Lz#m}&mq(A3!5F|d&dVfp34Uz zQ+B=O7)L{UHmg$|f7aX0?<(0C8L^I*5f(ujTt6`yDKp9zXfWWyx@wh?4C)OiGU9Wh|B! z`{oU&urS?)SmK4gY619)3yARR?Z!XVnNH*$81^mvZ4A@QdK4W`>Q;( zrsftu83D{GpVbEXfnq!QFWK4V4i4EH1*Gn2Jv}|Nr1aOnzrJRup`+7lfi=+6t7&K; zgeK%%TyAuAby3kna^}kZ^5s-Lf4q!;mCxYDTzCG1W@=hGy8F9pGtO>q&v3X)LqkIx zap-*CeUCfw{3lXUQV>$a*!aDVmB{7Gr{NX~ety#TvJD6Uc1cN9n(&d{>ZWP+&w)8_OUyd~Z^z~yFwxxrbI%;FbGXo0@ zDH12`D?j3M{r$EGB$NApu6KNy(2ui5Z>RIf_#QV#6QBaRb;|vd&vgt$8p<3!^{?0z z*|b7i=u&uL{Wdz4VWEGiE2yiJL;Z1Y^w{{*`PF;-y26E6$vVfeswg-fym{TEVy6jH z2K|8gBb+ek{$6CvN9$+|)?Z9mSS>`dnFV2C;mIhG(Le6KsOOQ9+ImNm5qy(zx_-$^ z{Tp-M`q+?=5D&xc39et?T+N(<3%q+d212r8!t%=7Kf?pG3<(RN2#9XOYafhrMnZe_|o* z-mlk0`*(GpcL4wi8&Q1gTrg$vF@u|IgZzWY{Zp;@w;8m!eNX8?D*yAB)$*RD1fD0` zU{Ab1s;%*9<6Gtabf@F;SS_yjt53n~ppJXmMpx(h*WLP#Uwy}uy)sj8mL19FxrA=s z{C>ED$|h;+FsdS9{ENy=C|)qiZ{-`Pgu48SE4=5ZLq)+ zI4y0S;BVi=?CtIIpgFi;Gd8UVYG*?%-MMqMZEfUJjZr~WRaFPR=-apF1krZ3wp0uZ z#H6I83=9mn)YU1)#l=_F*R}QzE>hnvRaF8o165bdf)=2mn}CLNw%>KRx_i4E`X7bu zdoE9mI(e?n5G79r$5C3%9r;b<*7%N(zAq2|J4%3JX&Pv?!Tz;-vBik9PVzg^nR1q2 z$ZuuP&m_lDbYLV!6MI>y@%}t*$KRH;N!rw#*L^O-c$wSTTr#mA3)S6XQR;hoGg5$c z&>CBH&~t*}4>O0XB>RJ|lJPhl~aylS9 zKAiP0%RXL>69{1OfpCMUk#vPI@{KYAvV?GMu=CL~Q{t z@EZJ!X-O_9D9$ z7wtzXz3DA2EfMPE)X5V_dPJ>kZJn-{6qTyB?d35lb321tsi&0rkdh)Rtpyp}WTe`k z{r&s*B!5S~5unz(H;fc*)CE5nr?~-dva-1uCu0p2F81~7EeQl8<$nGgkd(ysNj*6l z7PS4y*Rwi0I)M0eMH|Mnuq8!BHFb3-ffQZ#qOMUS9HLk;rjdK2AhtSh4yLcFoh~LD1PL=@T=`vCo$Ea}ZO9;E^+ggbBkghmp6(%UZd~sA;M;9;Ylkc<96O5`V2q#l zbaMF{3#Q#x9F}NbJD3{cG_ih=ASzalJ%3bJ$?x*oIAQii3bIiFA|5OndPhq2g{S~6 zo$BM;Lq{fBLoYRm`RGecWYV=?Au#i3?M?M~>svvRmNFA916|!vb(uqL^Y;xA^j8%! z7T+PDmgkG-!Op6mat5G(0|Nup!BMOR^Z+0(X*ym#4pVhqUHWAIqi=H9%a<>oL^VdU zX0608SM6WFNF7#J02kpfJnIm>EVlptGK(K`qF7&FU)ZcX9v(ZoOey4`m~jVkEkj5x zBz1t)nVCHC@80qFT-4UqroF6|_&G0W@lAYan%mlRGvr{Bg=~Xj60-GiakIe!z^8xa z=OKgRgS@)fDA237?$BF)_G%J0Dz*y>t{uK*_|X^S(c^zPrF{QFuVWYi}T)S zM?JH&qsdq2m5ZZNK1|K|VGNeyn&;8EiRHxWE>=`T!4qb#L?#a{R_EqCS2wnV`CEg^ z*ZAK1klI(C>Z8g2ked!%uZfuF*=2OhmYC|0A@(mo!ffX1@hnQ|hKwH+iM;-DeijJ_ zfA_CMPe!p4IUjZ(SMMLWZ2ql!b6G0djI!GA_#CGt=E?G?RBM7rE;EFW$7WK88{N+# z#Y4d|y7YH{WyKj)ld2eD_Ta%O5Vrgerr5u_&PGcnLZmk|WUe|`Q@xWQOwOqs{e8YS zYqeWlCW8eB|2&V1Y8d(E3PMaIrSuN!);48_jQ^43=#zzO2=<5AqnSYq<&DO3&A?kI z)aNf>6mH!LI4CsD%F0@W@}{o8pB@^;niB0fV@ryQ%>iBljd$zeL$1CY;|R!Ry3`P(?C}INnNigMgo>dzYlruH8wI_fh11V@(2o10|_RX8nkrAT@4<2wp!UhoYOIp%&YvlEHTUl8#+_?Wt4!gIvR|j!~kdTn;>ec#aR*9cKf1-dA0Yxt5+c!oCxOt_ep|P>C zXbexRikXc~7-RyIevmvLJWK^tbM>71q$#^!NCIGZq}b&f8?8y_tBxX2wVhs&OfZRx ziKz%o&ON5z{ySQq&F)|8f8?QK{(GsWi|OF7&a`v4I~R3xTMXx`IOolmsQA>2&i?Y< z5Wp<0jnT?(4^Oo(`Q~>FyuyzN@|lPDa{$QUH?Ls4_mQ{uX}lN-W^cYKjd&}8f`-!~ zK8iI)adjPoecOKxo&4G6*(+94Kh9T+uIQHaaC6HWXQ6U-_M`)hDxvf?TALd!BeQ;D z)OSs9EH~{9m#@RV-^k89^GLZXeZb@__GqeZ%z3}xu-aeE#xfK=++M%+$^Luh&s}0- z;y)f#LL#gYw8<(1!-KVrjY`>EI$L}|y28?J#HzlzJ^|dy4%D*V2Z>$1S-MjY9sOMv z`mPyOc%6-r+G21V`IxHxhpJ^UQ}0gbF{_KmdB2x6=4wB?;jr> z5|fiJl~e({ul8O%*wk;Aus_#S+0O3jj~_p1Q?cf3BM&xb-k45~R(h{>a3chZHcx}+ zm~UvZ-`*L%$_;8Dq|c?gfhzaadE#W%@samP#bX)(V{&S0(RCKgOiTzk)6F$$crW4U ze7NVHDDBI1=FFKj_r&+_SBLC!o9m6VlC_3(vBEcRnt=kvFCr3JRVA$y#Y6}sxBY0v zxBlk~a~+XuyFNI7D>u;l7-ak;H#Rqc!qm{yBZjFI%=N3th6dW3d4p+^PIqg2CzMxG z5(4S1wXH2SF%dF0UtFp-PuvAf$IM6n^#X{9l=lCdey)di$^HhA%7edvi7Ai~6xT>H z(F-i@WQ-SWH}XT>-5{<%>LE(sCirB#rNou$o2kHnVTU?KoD=5+NuPEB!`uOJew*y*NtaVtuCe#cp~16YJg2 z+&rOyRe_p>s*j4;UcDpf3ZgV7kYtd0uKA9eH5_z<&Vhl?oAJyfwsv;=2mT7fczQXN z<4r~!kk>#<1w}-VrmH^#cL2awASOWd0!4|worO%87AKz&7Ip@D{VYAb^4{&P% z7<(4B82p^5qoX4t;<}LyifVnjGvP)CU{ORw1W~*3`LOmuG6qNv`r`-hAI;5S-7YMw ztP?GS7LUc7yI)sK20iOu!39yY+baai)5$ju9N|3VkUMsr03nAu+e{>r_ zxn7p*Y~h*$pa1*#pxlDw0tmXRyIU-QDl9r$$=h23u0x|qpa-r@0l^tysSlFNvuCH& z8uJPZ<-r00-zzHe^d&nTtGAf z!vP3r0UBJ>4_Nfo^LZnHK|OWq)Wc~P?b&trjzB!DQK z;MYJ7y?jXx={4$=%jwK?kd|U!zYZB1GWepGe{ytmG%=EMAp<@Fvr^a6qRJUFJS&6) zEgW%d@X}gBk04{gRhlWr{D-rjJg zojsizBk0HfTof(@sRG7=}#jV!w~|NK3>#9940nd(9S)TWJ*jA?WZ?54!$4?+952|W(1 z49Gu+0(O18#D||`#dC`~IF|JCDBN#|sgQ>$ZnVCIr<>pY`ix2-@lKK?#eSYk7!)Ya7&Bs}GachgcJGVUNpsrw^W5^8q#f5iOR8Xi$7O{dciACTMGB;Re+Y+`_h(f^O^1#wE;~)`g zKIh#vOC+g5V#EWYUja5cOUlv0f)n_k&l^(AVvjEJT)hgC{O8S}E9Vu~|8rAsb4$zM z>FEdG01=^X`T14VJt80o@>{Z3ym0oqaoH&giz&b5yv>ab+9Xxr#Zb3+;&^yVOG^Ac z63D|sANAcfj_Z^1-Mfh-YnZ`66JHP%qyb0>*;UhfBnLCJDU~4Vasg!q(!YU>7q#5Y znE&(&c?8|HlL02yGi;amg=#^SMrkMYYR6?_=BKAmp}2T?7q^6beSM4ZOH4RpM3pH* z{^g^A%}hz>I-Hd`Ms5gd=akIxF6G~`YRV9EpfsKX6+N+#TipodWq6GA9&rRc-#xF2 zob=SC#YGf~l#aKiHi&3-y+dXSVd_Ee;=li$I4&uzfD7SNq<5!j5USkNck`UE{Q!!U zm36ltgixqV0}(0{6qxTotcG-TX#$StSlY|2tgOVZ9v&W^K)KGgFKs@ydhh`JeDdKn(#;4|sr-wr^o+qmoyp{3xxOUA^h2ER-@UvY5=%mY6*N+u#YRffNBj-i+Zi zh~8X$e9HFrypTfrvJFFlFAC<@p~Lm(7|SauoxXf0J^(xqZXO=s5tGNw4rpN=2l7sM zE{`?<1CQ{$fQS(pfu!Hd?`U_{YqM7uoL5ndf>vgbHU_@Ba6&aUkZ+L>Y=qCwL@0tp zKvhBtyA9MDR1A}^)TIOUc<(*23F1ZbnN~#tX&cETM1oY>pvs-6C7D^+q{Bh^9xv|B zgEH$(Ra~3>1dxA|00@4;|IDu554>m@=+Iz&Wy=z$vFLxP#~-O~K%kI}ZI8HiOn_{~ zBZbewi2EIQA*u#MSCWNuw6xuUv=fdLjPYe~?t+`_rfn86mvvBxTc8=Y5BNp9}Z-;Hf;|WkBBO|nZ zuI}!HsITSapv4$fJ~_wkw{xEEn!%~7SF;>rved8wWCWmczyd%r*&9C7)2NE|c8N6^ zE{=$GnIgZlJDYq0wOqNKRA=Mn zo>r8#xzJC5LR=C2)yf$VY3rWM&CQXta6_~i{U76Fi=CgFLkP^P_r7T8Rl(Xh5z{5+ z`n!p}ySKNP83>c$W%e8QPeJ}!h50nKzg+zWKar-Cu}B?wH$gbi+%HBGa!2qcAn}Kv zuv8bo{Q2*+)=BFb7+?VMT=(lMqks8>-2mkb$OF*l7;Wv3eRffik*5NPn9tOI`1Va7 zr%K!y#Y{v>8sXRiqS*-)lmVye57=;&WA?bTv>*^FsDO0E@-19N<73z zmHPNULDN=acH?k&eRj3a(5d#v4-%*aU!ZYNSu_SHa|0dc?l;@cdQ({V0>~VNR&8Mv2sn+^zT;2(e?#KV+`>X11$@*~hyQ=*$~? zb^KKaT1ISAQuH_1+0=>(mNB1oa-@Dm)CRJ3Z>%4P8(iGnwEziRR>ox!&JVKf8Xg{> zF{HNGuHSjO=`5H~pw;GF!%NQ&R{tB_WZ!cEhQov1WChU^_cj+EIyflm>%YARr4GYK z9B!h+|47jBS6MI=!s9`d(l0tR0fd1k37MA2lflrt{P}raR8+L7dJF^=@9n=0rDJ}i zw{~Z-(QHyoh}@juR28<+pF0KN z^(KfW5Yk_oUQtcf0utsw;R{_PM~55oV|(_ZHVO&rX&qcM>$@u(8_#ZWjBkWBHM)Qe z(v1bd6oiBrtSuv=|D8)yj`_V2KMwF2ax2KmF5=NZ#UiTF)T$^ezPpmHD;ng4>FJO8_(dV~?my5QY>_V# z6C=5`J~?llhAI>B?jWYz!y54Df`}9fcp+T#8e&`iTnE_)ijG7U8U&lg#s*eYNWufx zf=l_83p5@3_H7s(LJ(Xb|0aNA6B9OQe|%}F?H}J7Fz51c=rx~dyFO~&3ptVe@#Du$ zO-%vt!>&xhNO0V|NehSciXNV|J|PKaBrtdC7h0W%rwR)TOT4?${DcSoc5!iGA{{qL z>#46NfRzmnDA1OHrk|Q_c!UP#KC!4r3L?JJZPP{JXWzaKx)(=#)*{rztWqwXIa>;g;leQl=Y1~^LFg~N-AZc1(q zSRmf=HKOtH@eiHdLB^C{8X6i9HVHhkfX5-R!<05w2^r?a2;TDgXgcLe4HB~={ z)MwDUaPqpH->;Do4q6hSC(Q)EeAS81KlqtizWjfHLvY!jzJ@T;l>gZBgYM;JQNAna zqq#PeWb$1*WlzB-5)tC;Ru5 zEI0*RQh74PFCSu{gowXBzLn!5_dft>5P>2$BQY{K$Zfl715>eNr@}Qafz$+?`W?2^ zFoH;!!F{HoCGqj`52vL*I;?wwq*!E3@zgKOFtlZtclP|p_m1?+GFjM7~Q039R* zm>t{0$CQ`nL%0tMdP+e`DGtJxv=Djx9m(j`@3z);Lc|cH0uW@WI9Jt|_$>#|C8gV9 zD>WUG%9-VB%UzQ%K#+PX^|>n_KaqzWnU$l!Z`JnhSHw zyzbc<2;99*df-3gVRwG=L>gf6xpU_L+bbFxCNxqOfRzyW;O<^*Fg80sPXd}am_=00 zAKTb)gSQb3AorsrW!&qIVyYY<3DH2@Y%H?r1}9i{HaQeSPYVkRl^WN!w(jlv>TIe0 zF&n-PGsw)`ymRWf93ljGoD}8d>p5jgBO}SOPh|{nQo&@nNBrTP{#E{3H(mgNfxVkj zN*M)=T^rwnffw9hH1(I>V`2yibX!+zKe-GRniKW>JKZJ5w!X=5sE0Pr?h<-zY+XQ+ zyOSxr>zJONKHbgQ0T@w`KBL$YLAxQidi82iQPIN<7Xku;8;_<{76t9XIJAgkw) zkukNH`s|9*@_2F+;R@>?@?zNmv=94F7N=XT2*0*k2-tD=7xb8NJRs(TDqS#_Z^TF8OAMynkz0cjRyRaXb zTV1hnI&pDlpn5$Fyj{TPuTX!5pAC$@3I<&ilBykq$(*ZMjDgJxpk!PC;{%K=&|nOL zR%Afi+!R;CU}Ap|v0BF57@#;3xN+kK=yh*8tlGet0gxFujGup8wKr*xGzNvs+jn|< zdTv21P3!-WNrUtMxKvD*imBPF2r zgf;m&G_@#(z+b&T$;#3)1(ptUG1On+72_8Wc*)N3KO8t0sd0uI)eRSz5_WKi)yR7W<#z)S`ZnxI5!62pWmAULk)y>@NJG&dt7 z5NyA9?%eqR)*!?fhJkhe{0z-yL`F_iih7!rbrs60X`-VXZC^@Y@WDBK0ycO+wZ_22 z1mwQvRN&fYOs4%X7LDT<6s!k`1g6~^Pc|O@`Sa%%k1v1u@42}!*gjBGQ-gvjpjYsq zIlw-lfU!D0o&ju+US3``P=BSZZhyvz>y@^Yln5hI1e8zU8IG6m%u%wAw=6n~+g~fq zIE+=VRJ7^u-gd_^gP=|!v>dWcO9_&)na)rFoBG%rtK6sAaY6{A?zboke8viJ>EJVK z?8U`DFh2uI^Qm36de>{-Wr}kp_^k1Tzri=slq@!yFvKfs4HL%xn#5f>%a}*@7jhEI zpUbzEpC=&;41OyX85PMfE@81h!~-Gkfd+QVWqhp4R|2Wr0C)8C_NIWP9Bf-_1jQK{ z+;rECo`bcwiINKDir!b}^RV?KAH-w8hkxeg%t06SW!q7XVT%F{8Y*5+5fS<)PoCH& zC)qhUg@UcV5dbla+r=waw#)p$W&J~>0Xl`Y`9cfB7a2Rew4BoBB>sIgp z=KEVqYui4p@i+1c3J^*Rp~zsEFlkE7W4SohH$Z$)0v)V;`}P^YI#lP*1p^}nn^DXT z_cozO1%^NFc%;2~mu|Nd>#udb@PuzCpPlFnD!adVhEKT7UqY{+7n z7#Yul5(5kTWvCY15SDlppen>SB2BRE9RKK>!;eN)U_0vhq5ALn2=2^_VS$+Mh;=70-XX5`G z=ZG27xJM2|0(SP?#I0_v7mlN0i-a~_bIsN|B;Q_#XTxuan4F!OTXNuP(mQcABJ5YH z8(4wujf}&khCNa&R0V&xCz68^Eb;Lkp^@13xIzEUbN%?qKTi=C*e(IzREM%@Jz_Mp z_+>@Q+l++HyiID_>ute-RkFF}dnMC^71~`xY5mMk{2XX;3Wi+hebE(FoK*6KIM&aw z26eWi!}Q1KmAIMMmU1nHg|^U6 zUu)NlzoxUf;oEo6u(BPWxv`MUA{Apz=QO|Sd(a}7&W&#VAcxs|jw!PrEO1=t@9E(H zW)NyOetv$$_W*g2HfKTGV|-aW=^eQj=1p6h8n zurCgJPpazj;2NYnkd80#@Q{Ft`Rgy%uP4YK{1I;M?kQ<$X={9JQiRw7ub1d=FQRk{iY&jQ= znuky1O(B?BCpMHK19n9VO_Imv?v|HVhVsP~@fatkVjq$!&T%S1%!`5el9!hk0J_;D zS6A=^2SSqAx+DHQrDILhl7y*#r(pT4&5-%r8*pEdjwY>+>2fk5|v`SK;tto9^C z@eg0V+`$Dffw+oZy%_h19VhjEl$@Bj=1*rDQeHuUnwFVK0)O%g3$wj&(BkoR4o@&= zh?Aka{eJ0X3s>)!2X`DAqpJ&k2<@YX0)y#nO&h|hz&^%k!h(rUNZ8JhNna+Kf7g|> z;2zZl=E?x_tE%G<@I>|e3{sD1U$?6^T)8s#R}gJF>`w-!ypDSfKfMp%zM)Osn4+Pt zfez*il=zt7Ill9XXyr#zJ%n>b1&xQv7$$mYn%`5cdBsK4d?m~ESG_4X?PQriEM1g( z7n1~5z%1=|mvCH{h7>TF6I|Com8j?c<#;PEKcDdhm+#JH)(q`%ke&JOZ0qMF_4M`e zDCjsLoe7B$VRk@E{sl)pyc5B(Vgbw`^lm)}?CiVaeC3!gA3vU=4m$J+Q9_J)6K8WQ-{&M=9bXN zMGPDDTt=Svw6q9}jeng8>jFsND5CTD$&)%jYPc9e5(V9xU265smHnols-(m)s38dusUwAS2BetFVzx+!xh z*bF5Sg01`<+XBp-55Pq=u7UZvqrHL>9L8~}8xw4X??#Epb<$^n z_yB?j{C82^h_Lna>C>KYO~87fT%>;ZfC9-0SlG}m0(W_Ng2_p`GyM$U`(%ZZ zv;js3(U_o00g2!|a1TJXKh@?@1lvVwYU+zuuYzEA001u{Sl@bOZW#xw058ZvS_J<^ zDzbR1f5NWhfhp6bGvwsKP~X+@G5-MlXPZ%7Gs7yiC>_?Uj^EyBXXjbi2M8|6hOMPx zWXC51Gc)BLmyUb+f5zdH%>QDUknYzJ;SxG8#e2fK%xL|qckPqK#7d^(!h7R$(`ztm zu!HMJgmlo^9H^ELpZpT{lljI;a?4&GMVs!BYsmbS*B3f^av-^7KOB6U?lo8+j!3O< z{BXNS*U*7CjY-C5$gqaIsbS^3d-q&w5s&}1jm?dpMwn3gA-#&#Ru?01+4!-IuDGn% z1qWSO{X5aE5`FhOS9dIrB4RalDYF%crr(xU&9ue-$ie+y^K!7ZM#NRvt?eRCk=zlQ zoXid(5|M$Q`~X)nq#za3jpp+%sPdm?zp3f1J#%{Rbl%&WjOVh@RA*^3sc`;Mer&5} z3;7*egJg<%5(0hQ$1tb%?}moO-T?OuK6Pi8>qo1W7+S_}_3pvUTS4EPeqHQoLc)}y zBHG~K;Fay|*=b~)LqWww%twH&wbIpK@3wR@vZ)anO>o$*Z2h(p_JUCd`zNdhu4~s2 ziQAgSw;+iJHeVdP$ho=-f=+Mkf`B*R^nU&f05ce}eLQJxb5jvq^>7X#BiOs0F4a)L3sgS5CgDRY z9{0BEcy?(ido!qxJxrYF_{c;?1e-yFdUvGtQeGd>;*VuJD0KUhm(5b!`Q91Di}ta| zNl-=#vf=V7#JqiDJZJ4BMnW>HrMG$7u#fmD+OU}+Io!U_7in4MjKOpHqtJ&|M~W2s zVIkn|u+AgeO=jbttnI>uiKbZvBmT#c>Zpx%@1~7+%t0dhHEhg8G-HQ5KK`iHda=B3;X!Z9V894@lzJ zUKp%~#)=4%emn0PnwX(B;`e~_{J-2^_QuTS=U*;#%%w?t_3>{E$g4OBS@%q?t=nZSkRiE^Z&b|ET7cxNk!9M&TI=D?e(SINDA6fjL$H$?u*Y(}0 z6wmRIKc5K>1$AnI7&(h7TY#UxR#ea=#&qEty5B)MkY3%W?wd$1+2>c*G7V*ISAd}G zv<-gaRyaLJ!4Op{x=Cg904|ZI@z0%ZgV{iW*+_J@fAAnJ<`dZd@Ybm;r1al?H z_(V5`2I#+gZ&?4_K&vMmYTNK0*&N&K>=D&AH8EI#r+xI`lIY{DSJIrWI^L#dkIMMQ} ze_H%Qc2B8_mVZsl{6xMRtiylfhN9aY&1B5{dkD)xBf~)=2}Iuka?AGJ*AX7z1~s?DF9VVHPc>u)!8p z{`=3^C|IO(`3Ybba>OB#>4Fe{N5v6id*x$7^}{(!{zzMlK~c&+FS6t2P#%*Rl9bxh z-cEt+O!7b8H$@cT+4lEA<>lpd+YOD4lkf(N9dP-if44FkRr|3*-aA>(4_;6_fcMV6 zz7XJYU{mUcuU{FU7<`tKbN!RrdlD4VRsU{kA_p|ghNs+>*=m=}`Lq!;b>*T$fmPVn z3|i%kKDwFd$586UOWGv*)HbjF&|QkX^bI7`%NOOEn%L?eL^?FJa;VxI9~}Mh%vJj} zKRVLgw&7Jdn)`S&(ORs-^{?BgZ}Lnu%NdlY-+|~Jyygcg(5l@`bOt~>fRK;j%^N3C zAT<#FB?`R7!5`>p_VN~<_Y4oNpn%m}c(A~rEHaY!lUlO;N9?VK->JCIJ&i}1|KJ!e8ELQXU zXC9pA-;r9x+cE?6&#n9SFK~q;uV#V$Z7+aY45PVnFG7;!DvnlB7UWoPvkjCwv4h!@ z2xV3{Sg{~<+ot99HAJHWp)&G-24PCz}Xw06f%3jDbNo6fq{> z0N!#)NwLCfV7PdA>Y!5jS!k`Up?&zVNB}JBb06-N zzP|oY2Kqp@=lPSnHWu%z`T^kqH4Rz-qc47LVL{&1G}+}bKr{RY*&qf7c?{+(tSSak zXO6Tb;EI78W+ymJW>)k*WR06Hf)J>zhc-4sD)6wX58V5BaA4bumwYS$`DS8qv2}o; zyQk+nyq*AFt`G%p4oESr_KPe^gIWow6Yy}LFKQx2aWE>tn*$1&NJx6C-zyjxFagO} z4_+DPJ+}tFO7=L-@Jzi6C=_f1_`r3fiP#%q@FUq}stg{R?<1X?TG#2m;P03A3VsTZ zjHjV?KpY}4W|0+BWMpI@jw1C0R4x2nNFAaCGZj96G5SU=A3|pS5$Q+d0`R{fFJIW$ z*kG_x*3mgfbNNmHywwIoS_Yc&e|~ZBTS4nOc#{#lpd^xT@2m6-v<$x`_Kb73W@dJF z6!@K<)=zMViZVdO6zS$z6L12Ykwl^OvbS!bLMYkWRV1K4SJu{^0&-LNcoV9jT+?bL z;6H;iuK;-uyD142brPjW0z7tn?}B^q78;#tuvg~3fC?xztjfef2dC!cQ312$vyknC zjOB!Ke%?mTYGN0=7&XsP(hX}Nli}=Hr7Lrmkt(h?SwNG6B7wo zOO%FexRSeidxO){uZXfx!0R*^_NSgLXt7WbnV6Vdh-mNU!GRMD5h1`QXa+B*sPf$x z=n{j;j+hdlAO)iLKJWAwc!316?+ae-p@0S%dS!3Z4zVYI01l}j5cW<&g~;!J%?f{6SSS^yuM2J9Gs z`LwpC^STR622+qin|}N_83B%c*>4scDo8g5o{79OTa)}A{YqRF?;CIbjgiLM{#jhN zU&=?Uw^vmr6Y0XqlDb~sYX+q`eqL2ZrAZ9JJ~yv9?B`6atd4~T=VZxZXsz@mYVrP8 znw2rnm!VO6K?(ui!|De1B+hg-jd^xC5DE@>^DcIG(V%6it=_)F2_YQpdkh6`l9ra1 z0fH3hGVpskg}*NGR|;#w+f0Dvh+GyzUU>s2S)?}MQhdQ=OJ1{?#SmHPWk`n`U|M2+NfhGe#{d&qRrQ^lL&4?4bFV6*LR_zh@Wa(bb?XC3=+AZ{`C^%G+hiW3aRAIa z=D9-bL7|GCbpCa(dDI@WyE<_SxcoiEod?gKlc6kzOY?3|!)yWnk(d{0Ya0RwX-}Q5e4~ z6zIH{EHZ9DRlY$?kx=!&e<#L_g26|@$pi1hT_Hbz|Ap^6f4*KwkoAmTDS`Ci6bd{c zyk?C72}C*qAZn86gd+oMldkF^OJ8Exlpwkaf5OFumxn1E?1_Mf zcNR&&5ReKbucNaSyTxer9yyWZ zzY#7Z$bsV3Y$2ABF}ZO1k`fP(K;z=&xlER$ko9%@a;D$LR<6$bLIosG%-NT9CC7w9 z_C!kJJ>0n3>SZjSlx!Z|r+tMzPY`%Bi(>U{H%NMckec*Dh91iG!c3n zY?A_aGdsL&3wO&Ud5Ls_iodyU6dd0?@g2;Dw z*Epe}0jw{ycrP$ABA!&xS4XauB&`6-40uMnnqwrAn&65D?Yc^!iw3$D5!^X04n)Of za-oero8qy^dc1->yc+UIs6<`{1OyD2loQ~mI**WBQx7VC(4dXLM{#`W>X#Vew#GyK z@jAZugtQs>=V>-QvaxhT;;uxuv)0bx|Y{nNp zR(&hB=5<}YMdQ6EE<#Bu{A?tk{3I&uR;Mic(kitU@0t7^v1x+^43mgW178Ae_38O)< zzzf|pFcMhmLC^_R-VN|>gTy}w@(|xN9>ktw%7VNMq;w`$!lIxm0o_|Ms7rWJ zKCn1JDFLW0q?4vkpN4=KlpU0eu&Ca?b7v|#7@8ZwDg$^ZJRp%F^GgBj+yi&F%MQe@ zb%?bbNQ%Lnlx$_RrU{mQ7uQ|YIRM&`k^t(A2GCZj$M7kDk`%~u^fs-4ulz^mm5eya z^jJUp@jfL~{T6LR)cyhUXd!Bup=W0=*$(dSVtEorF_xu#l>{I=p+PsU#>s8dJJ!Mp zdIB$B+`FQoW>8`oHs|mx3hQ**z4M|%G%i?y^PG$8`D=n{clrfxWAu=Z^{tGA_%;Q~ zm)=piI9Acx{$yeP929_Y!}<@Jl6ZEN0~@~EON!6D-BZhA+j4t(Mgbac1gvz~q}geF ze^SOx3)5D;i8#xTGqjiUCO{2vTc_ew472XNsGOVp>873q#WW;Ppsi{9Nc%B6yAgTX zgk%r@D?&ipV_|jeAUY3VVh3T!VA|Y#JpzR%DaikzzY`Z-=XE5hp{98K zdL;C7LLdJ6dhzq$3^rr6E!jFbE|z|pP>H?-xdN~j=VaWs|KJj(UC&3b$Yhs{{CF=m zv9i*6AOVVBI2;@xbNa%=^g9|;o7+nU&>6JWjcATh)jZF1&`SdaoRBaFrlhdxA3?H= z1Ofe$rK-Q&iWH^|8*%4U3Ow~E0yYkPMsHZz` zA|rj8n{SMEHr}*^M+N?gf$#+V(s&$ayYL`GzE|{^R4@XDAoPfVLeL*1CgARZJYg8& z)zTnRb=h4tE7{*u%}SXne$turbZdHM#vB?vQ$EgPBtg%Of)PoR7YcrOsIC|Z$jMrR zcyPkPM=m0J=OByG49Zy{mWxV6W1-nv>g8X4ebYY!KkwB!@bYKhzpwU#FH=uF_W3Xk zOc)OS8J4^EhRq@{`D)x zgQwJsl^NKop4#$a0%yV|i~i%oRWj7)&E{p8R{(3kGeD|3N=iJ?*DF{1v^;148VznS zsPv%%GrKj((3lB2g^9U2BC?=UfU+P(^!$H?-a&e*E?Ng}St^hwKskBtJA%Us6nda7 z1ojQ_2n87qbTFG{FhlJJH9HG5KXXKN!{|oJSU3^X$+JC~5=nSlzs;Y%K9LO-51ckGf-ECh%1~|1u7A6sLTi zPBlf3LSPO)!l|=SJXOY8sXdz<`1R*)RgWwrRr+qfHbfTQbQdSM50t-<+Fw{mb$v~P z%#>B3R&mE^!x9mkPP^0FlcZ7Hd!~318?vu4{FcI2qfEKSLpR$if*vjO!&;G0?xghZ zS#8vfy<8a5xqbHzo|3i&Zx2}yvvt(^>WAAHx7F=S*qG>vo-&W`dBV@?w!h>3q18ED zp8h11myf*+xB#$fnwpwG_2a#6dC*J(;MW!Ffh&jyDoaJZHMl&+U)+R$t62V=8>C9ka@dYT*@#asq;8* zSJp%M#w)jV-EXm0&PnjXLTO-{Rm3u#wXh!-&YX|y=lTcP3M9>_zL{0{K~g!KIjrW% zn{3MDr0cJ-%X_%}znSqFcO%_+-?|*(8}{WQ{@H)??{Q$UTyp!=ge!ODW<++cb1WZj zog-PG-}_Yg;V#sYu!MvLbI<}F^gp*{aviN5{NR}^47$@Gmx%hM>O4lGpo1nQBWty( zJ5p{3+j8DWtn&dj`l@{%4|#)YJLNxVNhyKSuP0eqyX4m z2e%2JwxH{vwW^i+?>F;|jEsQp?rt~LtSeL4_wUsW2qmF)4^zJD14;16&2mX+x*oYYoo znNkC3MTU9_<%!znHEqu`ke*i3iHz{tck~TVm}OL=iIs2K;Er^Q41ntzI+}n zA|!-&dyP~TutYxqAdU|=v_Od2kH%5y6dW8wuLdlKz{C@6FaK^I_UsJ142{T0o`l$R zKmu$EHftat1`A#@;Fzl`$(SVrpkbySWICV~oP`#l#3NNTwd<~~60qP}PW{Zf!;NH3 zV735v0m6kmNb&%^xGRXJew<)j=M@IoaooFipd-dRIou$JZvM9RCYzla0OvqgU+}1% z2L6huoB?cWgT9-V<3<==CFa6U&K%ykU}68D!iMvEQ;k`vr9|$w%~L8&rS*|yT>Se6 zDLy(gJNM7_ci1GImi&mWWp-y2tBXl&_V+77_8W70@49lSjAIZfPKigV-Rb3G_(B@N4hbW|XB!(Q$z#6BWNt#Q zEMo8q?LCOAn8(q6bc_}>cfg{9SnL2sgM1N8aW_}Sl4DhjjF@Q!jhkmWsh_m|as->YF1NRww6{K1kc)u7WmbfQ zJwNAkyGD+Z^TXbVo0fl~PSIU`dJ%3fKAiE()}rqmS!wadkA|HrpPigq7nL^HhYL>W zmpp$NHFe8wQCTwYQvmPGmB;fB9cM>~AZE`FrAvkWXf>bt+EncE+EY(aL5UvTj$G=c zmha;Md= z^!%vhuQpfsN9KmwNyL>g12_a5G2lCWFZPXlL+OO@kxov?{h<{t0I4rVM~xSEln|ig zrNm-jGzMy)$>*8<>XXOnnE3VGm@gd>05?%k{Rf}CQdFB^AOs=}hSB*u zT({c}ASeGYpiprDli>VkHRMJ!?j4a30$TF=Q8j!9YF@xTQ-5-3{)1nH`Tj$B*fB%@ zAf*3;B6WW_g&-jRi#i1kYx+-(QhXn&Nm^xn0?$6Gn~UtfKSEU!n-rc?#D5j%?ZgDRE$o9?oj^{~MzMbco=3k1v1?02VRu!}kLIojaAN>w^X(c;|^( zf*~~L_KZ9Q%m4Z4Dr+nB_(5b+ff}4$k^%lN2(bW6CQ-0OF7hAV)aZ=`ePpl^J|i!v zPR}1~u%A8i4?K|1xQhaPy6y3yYiR!zZEIFuB z!K*+S0tF0Hg{luA=|kCpMCJPfv3e(>o) zGUjg8_Zf(w8P$$YI}$_35XXCXf^{eYOxj4ObjJK zWMZPm+wNrM|7j;n2k{Lch2R4NHN|x(sR*)jgj6k`-Pr-xYDg+`V`{;p8@gc50C2By zUF|E?ai?!(r6jOAbgtaz7)8$kO#`$bB7B91%ee%d^XCDnfwvGC5pq?|CD4NS{CMmS zzp}YG0O%Mhsw>Wm_dX9=TSFH$!XXu>L#Y8H0Nw(lAJc))X7E;OsxLH9!xzoB=6^xW zYnlOsT$b0-z8PQ?aClgrAMtgyZJ|ZqlLET*|4mQD6_Ahl;GG&@UM7PQ3(OhLvC1Yy zIRp6!O0Uxp&ssB}{z(;gUB8H+9#Hfkct6IMft#x{nzOWW9fK*K`_^(js+^* z%xNb(y9Ssakjnc&3%c2tNOpYHEWlj^pl=%>c`K?LBr~^?WtpLL{*|p$U7Tl7)(CJ5 zv!tUuNEy4*Rml17eNNFt8&x`@!88<^8lumJOyT}jPvaS~=Y=LDFy${o^K2?858yAz z)+>-Budb~@lqHxOE)#_5%eg`TB^WFtK+T!Lt^%Q7R}dd%(4YblchA7!8cno_m>4jL zc);d?D39|QB$5w68b59;K2Y?8{QLK~J^kBIcfn_Y;A7+9zz30CXmQhnf^le2g{KT$ zPV2*3AV;7D8k$<+d+-a)ZWUI@woKTgJlV9Yw{$+0diG3 zkf=aW1`gk6pmlK6Y+swu$0?ZstyE9bb-2jk-3yy)n4-bXtuZ4sfVCjI$`L!et>DY!W9FY?MR&EN` z5Kvk}k0h?o%N|z@fYu} zvJbj{d2K4_rW&7|#D|9ju3u!(9D`f{XkqhjdE)Ly&gk@)>)>iJ-)iy!oa2B^0}$f% zb&DTlu85i+oWT)>87d)UjE7+=A)gbr>N^Lpr4Q1X`r~~NWVMRw>aV#gb#-;CJB`32 z1#B-VfV&4wxY%Y4@cYerD9Og5JCEk|OMo5OrKJ;AJRvqQz-aRL3F2)Kz6N8DGaLc4 zf@vCBeE~udVvGt;6Omzp^DYDr;9LQagtx9q;=Vm7FonG}Ku+I!qZTGp7XV`LP+&U< zdaKMAD_3@dLD0R}s4M+C(ADJ5;N0IP?* zPC@%_BBm0G0kBlaY88cboJ3Bpjv>GQBF-u77eKe5;JDd-fr$xNJs5;kQ2fpg7I6zM z0io)$IjfyF4b~wt^LJa?91a5S_U07W}?0K|b*C3sy-Jpszw z+ZbSeI!|s$YW!Os2ytZ?B5Mb=xBwr`>osS$t@+a+ve3}@ab}ME4t^UX`~?a!L37Ta zL~nq*YQmidu>QL9mt}W6h>P_Qm%vi*Zdj&PGL$jThD+hT$b-8Q#IpdX9swfg`V+vb zuVWGd9VE>livg|)V8xffV}SfRC?;qO>-Y!_(o7{N%mAg%-h%F~SZ?~mk9;`Dml`2O z{aNW`1^#xc-+o;}HfaIvX$wq3fZXK`@L`U?d|F-pEd|!J1hA1umNU7CY8IQhjuY(> z$Vmv^bi){ic8qh-uXS2U8{*?B7*mL4o-qr|^=4qDVT%*kBnoEM4QSndMqDF{xjeg( zZ8egOF+r1(lM^a=#$sS~LM~2U7DNirBE1pa4NDJzviLA>etm;h7ofQcb{Lc~_ELJ32^FeMX{p}8EdI(kPu0}xBV zH`iNp1klldE<%w23^^VOA&5Zp4ymQQHnnyHw28xPK7&F+5@MBztYJA2@B1WlMeHUT zPmh3w4wVuD$DxpW7Lw-jAPICukia4)i7?|~->OWRgZ-OXDV;f=>~careprF(0f8lv z_4LdOnH6B|a)8D$W#b9C4)|71^jk0h1C_s3bT^dbDX@tD`X&lN2!t{s+pkTEi$Cz7 zqq>t3Y8FYrvruO*j4y_EkEFr35UL)mEI!p(qq!iQV780;ftBjqEv9cXDiymj~7|Yk%@(J715L>nPo2 zOazAVXR0D0^fs)$l#(&Iuh!Jq2tyInZ{Nz!z5nq^M{Rm~8p(`nANl+FJzdm;0zsqK z>h+uR=p)yEGA!m-SYn?P%n*!iSVzoZ@v2?`PrN2D*%2tlVyIpM_s1?N86N|75Jep# zIPkT&Zf{@MRd<-9HU|)m-Fz<^JfYsja)n~;D*!kPdv6a<`L?k!84!83TSSt&urk&I zK5gL&Z5ISF7|4x5cmsQ#5km|@%-)P(MlzwgWUs-afJv37qXxDK+He4RdU|7q7iHel zBDgJAW1Ti6AHhHy0OAc09-t5EJ|LB1WA*Z`-gDBhTp6WSdE2WS=sv0N>(l|#MgeDn zW;R^kx`>i`mD2(s#b7al)!%@Nm-xRIf2C&!@dknz3W9xdP~1@?G+29kPAnEC#RYh5 z05tl-QU;NI4crnWagLBjLut_p(vT~lAA;WFMgV8vj4k!Pr>qvA=%A-nj4%w)sR>n5 zIg0nVOrQ3Q0p;qWDZ|nP7Qtf(nZgxJ^Jn6m)c=Z9M(Lsb7?Nz+8c6 zi}aozf}sqGZS_SW_oYjz)zt~5hQ4W+Ynj0)kR0*`q;>+~+|_H>)_{T2#}yk@IU|e- zcu25AJOQG|u*#Vf!iq4O`j6``k>@&D>d2UYeVzQ2Ueh4$EdY81V6k^gnl@f64){X6 zOo3w{c0!Ox6hIppf<1lt@=^I;iWe_t6Aq!@9H1?Ln}UEpf&>91W*P>UO`*FVBrj&a zE1h12e;V)v56ag`GVYB)+X0PZ3wH2O-9WFYQD&T^xOgx9C5S~Eh&ICl^bgc1vkd4f zB7#Jx1-!G?AducrRtBGk9Ak`{HWj3%h&&3&he>cn1ye_lM0lH;F%6!OzgDs=AhM_k zR=HLX!0ob}H>o%R;T*U{AUrY%Xb>qGECs-+d}(K8VhTOjS($=F9YL3-+hc{E_I_ko zxbQd^_M-EHb5DWsH;k~UuxLmW2oorLbn|5-(Wgm@ouAd(J+lZe+3i-!*{BJIcU>2xS}E&4w( zLk0}L?Or+-*mU!j5bCb(?(1N*54kiE#12R#IfaF>v28GrAno=62fw8Rgrz^nEJ+20 zyT#A6(~{1MuYg`MgPDu3qz(-*^WRl6HfMbPQ^V|bPQq?ApeNIhr8(4t{EgCWzA8(| zarSnB9QXC#i1;L)48VpHB8dEy6ci{}y^$IY^qftwqJD-Q#rua)u^@gsaDQQ02!#g{ax~i9QuwI7S->kS8WbYIM|%_m{{Q_l zwnG(gTqLFJVF*An+XvpV1P%Yq>nZ?4Uzh2pTyXGgOh2A8fFlMbtn4SJd0+s z5Bdjw1OWmDLt&7VCO^=l`S|z<19}1WNnAh*wuBO4LCUuXz|S-y zg|u`6zuByOY~@R4LMd5hp-eBOkwF8I^A7WRpQm~zXq*if3l(?&#ne~fk~l0dX;8v| zb_Ha;!2dxcO9cYkLJH<$n`*K}lv>tDRmaf)lbs}GO??{QF1EuMduDn{6VKIAma)EE{2jwf7HWv27E}a4r^3*lXkJxYk5dq-^ z^78Q}^Al_9bKvr-JPf;N`2czkA`!Z0DzF^GClIWlm>CvRq%?!!5L()ETNVcv9`J>8 zOyZG0oe}XiyZ}VmgDJUXdBHQmZH38J}6%@YE`wRsP27g;v zA1x#NLdHwILcm#-U07q8xq@x`gfQ)cYvYqS8u45$pWj2Ct47t)TsZX)6(oE(g@bO2 z>M5bSP7VRB+>1h@%;guI=h%gx6GUM+IXMvk1Z0kJS053ZKL9K!1UiMF$)yPqr2fN6 z>?Uu(>;Iq=BqTpP%Ea`2z(fft)4}4%>HgObG0tHt3GpanRKFhfp$u>`+hKm1r^}b-m6n?fl{1_9^F!MmDx)lF8Bj+=3@GImMTZyii^z_HrJS zRk!VfkEXfSTr=l);NgCd}mQ7;kzbb#xJf8Yg4Z;435uRZ<_+TsRS;b7rwy(tCJ z9qjwgfZ7>KCi6Ex{$J3;#j5{L=z;Is_boKA%3wDfb^3x;GzRjFb1c$y&^r|eK8@xl zoDh2&05pU*=%k$a%$E>LY}gtovv0}T7X3pa`K7mmasRuO(I}FVkikM%fmiG1<~?e1 z=X#hSU#{O?x4DgXAr>o;bdB|We{Sa5c_Vc&i z3UFKyB^AK+r@!^ubucv9zW>R$Zjb|}wi&JM=XlgWUbt_V4U=@ERxg_5xmlZ?@RDj+ zBYmk9q2+xEagWl+=-*C%gkqj)(5PX`G4Zy?0*&Vd%nsJ9%1_!1Q1ZP6Ii!~j!j#n7 z+uI97g#49njwlth^Tdjscr|_v4cfZQ`wE+#m1PEo&Pb*O>Icr1ve6peG%vVz*L zZ;2T#XSk!RWnqi1p?;xjjj441K&v~L zd;aV4{v(681q)|A=e>HdAzx+*a){|Q+Otjft4~xk^KNkCyo6?4ES>QP*CrhB3X`Wr zKU#~>p!s&V(XgvtAadxR`Z;Iy#ruTl(Iwm$ z_boAjXPPNBUviGyC6c$AF!66=UQW0vrgRn2@;|GcX8OpRm7 zSophgSVQ6;_3Ns0Tg^prSKXj-dPp%FN3~f@IBt96R*9_O=cL!J*B+;Ar;e)HmLjWwk<#!bIJ8|uC4tPk>#&Pr(+)9 zIUUm--LZUoF7K6yK)Xvnho_jrhi6g&Zl{GA(0L0E36$?%RmZN}*2RSQ?If@9>|G`s zI(_yMuIh1aKv0iRB*fmgPMC zM|P4eExE6;OiouxQ_;kZH_hN1y00<`ET$JrpZxJu>YgSPcfG{uYEs93VnBJ7wYL5+ zOvPf4#zr>0O2Rv}JcDXQZrc3h9bYYm;a!|>?8^FWjDFxwGD)Pz7A61XrP@nGC$lqU>wenS* z>{(m<;SSfqR`;2%bF{kc!->k%vBQI`p&2);2Z3L3AaU*`jp~-Xxjx`m_y%*BuHX(e*z(>)4*1BGl>_l?T8DlBh6oMiVAy;?|;2_ubVQ z111NOCZVz`@D5EdHk*gXENY(emPoe-}K`pl~J#NXwTbfkD}wAuM_29H83s z1F8c>?D)KY1(nsm#>81)t&PWS&yQYk$TZ-DPh8`U158W&N1>v(u1P@tZy%paIqbic z8OVB`Wp8Y4oEso&;O%3FFYg~YvH!vlXF6Z%+UJ8W z>AwBI?ldNpFcj?rA8!8ayB`^C8By}7z2HTU=sGRn<^cJdBqp({7S(k9RMRp!jYhp0j9*V6!p1H7mvKABLJUx2t26I(l{lHyo z2}k+}lfy6wCt}%K{=AJapLTWc`i+?!`FHupQaCMM9`*j# zHoTMUy5L%|vx!TgaMv0OFc`3Nc`if5I3_N=JH=m1MP)W7C|2P6Hn2!62?%Va1!p~v zKPPPq*mYC9SQh0t5lkXc4CmNsqRlwoCxA6@oW}XqN1j_7Js^H( zL#f_SxXbsyX?32zx)~AT8(f_yH?}~lIEg}8HXK;adPrs2+0 z&wOG%w~C$n_Xk)H-}q`4G7Eiu$duQaP5f>5=upFWsAJ3Ea;ua1#ie5v@@vhn6ck;% zRkf+MgO)$qg?c~S_reuPb+oVmczJU;IiM<2AUzsOwf%f(`+rst2R!#Zuf8|2D(gQ? zlIIS{1?|^F59s-q`g~zmoVV?zeR~!8e7N?bZPUS%mx@?ScJ_P!UyKf`?Z24B^Ha2X zw378Gl}LyAE9VYK6NJSHnEljeg)SObBN2$8^+TV2pIs9>Hagb)sCGjbeKeKtZMnCd zR2$qld49Chj3^d`8vR+f+D&7vcEe5;t)XV}$4h?uS|uH;xH~u(n|Dyx7w0CZbu&gp znAA=zlyQhZ7yqs<=d?w6{PjRT6T5y;w(yY4+G8s6%^sae9raI+PoqE4D4*XaolP~F zz3=OK=E;Jq&Z5qaYK>)Jw|1$QWjvc0-vfLcKdXmh|FA+tfYi}>{uk66wT<-yW5rk| z9^7Oi`$3XsbizL^Nh~*`$NPfwFBNee)hk1_oWedQ*OF?x_b(p&VLOE^oLMm#3-sW5 zKt0ErUUOMQr$YY+6r9F*fjel0-n2UreB}xC-DY(fqL$& z@v`FE?wey8#U2n6Va=0QC($pZ;g1)a`N~$4JZ0g9^Q!q}lXrywX^?t7JI%(GJ~( zDYy^8II`D}UaD{phP!wy2SOv?K{Iu&_ub#Ya@^<9GUD7Q9>V8~njdhi4y31j^u;vS z-eStA&FmYxX+(|GJ1F9hpYci^18MmCSydtKo8WQl?}R!FOIQZeigUNKT$hzIA!IR(JR+{E+b7gxmCn}{*g1M) zSbGratThpo-?g4$ctV=IL6Q?4CgF6-g!poIY(TO+WVp|z-GU>_UwgzdA~*>H;SIIZ zZ2T^AqcU#c>)lte(b&o9A7i%PMX2mVYh7aO$ax6Ag{aRRo=m?nW#z%3w;W7f`WrZ# zFI0xj=5+Wyd`%;+jeg_m_5xpDtu&xwE`Zo>*n#fJHdh+Vr)pY$98vuH-yXHk45csy z$By%K*Jd~8^p=c2geNw??cUsd2pQDUajM5lt6%u!@mSrkd4_YnnHn228IOFIrpW;+ zZzrACza#0ic=7XHk!+k`ybL+y`n^Ll=yYy*U<&vz8FWWl|HP+KS`$^oElUMLCg)l; zabWdy;&wAjl-iuylNXS@)myAyL6#&<{TO(}kOF2MZ(3MtXm{`5wCtYzL4Bt&mC$l- zt@Idm+sacXIR0<25}9%6t+9ysbx#e;yG%y1VmGG8N5WR#C*5Gj0c7yf-q z-wi8?(zmU7breh8E@N48^{1_*tIINq5%1#^RvQj_R%iEMv$yDUi2Y*T z?y3ewY6vvRgtTK51Z|a9PgB$$zYnTgJ`9IMMOyZ4@S(RH`{1=Vf@$GcU78}swvKd9 zDf)BtDQ)T-pG|x|B}z`I&gWMbOL6xoXk)uD^VW~Zr;Uk!Ew?nAKCI!y-MX1|C8|5y zv$W{*jh#>S;zeRng3+1#4&9eyn3zTi8Ijz9w}*xN&Zpp8YWWuv0s;4f&Y#u`#@ecu zO2xhT9Xytv8F#T!-M_EZj6bcRV%#yIsKAo3Yz2$VOVhtipeo0}5ZeuRr z$|#Mb|jbnWUpL7fH1d&xfhK>|}_)%oQc2PTL{N%>4vw_Bv=BysKG5v85z zn3zjO?%;i^cWqB>#+zOnMyXjsnjRxn0U`#b!Ae>QOKPbV9XH6A7>zgtdp=x1zs1mPQ!;o|)aIjWQQV zLG|@L`>@N2)1)&*WTDV6e8ljR+IN$Ar$L+gDnohnJI+*C3T&@zk)cd~FJGhPc(+F3 zeWXbH^`m+J{3YD`3j(RR)l85ExVkQ$BA;~dVt=MFw^7ErI!@luhZV(QKNy~9jDsM0 zCAiAY>PH7vYSPbO-of32shy?+liGt<*zawKCQL{%qnPaKi^S$4-knG&IeL9+%1e*L ziDkVSdPvG#Tt`Q|LmIXA$~~`8Lk?kQ>43k?s?qk=p>BQskimiY5lo%)UUX%Ud4h`D@H!m={@?~?{Vk(V%JNmF2U42svz#1Mm0;Fr*AMt+UB2sJ>d*9QkW|eC|FV-gI6ZoJK(BDnVGd(O{4{IUnimKZ&wf{c;nA_X*tjsPb$fM< z+E%jkq4Pe&`M;ksHB4m1y@*UkJ>~CP(${+Khm`G{)Z;#{Jc;HK&uxQ3isvwa zT;6d8nF?mXP1iwl5lS0vI5io}VpOF7HT8aW(PueF!Xec%YJFJUFZYFp(+N|-0+9y! z<2_Ru+9EFfyK>M2!PZNq!#0?9y3%>xa7qGV7tH4t3EW$aRz;|qM&iKtWB=w zY4v`X_t>G`)(P7oBcMDt(%u|k3Ri7L^{8U8lY{Sf&W6fF95y~k#r3w9J@_#T<@9YR zOOULwIojH=T<0jE`h<0g~$t?a%_l|ro`OY^j zwHX4Y<~4Ql)#WDIe;p0|HV7mZaCDN3Nj7?7d+-(9O)x%?;f}Tzd^2IKvR+V?-oHkB zTImw%iv*6qubd4t^u;CN&HYSau+gxWT28ok!a9EM!1UJ*Za#gM;IFU6%nuLcZ@oBo zBQB2>_yNBSswcjgJLYd}8b@pX<}>7l5$Q^dAKL5juwN3EL1>RO|C^SaQ_hA`O0rJmR8yL%IK?$s(-?c5UNW024=MJHCt;ss$?>#wbf-TF**OIbzZYeS=s zR-~S_3*Twk9>gb3e|DWeaF3ARrH9|tFM>*yeT&c3qjXmozQXKKyk(5pkHy{6yJ{l^a93+6-G zXO9yPTHl$YB2Ks7EL>N~{w>SY>ukMlG8=GHDg?vv>~fkT2=L-yBLGk#T-uj<4zM%4 zs=QGKB(e{X=;rgiS?7O;gSrUW>lZkFHAg9Aj~e9F$4AvdBRuV{#e8I&}jq(HQ#14Ba(U{lxgu4bUYLbe$M4h7k`5{yS~K9oYZcTf_( zu|CDfgrf$R`N-vJ)`LE&de>k|!`SCOZ6O+G$LbX-+wq#;yNT@y+FzHYK8OJi{JE>0 z&5S*?`MzL60!KtF>Vsd-fsF}}w?1&%?@2NS90&B5b!8+41>_V8B~VI zdtkf)(vAD@9!QS?WQPNd|M_#V0QEdKi2(>BAkV;o4g~`5VA4&U&AamQD9}K((A57@ zo&!x2;zcVE%loq~mt8Ti9;gXJ0YoKBC-ywyMk!*X0$*gJHpd2jyw85Uhvn<=si+1b z>YF8FLHpGiMvF*r4-Js2GE*xbb9|KjOBI0@jz0Kf5b7_6jZIdV8 z9nJ}Td&X(Q^fGS3lVu`@t2GyuEQUCT1xvrykt7x~^}j8QD!EoT=<&;9{7v3!KZTco zf;zwHRlPb*?Roog@w6VB`sTk}qW9LU9zJlmz#iN`L2p<1)j#lN9b6-wkgF^R42j@0 zAnMk7P&Wn|=oE0|g*QO7aMM}}rWoQDjJWXs{3rYdXBpVyI=;Cw1(XPgVhibX1L`k$ zTg7~<7q(za&CU)1C6!t=(gW8b$zYH}k_bn=xZlX&E+u5Z=$!gC!++Baj@J@v`#CM^^~kA> z_0Pi{r?$Chob>;?sfCX_z0w!0|9NM1w;-}9_fe>b)1_^F7qXEvD{Z6`;ttHED-!t3 zu{;fe&Rcoz6FJjo^IaJW+@c@lrEh-8dQT_(X<0#k;>*|fUB%@2cLKz1U3Ygg0q*ub z-eB@77z|^%Vd?5IQhk!4n$EY~{OHxb>!x(wSO0>>TFwgF@%4*^&nx$nB8RL}wTE^& zafijy($jJu?P^~~&HV~|_w}jg?mdU`!a)Y}pa?J~8;=_ne(EElgJt-nPeM-O9@DN; z7%zR3cl5#|oUfDq2aYS#vI{=RLE%(x9;3zgBM)*F;XZ9I55UE2mAv@6^7&mJp{B)| z-e*k#UJX{(qo+i2DCpcMKoEY zFS{(Nb*p*^a0gY~c`WLNO(Io&4tskQ*q1W%Sg*xK zxA6$(k2L=BILDxOTwb2m>t+*T8ejR0E~!qSK3Xb*L8LTZ9khed!Jah?&Q6RCpTHN9 z{l_UKOa6!Dfs=!YK|Ee20cm9`Yl|ITUhrZ{lBdhG4d#tE4b+nc-O?u7?&nfiUBD}MVd$fj;CWNb?`BownVw)8VUmII_k zT_p~*7J}MsztUMd!enUd>CQFPclPCZ5PbG$s@>CP87BQvKQrCX@Q|_c#Q{rl`&YAV z!5&-LW0yoQ?z>Fykoo;an_%5_sX=EtA&axHy%q0fd_RAG^Sl!8>W}_)Xf>nWt(G=a z``(DWvm|B&(tZD0;*fzyOW*WGEp0AxeGFAVj&R_-)U^<$AKiE0NAR!7(BrqKogWDV4((duNm;}HHACxHG@K4{|`K?;MKf{R-ZE&`SCKW+j&wpO; zwCqpiOQ>~bJ-zbUcByl{zQ34UWirdkWqY1KL|tvI|84B**(b>)iwyC;Qsl`Kp4vjA zwStX_L7n64V>g$YGV=qrtzhne$z?oB$&&Oz*o&0na)L69L)247f}~TlGuJVZ)6AFR zW|G^>wBt;CM#eeECG734?FmEkKxDNHiv6jsczG+)i$a0Pz2p(Dfy5Fm4aoQD;Pl~yc zs9xD>jV}MLuVU$RV0VU_3T1n+>zX0OT3^vcg{6re@61()L7ja1eMhf*pw&ijy-_fqrbMI3vZsQ)PG!u=K?+}nD*S4y? zzpaa$6=h+ zS(MLAak9u!el??u%NltBYc09`;7bxB?nvq=f+ig+BtV^dUX?@ob|dIo*9Rv?TZ!6S zdBzcMlvV9g;N#h@<7*Acp1BgRX+wb*AwiEOtC|vozg!+2%wmvG)7^UuS53xP4gWE@ zpI@QXIa(ea!y8xH=B2WCFu(Z2?f6csX8nosG2bgq80%v{^1tnrvj?q+Ezq&UX|9|* zHF|u{@TR!$HZ+xdd8Fr`j_qt$40#s$#gpIbZP}N-1&7_^y&9F>nQzQ}#YKc~@K8Y- z)lWxOPHRh!QE}-WU)d8BZ>Gn22F4Q3M7{Nxh4!)@K|>?ika-ri+NPawLzZGDj+7Oe zu#e`kw+%7GRi0VD1ag+>e7g&;4iIJ*q-}1GY2DvAed+I{r*^@3=ki1w9;$9dmLsmT z;}Wq_%cWeNnw?pRPa|eQYrcPqP;4%py!er^Z6`c#ifbGv%%j!30i{z44VwXP`&U=m z#YB{|KC+%PNx*1Oz;uvSyXt*musia6aUR7sUgvr_>CV$-{=P~h#c(`S!gi4$=3CVo zt-$fx?bT5jDh1c;u1b1n-Q1AZ*7q+bP2%B2w;c8K1G_;$nZtZ9!bIy^>p{QG%NVH| zF}#%xl4cfM^fQAxRf|!I2pKv#`*XENA9#npmip(0!nRhvVFePrU9v1;e>P+dmyCqI zWft8!CFgOF*tOplM#ulEJ4ZFMD_e(m;Q7F}cJU%m%F z(hE!_Bt3s=Tij;-hL5(h<{jJz=n_<2K`%MLeydI6Qc&++s0GlqE$GJ$TCi$ z`oyCNCnvu1x~yLpClfqcyG?=1v2MD3hK=o5*eVHDErfae&78u4lHt(&{I|+(g-Bra z^bBVomI+4VCWT)bcptrf8@ocxzcV{%l~8UQw3Q%D{bKhP zew#58{wlEv;dPR4nKrATimI0MnkH4`kOp#SiGe|NhHDB>-sz+sFX>umT95}pM$m9H zvhd1yC6GddcjRm3Su7q->5}!ykv&oW=L=R?ea2@B1K}uSjjH!ji~N5`dkd&4+pcRA zMFAxRL`sm7R!~|(X*MAtjiiF4fJldQ2?%UZNr^4eAl=d^0*VSqH`3j8*6s7Y-}ip! z|NnEw8D~5WA8^;b@2lpTYpyjdhbSEABOYDH36Ro~rO45+h!55uzeh_LhM>QwCi! zAc&);ji4fXk5>?+ed2({=!_G_kAjtsAU`EqehN;_EB-y5WQynwH#hk*lc;ztew1D+ zTLk|Wn*{R`MOy-0buSK9&O@We-uPYbav$G_Zr*M9dTg(fedRUqD&n4*NhkK-V};V4 zo;FeGtSUD~hLBZmu2G>-ipBjdgk=BL0{mKSmY+3GJx3mgX55^-IE~yw)M!*nqZW%}vCYW5&&7$w z8MR&&VaLb%Q9Z^Cu#f!@Yx&~3_Z{IWJWJ}O?XUkDkO%X9McDS`S$=Gm8$cC!?j zQ4;kX>^nO96Gv-Io|!58YXj{WA0|bz9<;Mud^&o0av_zzpgu~eA>_*bc^#8u6J6VO zJgg7T&~yMngYO$%5PMxBc#^X#Z)qlD`A`SEV#DyOCLri{DE7t-p<6pC5N;3 zjp`fs^?e{R>iw#U?rV;#RGOA>^Cc-GzT(QPyOizxmgaNT`q3y;u`E06LCV$y&`X@L z&hOJ)oRM4MfRrzP)FQ>AyUhFzYwc3Y5ggVgQt=k$UInLv9HzshUh!kz^7uLACVANo z!z-J_ti`iRH>?XPqmyvx- z-DZbTy6fVF_nJ{LedHL;<@TP{6Mvr@W9G`aJ;E4Y#d1lHpr97J3!3Yi=|dv}+QS|= zaqS&5aJxlXBDiyS8>udl|4f6rRDjG>!ohe#0zdzZ3Nl-k+E z^>{}NnD&}e(e|04vO8I&#p!(Phwk}3?DLUA`xqs8ZAUx(yv6xV(b_HC(FXVMXC~R> z!prRrQT7HRXx~J3i*uVvzY|~d#;8AXr<0CprE8&d4`D&wWKO!9b+e(V)S=-8oX|zN zQR6`e+A%7Ao$IZ{W8S!L%WW5FF)%UT!D2rWbz+9_ZG0>3!Pi6q{HudL*Ebdp-F}#x zL>&{^=$Wa`{MwBP>5VF^ci|hsp|>WIC87&*{#lEiS?x;`#G+<{4UYB4g|xV#PP zUiT=(ToCg_BZ@}k5RNlQlAcM1?kh9}3X zgzQXQG%YJo)6>;d6FGcsx%Sb?eBEU&&)GxU^!_y`41c%gZIqq{TC0p+`>6eQGT9a6 zkezE*UwpoOeDZjxc>VR`q6o!Z z_RBHku6LscENmljBYWx>8#D{n1Az#ocHgk}o`R)ia)wjjbG#J^?@&$`y2fuzIEx19 z_LEIlYj1K;xNRRpXf;mlNMMpZms@*KU!4A6jGKD(VtC`}qR~=_(3yre8k&Y)Hy0#} z6@5foaw}FZ#k&)!9J;OHNkmFfy?*65d;MpguB_4{9?VrX{>1VJg&mY~!37R7Xs$(64Ax7d(!-qkCojWLqC=vgSUr2nqG7ftn~Y ze$Xp9Mh-xLV)@Y!5)Cc6Y&KtUOzjs&?bmKRlRXvOu;}>GF_~C6Q*2jtJ^pI~t7mF& zzVn~lcX%*?082cJ+hvcFh67?|mp%Em8&3Vv5q_f=NxXBGrG6U&F`B1ka5FPw4Z)HNg>?sJDv zFsx^J2~M~#4}(9hL3GT<&fOY*l(VWasH2u+e)(*;m_ntNLu&7?Oh*;RfjA~T-6_tN z(lpYjZE9{Gd2+7cDiTlGpRO8W;!orpR%WqlJ8s@}P{8F)tOj@PV1|fgq?{H`MQ@8eS(4YlBFCO@7IgJ z{JCy=tKgR#8vW`E8w5mkaFK*{-xOjZZSoIrmILGmBQj~F=PUX48~k(5-7J2wPrfbk z5D#NXPt+3xiKzmA3Z@Ko2lye5UbKWiKA6_)ox>MulP~! zCv!1LFayiH3|v_mxW3~>Q-ihPpz1%L6hM*f28i$zf zCDh28K+=G8q#IhBku-F@2CEZxxU9@BQL?9BQ!_5yE_*&uZ6&64-{@RK_9lz@V$L@F zUI(cZVcRq11$t53oLkJ*$-jPFF+ml`!(8F#FLb}VrNMsJ`R z8LBd(ZD_z1HiR6EP#+g?TT8;= zr4lZ5x#FlwK}Xm$=tw^q)ZTx4SM9(u4SZkZ3B%NTX}NjEueEew1J|@>uzc>}W}RRA zETz5urvc?h=ndLRWjgQPanw>MM>9Ho>xbmuZ?+xU+p!hS#=#yK+Hcb5WZUlV8huKn z`})L2^;Kn%`8xp#ksE5;dZ*M`{#aPr7uU@#)85jTQ`rNj^{T9JF#lQet#AsPJy>Q8>KWo{Id(Kb0N5tJB+KQ^XIE9M?L1^~dPvOAhT0lQ zpST>yf*d2j~8X@vTX_A6eO$sP9P<8}HMZOqRHnUG8t%keDh zbeMSd)r<9U_mdAf!)_FEr1XyMxD-~FWTvba@z~I^A~wRW2f*>nbsU9s#q=Ok2^UjG z06Lby%FA5Gl*@f-+mR1?Yah6{){9UjeZ!H2kK0!*y5&vn4b8?9fzMfPOCe0 zI;ms7UpU& z>_2@C)nM4w#dV51#i{NrvuB!dO7`Og@)`*AqI-&0fYO5q@PsJEl+Y-wHy&|Qf^SZW zsV-1+-7EmfXYD-@3w}M0lxJ4Y3G4N1GKDP7xrS90zce|nJ`p+7@TZKCv%@du8p(zXuhkQZfX8&(Gi9j{IoEmfSCCybQ!^AQ3*zVd0AfARYp&O>f50C>uBivgVY*i@Rs zwmhsrr(!Z8Z3KMlZz|7{{) zag%&Rkf9fSvcmOK-RV5z0id?jp`%YVa=`eN1eUEk2OIp6tHnv}e>D_uO z{p+#ooqrsjNA`wac)OS98u6Hk3Zw-|gv%Jlbj? zaO!ioC;Cj~?w|8og8_Y3RNTRMzL)#>Z)#|w#a%blr;j`)Kd!g?XCdK27zzan-iuf~ z+mXQun!nT%To**F#ctsCp1}e}Q^4&*8FPtKvcpgB!f$~}{Mk>@IbFKUe8-Ya7yjhy zL_l_9&p?F;xaucE?+Ha*VhVXtE<;r%ePswoO@8=G7-jpi>pM_Jz}xlMM)G(2aB^P> z-U{>~rgy>5Xx`s@Y%$MY#(DBMH}WfS2F3wTE!P{3PA{E-V-Xg`fpoT!O?ijZ>K&%rXRsjVFpYpu zxBR-^iOe+bvE*|w6PJ{QB98oak?ZiyCN94*bZsj_rBRW4Jll#ON;rsdcV;2o3AyLn zQuoi*99$a=4zC^9;y_s5W=OK|*u1y}bl@wpI6q9u+!TIQ4+|Xz$$+}-rch!;4W4Z6 zw2yl6dcJdvxbk=e)!E7*rv0c=o4yFf3;Un(;z#w1$W8tl+U=-ym7AV=ec~G819`EL zE2U`*q!?=FiSe2BXrnbcK)XUNn`efbA~n#cXv~mbvHhqX^U28sO|mD&nYiG%?VxRb@9w_t<%?aCEAE}=W>%Fg-pN_P%g(l?ay;#eU~h{+Tf6VZMy_XQ{@&+uBAKK526Iz3_YrF z;3d#j=lcB=uIRt$8M=XkEC(>M$-i_(rCFeY0Z5z%8m9PdEgB3`!3{0Ap$|Fo6hs{| z-AV|>#)u;VG#)Rv8wrC}(7L8Rx&W+&tfb(}^8Fh}FZJs(41c34L=_W8ehmE z-cisa4(WynwbCrT^bx-_z)Q*(x)s7lApL`iTTL~^W}p>1)Urc&Jp-=A{PnduXe17u zX*l{Obk(3aQ3!N_G=(i z3Vu;=qM>bc7U2Kl>>M%>*?hG9jiv$1ed-EdB|a4IN5Na7Y#tOBd!Qg|1sx1qA#hKfHYkY!XP#z_duKf!^k$FZ_{Y}B~kF#nj z-G3r=I2$Fz{*BZju*#kW-0J?{FA7utoW^#%^%o`L$goEXZx5pOUhjw*3!WqY?!RXfAGOfXsv zR^!0*djD|pomU1kb7x?E1^?Zq6ZFy7Q>ud!yieRWK8`Nl|5Alyu=)2FnKkvF%m&-y z&@w+Iezcrh?oOv;UPb?`UwHgoag8ck_Q~LsyLx#CNeSOTfY*(h7HSvqK3edfhFo6D z$NCb7_HR|OqQF?NZw-`9({9cGrh$DZ{IULLEnh|n;{Un_--pwG4zJ?XrhhzFaI%lL ze?BnJvKzN|vF-#I#*TW&iqA%@*@Lx&cP7e4sY3OS19r9fIb92jWYLlML{@h`(uE7I z=iF*?cUcVueMTrhs*2WVOH;LFhDp~{KkIOH2e4sdfq35h_1tX+PNwi_FE!KODmyDW z(W$uPn17AT6FW7%-^I^-#(yvRSX`(cx+mum=m7~JG-X6JyXC_-4?eVqeF!qk5{)Ql#PA~UX2Q*1=e`LWa7nJ zvMkA!5~4pGr-V+gttVu^%G5*G<=`cP$2#mF=H?F7g1`M*>LoUTBs5^u{Q&ky&}?g8{jejDT{=YHJkKK8{Wti;OZ(3G*XTFKYr_BmX&2od+zU7O2E z|H(4_#(41JB1x_1CJ_VsT!QE~y>#H>UNv5jc~fl*-{^q0{3IXwAcFZ%X=yKz~ z+lyK%+e1sTFhue4*837nvTq-Wb^t08jeEr2B1;x3seRqYZZ*wSAF8TMy?<%`1itftGk7)8npjNzE1$S2^mw; z1aF3kb6Z+@vPS1+K-Pt;OQnm%2FZ6m_fsNb65U0;66vcj-xfSWM!q}IPzK#oA8(|d zs{^WB>Y%B?KdL71`@|tdRCB5`KHV07k4HD``sTIg0huXf&b$S;T3 zVQ^XTaaWefl}NcBL;urpcA+$?fyr1bja649uyqqWA^obYiPjoj={mgsDxP(8(@bIc zEAM#7_L`Tn8pp!f^s(!wVcp5o6E^07It|!D)a2)vSr+yrS2n3Lwm?SHSH1PK6!KC% zB6941Q;F9iXf$&7pY0UMDKeGPN=L@1qszJex!GfEBjZ%Tx3HWKdm)!*mQ>~3Ft}fK zmADB+YM&@l1N3aO%GIn&1kYm`FI??OIGK~^VMk%U(qa=y3SJxwF1Q(Eh4y`Ts~yXOscxT zeQ5v2{VERNdGgwu>1=Vg@RhuZp8v*4d+K!2(CW;6O*7Z8yyR6kwXa}qv#Q7x(z`Pb z{KEY%ZZO^YUYiQZM9C6R`n);Q^QC|&Lv&fKi?;Oq?hxIf&D+vL0GK(Af6ei=M&xAz1%(K z{%!hB@BmTcb*XuNsApwPkO z8#pFFXIs=(C|@7aWGiqWA3=f{2hx_HSA$BWW_se3CRaI|*mitN-GA6dwdr5`AV5nH z-AkyUQ4kK{-6Gj{yH>yk+T1zTeqm@?Bm=HVG>`Apxo?vWiR4D81MWrIu|iuRU}581 zMmr4a+!3A^te6lLJ4<;oSUZ_bwuH(TZDoKr@QFgz(sRN5Vu^y0Pt=B-1QE;634s`2|>afE$_o;ejl{+r~c5jw!v+cIOZzb6zqz&o6IC~ zXpaAP>X!xjyfJ-GnRKk;5fltY)Z~5ow#W-jz~OmqYpVt1YwMdm5{dwwp}GOgGT6^bP1Ya_}4yYy`4R=<%HWw-(@^5GX>7#$eI&nV0%)2WiXGljCBid39HJ z_a^9P1631oaD%k&Baj@rFd^>?t*fAY4a4`84fqA#8M=aV#BcYxsvw3?*Oe2Pi&gV@ zpsP1DyHPNGYJ46NJhbI&Kn6=+gd~Hd#)vQ`)1>9OiY3@K@j(By&_GkO-Jc-ZM}8ro z5m1^GiGXkX~6aUecAbc zh;-yRVBQ_@6Fk@dSD?+x-Cl+LIizq_B8CkGf;NUSFker|IFCbXzdb^dZhpRk|Ax-y zp?IU&GXfzY{pVu1f3l*kR*F72vKgjg-E#Hp)5Q7& z($)|bRe-%%Se&+!i>1SLay`+m3wp7*6xoR~iO0oVFZ?0%kmvPFs|UN2Yu9X61ecc2 z`AS$Xp0bC*{Vx<$_|3Q+z>oq4fO(an|GEIgnK+QK=CdkI3KKI1AR%Z4uc&9Nn$-03DB1JGJJQ8l<(y`Osnoneg}w+VtJB)vJge zu!dX#_r|mMf89dD&|a6o))1uzwyiz5{PBk-yfWzo2=_@$8hc7trkM+z|bUu z?dlaMnRz5e@pMwt_RaA?%}q#eu9Z9b0__RgY#Ji5bARB}fs)jav1~95TPrHE5H97c zR4^;u@F4wDS)$T8pKS^4bo2p)UHjRbx~&7e1rT;sJtBNoi1Y^8qz0d||1&DzUa@sm zZ?V!H9fobc(KNn=LO~hO3^AykrI_gpAwpjLkv@__s-@ixpM7q5gLr2MxbvC2Btp%8RW+sqxZb;F@P!=(bL!v%bRzVd=VhXwy;Ca zO9a`Mii$h8o8!x5e~;8bZC5r#}$s;vFA3vcpa0)Idkc88pGf!#_ zWQ?9>DxoiXhkPWO!;f6nAZlXe!v+dc7V;S7p5(FY7IsMZ1lp;_=+5TPiawLS7td;; z7pi3^WW3LSxZ%R;2d>H>+GY^Ij{iz@(OD+Br^Yd3zF2e3E|EUn$zb8{c!*U9`_s$-oJyQ$l@*HVi7J=d=B2WE`gDQ?@`qkjNNDk- zzQ){!a3ZWK{L<0_Ht3-C3OXw!)pE*I2|)>9>K}h&N5su!erX?8C6uk?u`NUVb+EgD zE%;0yk_J-R`%ihC_t@At2?Kl&^p?t>wWEv4kjwz6U?0~xgCt6b#^vRV`2y9No7;fx zoT2y1%+?smpGq=wYeFRW1@acJZWa<(O=FE@x|b9>@FL_?9$c*MaFK=av_Bo8^H_2* zUgEjj;c`ShHx&hm8~?;AZb-C14S=7057tuo=BEUfg^*q1W&n*Ln|ENt0O{jBb5}-? zmY?s*7f^F&=lv^|p|n)KD2k}E7?}9#8`azy{DSwCM;TdkmoB;8;FPhv4SQ*blhqS6 zPD?69OO}*9HLRL<%ajb{n7{hfJ`as^KlqlK))%_&B-L)s`4qe1f%;hJm1lfe9Z(b? zB$}A!uk|uI_pqO>ui9|BLCST|t&uNGeV)%O|LQHFG(3%pe1N?g=tyE$+k400;ZsZ4A<*{`| zqJm&-p=L;TQ~AJ6wAy)vF(d_IFC+!|D4-30w)oaCL6C`YUa<<#vdu6r68S*#Mz`?c z&nJ&s17#rW3Gf^79KnI@8t|r0Vb#WyBKUZSHJ(jNWANTT1VH|@K0Y{m#~lVwhu?<^ z^h8=SheO|*cL5}u-%p4H?NQu)qhe}U=rAzW_UKU{lhaOD&Z_-(sNjk2R7DG5BVaEp zNOoRtP9D^IO&mN_?GTg#*C5r!AdijR&=B9c)q)Zh-^W!TVen==|2R&dUED1mv{)6gd*Ne^81LM?VOvr2lD?T z5$})R4#lh|`IP7-F2Kz*5YW$1UKG%Q@bl6gY~A4BAc2E`l%f9~viqma?T(mO7AbHc z)jkaE5-LxO!oN9w0xd=KrpABYQlwx7U^$i{9X$vI5pn+q-3xN_pwD;MO`Vfm3={UI z0?|_%s9PFNyRT|i5Sn#OU3nIE8Pj7}Cj%Ks2u^fSonJortUV~AmC1HWF#8nUF>!eB z*hdo7u%I&XpU5dg6iC;SIF1DNwVhU&iQ#^=99;eM{T&-pCIl)ZI5(gQvBV^F!{L=$G zJ#+2_LQ+=ePogB4@WB=c*9fzLqUV9kVqZQl?4*r+4iEpJOXiAAcVCtlOZoh-h!=3hIS$r=k+<5~wt_w|W&{^lkjul1sQs?jQy_3xnmIpgEy z!Te_br=?MWHQG?ALmD~Ce3*Q2QnkHrJOa6KQFGHho}PaN-N_lHj055)w}F}K5|L%> zVIO&?xhaf^2~ig>JR&(7&`Z(KbJK-Q2r_=*-{hYvBT7Mh?__LXwW@eU0Ta<%tN5q$ z^?J~IQ;9`B-#r6qJAiZ2r~N`yDA3x75j>x$(Q+;9izGbt9BkHk2u$JT*=}^+ zR+b$5Q|j}U#kqS3>z`CvH6m!mg?Jgxu=SIfG+xthBm^|?Ugm``!#-yWhZ{n#xC7%P zAcwdvbPZEnA-i>H`XfGIlKhPY4>RS5dv{z-Kj*nI7S_LhfYvhbl6X4EwNyOj3o_Xp z5EyQJ{H^vGNq{0pBb5K(IdA(02a3h_=(16IJruWK=;Klgj^f8!4N7x58Tc}2?S?E!gDO4Ja|jClU$b{cg={lW>uP&^9Tb7* zf!U-KxJz{=G9`UgBjI)>Ei!&Hb`Z*Cs(L{Hr=VZ-8P~m2pvfcUf`R#Bvt65> zjiFs+97W?BvrqRvx#Ol8oj_)R9|xNuhQg?aE&mTYbT3v)7SXgZ(X&MpQS;$dS674L z%ihtk2}lDL(r_f-1l~%J=mNhMUb|tTP#Zb$Apyr#`EtU{f8yYnS=5LCLD2ge<4oHq zej1kx?|W{q2c6<*r?ExwZavw!#=tE3!|>0uasf5H?;4;BgIBAnsYQGK4f}t8d<-^0 zAPs8;mltNza3qNa23ODn82VZBI!?=nwibe~bxa=i-x-C3s9$fdx6xfvqfR#u1cFGJ zjwN$OgbdBL@vlz+$5#mNDQ`Urna(H$yMR5gBjg3I%h15d_A{dJ0}_}+tvMLYOmcbt z=eq_)`DS#mMf5r}wsve?k0R^kfl7;uBZpgNmn+t-RDg{Mr)42j%RLsxK%0TKfD2?i zu4~4{{L~M{0nS)hsYCIa{%t4$d6IGg4!7_@WrE{x}wxV;uX1!_lK`-gR^pYg*GEz!L?;OAKI%96@T^*m8S#l<2oD> zuVw?%OMOivoUe_zNqF|@HkwvnUoy`N98tP@ZgJp5P-HwCLLUYJ(y{1^uPkRuL&gD%NQM?B!6iXuNU18^|pxXUz;X1-)=s`BjbR|L5 zD#Qs0%mCmACBc?zkS+FuSCrY8rcT?Amj?Q6TZ!8&@x(fcmBwe2c3@XJ6a2 zI%`VV5GxgEq7P)}?l$k4C;ONBZKhZkT~xB%C}QXhhyAQK3D9~BLBHzs9({pBeH$f< zG67yNM0E!DKSvJ;++a?60l#EAn6*@oE-L)itarJP=w&~ziX$mOT}3YVTK9lw?9zF& z9-%a&wS|V&)-T*AJWf%*THHkWa+!vWUmvIYKbx=;cXgZbe#_~eLa62GDr5eOT@vJ1 zlT)cs#Utu@KwZpwL-1f8%TP@h>qVSEnli;>A_Kad1L&b)xAEjb$wgo5CpbsMbMlWy z{yjUQ*M4lQp-Jx=%Lu!0tbP5XQW{R1feXHESy2=+xT=9Zf&8oKUX#IVx1AmxJ=DCid_;~2`DY+Th5z&v z8#}p71kJdi)JJM)-Pqs%og;eCEl%!<>2-RAtS_fNC?fjL!t`e~+m%Gs+$k#OwxxUwbqE zvIF-z`KY)@VDBU;BD#%8O z;mWe~B}-t4zxDxu^Muz7FO8I+h}S;#OGmRGQ_7NOP6$DRLuD%z3t z#&8={flZKkT|`Qn57SA94;GDV)|DT1Rs0_~u7X8|M-OZLkNhObFTWmdt79FYd-YYX zA1Uh>nIa|HxG^qsatH7x(=iwQft+Iv`!Q{r=a{wQe1%? z!ym#w>I=g(jOvofu_bXOGDyN#xEJq&Hco+pCs`BkGmidIFXlR0yQY62nWc>#EYMI) zj8n5h^a043w;!t-8tvbeso>ogD$^i5m&Becx zHLajTh?!gu&7!GN_I!4_pbX)j08hU|scnLYPXo-mA^bx6~<=Eev{rN~LPsKC6^G*pbH@}PWM z9PF_9$L;gWg`i{kB>L-dTjOu^6fN_@CAyzV5Mar_si8O=kt%vRi;})`p(v{1B1E<8 z(|uw|1d)yNYsYM^@lo2usSM7J%dg*t(XRT-5YgccJG>-gFH2HoNGXgH!U?RQVTp(xe=dN^fm?V<8Cd~9MMP=Ako>z(UZ%9OU6mSJSej|Q{1JcMeWuOKZ& z-(Lj>qXt*WPQJJ%F~S@VIZ_AA61ZhoAG*&tElrQxnfBgO`FmI=q$e ztz6?%z^^!j_)<(SwGb6)_{PQt2WwA~4izDmJbsv|ZNqCXY#*aK?h-J;&R~7l%)0CV zBgpye3lG7O&qhHRTC3mdW=yZ~O^Lo86MrS1pKr9S+4B{5kDp$6t65+1+6D6^^YBDg zog!?EoUxn#Rh;no7kS+L_r=L9P^?^jQNNtJZ(-7H=D$SrRw%{}9H8b;VjE0R#-c2IUv~j`7D{K`Fr$D@NAvPN<7tBu|&l))GWs0$?CnUy4{KO0~j|R8wn>=5rFH}LL4p#@){%AmQ2dqy^zifob38_dFEG5l}3~RkP9q8I` zj<)@H{Z!}d8^;x#+^@c|4e1{;(Pg$Pg8|evvoh+{Qyu5`lzCkMl9or(~|6{)P^>C;#4NjQ_D4f7K@`;H0inZV$}>Z^mUR1mr6)0 zCZ&Y1MS@x{3-La>v|3lMVut$Rm%g^QD~f&{pSJXn{iNFdp(x$@N_OsDVQ?t;^1c+h zA0PVMv-$wi#*NDcZ9*s;!QNl(MfZ$4AE0~`MVbfeJ$+x4J?sOohgYEw$-J!NSn{LL z_4{*yKQWmnRqL!PM%B8D&P6{QF2s8-UTj#-PWoCu7OT#XBG)s+cp@G6;vjIAaet{n zz1rlpP3G2KtHGX~q72-uq^{4{SkiP=pGZ4F#=)?AqJgaG)Mnzw+gz6#=EP)oB0RX* zkHuDte^M^)XmM#@UOz3)SS2R3CzWQJ{6rNGn86d*jW|^?X%o4rMSE8jv34;=W^up0 zjyO{4Ogl4RDPrAy$CEG1o{uu1aa2hpg|r(B<}oSOWhtDbbKhajU;F5NNEX<-iiK6N zDiLVB*kGn5!N>mV=g$D>xCUBI;p6vlj&d}A!<54B3SWaAG{X7?Zk4DW4Ba77EStF)t}og8MCR$8p=V)eIu z%e+!JQ{&i|f7WAD)bv=yttW3jtHbaKa?{AYwky<(FJ-@t`L1%7t0c)+<`QnBQQ7@j zb&N*5Gal?dQXnZUe0-a$~@BY-?pCG4}6`2lu2sPw^lE zs;0MCi}Ul1zkXfz6sO0=C7M=J+TPxV=fj`0!onVfmxz}fG?{~kp?oXpLJ<&?pd!T+ zPbI!`<;vFb(Cb*CI*;8p(0Rg3)|-hX?5}@{n9+ctDJm^Jm)g?~PJ6Fn3HBo_nmE?)G5R(z~ivI+~MgrCjcWg~Cu=^?&;{d!UhuYf=h*d4_j zmkT^m_>dH!RC_XaK0W!Iypg5@w#vru2g|&I>fICjsZk5um>Xua*0dV#yc6djTO@l* zl4Rho_HQkK!`sDd-9LR*oQkOCbDTi<-ngFhiUYHmRTW+_BI0~z(29D`{8NJ&s_em` z@fRJ|zT!S6+2YKtCSN{)0QO^=Wih?GC79PapJTLGF;uxz909q#%pVsOEFRx_&o`*> z!g%rb_~FynZ+?k&d(ha3^)=ZU>f{HGcg!bhiktqlZER52`*rrPyTq}WpF#h+dbR5_ zM;Y@|oz`IVv+ov2z<)$^@IfjOYJOTpo3U$9w+0X-VX=&*i z3EroOws``1>?4O_E|>Vy_5u38At zej2(`=y13vuQc#H^zwtW& zyF|NR0d>EXCCzqG;9GxRYc)$}v8V4{(;Y86JptF_i0}6`a4pr=g)VuKWHgk?)|A`o zswb4%5<{PqnoXyrhxDOL`cpdUgPXZ4Iy_zi`c3f`IS)Ro@aj33R}-0RE9{HZ_^VO??B7TzED zX8HI1)@n}WP7*CZiN>G30&|L|J)Bc!+ju?hIMk;7x)$CjiJg_Ny+{ffNx{5<>Z`RtcKF6QOuGmzl% zSaj18Q1ZNp6@vW>7(>K66DDD9E~mv?o9O!&&YcyybEngWO)kO=b+|Q;O&8T}seQL6 zUQ{Mg}n|>$`XISFdzPoj=Ind;BR%I&lh3iz6 zwTn;Sc!Qmdv$$P#jgKC@OP8LbyaXn`uU=k6$CHy!^yG~#)T(5MT%!>m9?@>Hvtz4I ztfHm(am?HQn7#bY1rp;4oYl2Gy$IpUHp;CV$_@RCRl8O}RRcapIK%P%wl>z!)fZ~` z&ttVjl@bg%5cr6@`@+5^>U}~TEqCMEVOyQMLUyODw_4I#ws9*=5BO@p}RVi?MPuJQJIjH(^y4&&y+ zL*$KFR#DNX?@4qUjz1q{S)lH6sXVL;*FGwSFS3;UD!3G{5G7p02=cOph; z#rkP#U5K9P4v4IC zIX)G$edw!50Z*GV^M3B+1n=}nWO^ba$*ZB^Ldu^9`Zr{>$DVhwFtXd`?3FRFGL(Fl z$asU$?A zp4;yOA>UyNgiE1O>Zrs?-i)%Dj+>X5F~45X(f*iDRePSdw<5=t;}45E{Zb_pA#ShF zl_-Y%(8`Pk)6r__Zt1{1*K6!7c#~3onOoS?5B|`_sIw=Hc~^dxpt%8YSi;2^b-!!k z%+lLinlu(KqP{r~-) z$WWihk&AvRSg*0whEI*SjkruQb#(Z~+IkOc7JEa$Dg&* zQ-l&camx(r5|2h@NxH7WmA_(O#z;StWX7;7mJ95=WC@piX}juQTIuD)e9x2MKd<+r zFMQia*b40TI!I#F(}nM;bI{16E=UUeKRrn;7Tu;y^yznq>vW67H9_vf3}#kwYzwBz zOM=4hzO0HN?}qcQ%V-I1qwKNYtJXdm4Xio$$!mgQy}lTqvFO|L&qd*vVd&6&!e`$%r9v0W>8y)~HLq!+dY(!QPc!bN zIXIiu{`}8ReID0~8H!4${S<_4!MyYE^D#|SN<&b%kCK1p^vYO|>JQHCqb{6Qohr_& ziNxmoRWB~t(AJh4SL+9&QPzbFWL}rN!GLHNkIUU;2KeM}Dd=7fJoYay0h%x#~@@G`jx1hbR2 zX&$%EU;%(3q=8!(R4l+~Ntr*Mi`?LMq=!9heBzc=?XtTS1)oQ5MuUpP zu!!?L^EtNVI!2h}zwfG}NN#0{t1pzB-URU66slMO0chLL#}2OR2i)DW(+-RraEIEm zt$jL5RbqOH$>4~^OW>&UsK1^Ni=KV|*sQO`@=5kj()Iw{SFjVG|6w7OCWB8qNXz-- z8G6Ss8diV}vYz1U^I{-sQYA8;FMp7k(hyo9!!lkt*dF>pKDO63xO?J6;^sP#1U(!0 zMRR+aeJ9zSllDiZH&UQGPt57-OA4EC2SO*X+CM%^H0TJq$WG{D6y(3z_p6Fqn(%;LtjQ95 z9#`h-kD6e|{KxARnYUF}`mm)AXqddT83#+PBC@BF9^dHh9p(HxX#A*bXn_p)>s@|+ z*L>)Q?CeJH#Y7_Iw(sA*-Syjbho_NI-}*k^mU=o4*;&MVYdRV~DHQdXedO5@2cX$# z*8>+Ip%^&!89~W$>DkuD%CGC;73-9B?oL#Q>-W>D&KTtt~Bh!+y59BSU zkAB^Xh3aY6wPSh3C%Kl_Ztw8iG9wPhXjEEZlk1hf_)Vf=vt<+k$K2MRLBcVD@z5yZ zoeh5|#q-?TB&l)67dR+vD|P6WAExy;ic0b`-jRf9Q~JU6Q5#*`?>hG9q;1QbeIN~W zf>6Hx;3Iwk-Iu)bqql^I(LxeR9P^F5x8jf^0=WmEWK0^Jf;(euZ2YN8l#-J2ol%2# z65@p$1jq$CX9!39fCMe_0OZ1x+AO(J7k*^j&)7%9!;r^)q-9a2p7Z`a4z%iab#*lc z(RY%U@joFGn91Toiw-P65-O8VtgH|t@8H)qFn5L07}TNZFqAK>roP^5e0@jF%?Oos zbId=+<^Lk=J)ol6nr-1$3?xB zIZIYh5G3ayNDd-7z1p1f-FxnP_aFZl4u?Yb?%jK>RaJA=tSYR`=dXrwq38~&dxnLs zF}G)>X>2bIl7w=1s>kxuiG(K`dcUD7P0t}q{rzvF)T+}!4` zjD5W(RLv34?3NVlIRaI$5yIjXy5^|8O8LnREDRNn=Q2JgEG!IO>^tQ76;|wE0{Yt8 znlIch1o;B7FP`C?hY`IvD=RB=<8@+x!v>nD^Tfo&@`=0`0MDPm1_Y?XjNNBnVwoK- zXBK**0h`0XQRGT60uDC-YrrIX0}G3`FU|9d zi^ed69Ps1X#)f}rC?2yNWQQkbW&+9UK7h4hz9Wh5oc;Os+Fwetth2eH`GwU*`h@S! zw1nDi<&3f&Ze#E8&oZJ6>h~maxl;^7QNDqbmxh1b9=~^#C@#sQ-{iL$O6nAY@s1D4 z`19RwO|WdHQf9t6fGj#TwlQXqfU(VIY@UbBIW=me_-U@jT-fE`?3`9fJX7Lj=&v7b zvM@Abqy&MN*{{PecNh8ycO{XKr zhd+jvmhH0PP#S>DhzFdcU1l8^7k7!-4(OE0xj9?_Qs2Kn1ONv>N=}XdQvQI{ByDXu zLAPEno7D1~RYF1n6z<|I0VS5XGW2bu>PQx`bK zs`aP2_Pg^7TkKYHZp7}2uFB273t&V2C2O8=236qs%Z?xKW($T!z=Imh>{*ns+wQqU z(j(o|&ollsHd*UYdM5kKdZwvpJrV{~mF9OE47bMTFJBDzc4R+4Xm9yoOi^Ig=b5#w ze72F(Yoy&cudC~4YUn)6{@lJ@VoT=OQN2NFizgsr@WwL+MblV&@%1z;!sXo zOrJVB0@MOFW5TW;9>xO&hM+H){7KU~y*{zLjC{wA$CAJ?jeBlfsII9gw4D?uym}`j zmLH}GBO{yPXIvgzPmzd@6p83wzI?g1wRJAF^B3F3u!bl!tT}uB{CT)^}yp6WC9#;x= z?^t>8jCh<3sjuMla`wmGF-Rds@G2NaYZ?(^-3wN87G~44T^o04JRIlit?Ww7ZuCN$D-`tOOt&!`Z%ER`m%Ck@Th_v2&F_tc7 zSsD$z$zNoPJvZbI(B>Q%H(at@R3j%T&z9xX$dU0JkasOw10iM0#1!IsdNh861dAB< znnw>_7SlmcAo=Yi%*)QfbZEO=gc}|3@EhF}HGLrb9L>ml{fl2)(W*%WYb&@}-wLQxD4IFPLwwh`Ux2F0Pp~}0mRu&&Qm@cvw8yMEZEU3!#q}IVZ2+oB# z#d$-Y@{7za)Z)M&r1>$t$$H~UQf+gwk{@?iJ-3y+^Zw4(;$%qFKq%NE{-N+@@N&4@ zx`A`i5o<|;1o-S)*9Y2(;c3VWm4b5d6GUxWc~MO-KG*@P)itYzJeH1Cv6i6~GoH)K z!(M*5HN9ab@L9@UWs}jSo0`ht=O->BF##O}lYrva=LT=d$8gKCaxCMI#l5WOk+(Ne zl87!j1trdbw`06lBryMd)ma{=yHL&rogT;_ky6td+V3{nJn?Y}kNCo=2($kgMJ-Qd#E znY;I^;&<0(dq?!ESNXky*eW#}DBabVt&lMq2iv}rJDpi@w#)LILQ zdv^$?ge6{&(BZC}M9L>0WG2trH8LMX0gHy(swOc`CQ<5aiq#Ts7PuQ3C4M!)RVj|42IsMuJ< z@`lc%aLM2G&X;H8QkCy-7u}#>OS48Ev11uN>xU6F7k-X=pC$F16!1Ph8>A!M2X}Wg zcjqi&W5{l?F*6}ArSCwA_ElXi_w9!*Q3@(o+4W{DDY}5Fe86E#56KJZpU*d)1aH_k zyRVmABcq8P5QD%4s$t4Hbeo3(&%vA!SNW7LgC&6PWs2oux{rAQ3P1rNkRdR8rX8R_ zPEI4F1b`v~DA3(4?&rcU%UX}O8Q0w~4a zAc|UOk_XE>S(|flr3xPm@LNbeA}2RpXp8T?@7+L58@TflMO4^>QeGS6&d-F)7$W2>Ve%m;1wgR!2oJ&-Oh&bi0_FpSN3}1?K})A@uj~1K#DADAOW; zFWNj+)XTuw7zYV#Dk|>jrzV>2Lk*@8G#CM&9)z%a7bK*m&qqc^^3xB79UbmFOd;O@+$TbRmzD7)B_|7z8N5(*gFvIJOUVSU*#i4WU7do*v;(+#$%hXw zLIVgwpJvbev4H*?1YCSlhYVngLp*YSmN zLdYM(MBg8z%7S+D9M|}FZ>7vqOz4_lp%MPl+Oktbx@jZkc}j7E;Nd|YdH;%VQw;kT zWvt`yTZi)FPPyt^?2SbSrKTA~^U3HTs@nLF5h6))IvrH<)Xh@8%>o)mE0&t(s; zzw*UkC*j?l84DpA3>jDX$my2LAm}s~a$EF}(BVc!uO^!KX-LC$FNR`^K~ivZr{z?5 z9=A}Ftcn584^;s_DSSNlzu6XB4qwLEzd{eZXg^V^U(O-%-0%CQP#-J~6lvdn-s9dn zU_th_y2KOJKCAl?ez6CwIQ<$(+hZ2yhlk%~Q_|Pt1Xt4Jb{9V0CKwtpIVoNP}J4(#3 zvD<)hej#0DpQxa0hh{vgSTaDL(}Z6E>BuohOK-PKL8ee}QFe8H^otqT55nTj0z-37 zH8=MAuWk#b!=UAI=N)o6v{1>aFH;f4b%xoC%Jkb)eT4*+-Q$$h!!DoFG&c&pn%(7# zoqVgSg`I<~B_J@0T$T3)VgaahdcnsG^bmxJmkHpm=Uwb9@=*B>me%%Tp|r`8Ay5l> zs+ZLmvHOjIlmnd)lgw*izESPYA0B{=!v?H137$m36hRDj-tlLGg&U(|qX(he9&|98 zYz%G$Bpu7FIGdYU`u|{L-5mfNfR~e#sqfsq3y2O95|9EnG%!F}Sy?G?EFBVm{q)Iq zgXNpgz@vTxb5E!0m?Khr z6@{FQsF_K>Z(|?Hl@LSnP1DKkTRc>6MqjOnV#3nDXn)Wy)!jD=%!L1ia|MyTz28l~ z*r}2w0}mO}S@gH|Cu1ibhbj#=3&?*=WV6%1X@qVE8B#vgr)e1ywg3FkQ^bJN{>MiW za5|tRDo=T>I^!`Cy|RBeDZcaV@GQ8KW(05=KjGK9S<*D)KhOOIqjtAc09K~wcLW_$ zTQ3Ra{P2W7C9v?8DsDn)Lzib8a6#~dxpQJo#>oN*%|j4|eI4T8i?5u|PVOr*fY8T# zZIp=)3p6Ln*KLvL;{vJEhDUB_FeEnGPDx(lZ@gLbSPowf?Qg7b8g)5Wtm)>jD=%?T z8kBm4$zWOO7iz_duUB_iRX_mA_Jlo7%V>2^CiG*wFvZ){cSK;_aGCBifo*zT)iM66 zo7Fg3qt!~Y^fD++jT-QNzI!5}uT23dOcT?w$P{Tg>`NooL-u(>Kz4hH_SMoAj-I> zbng@>>kEYbaP1=#R;@B;{VYCTrq|nTiYS#z}>}a^6j!@{@9u0)arHfR)x8-nOiyne^z5t zVHZge>|T!l)z+F)Aj4=i?C%uz3b;YWr{S=>AO)Nq<7lD?Tqa@b7t&wdHSOv~tPjTH zaG`u0%u7zVOp15PWPMC`n^Q@&4PA%pbHq9U9+B1YP+fhn&7oiaBs{&znL*c!km}D} zIkd|;8_Y!m0RaIpaD@*aJp|A?Wxcc9-e@q=c@d(9zo58d_C}+Iu^QD)EUW`1@8>hq zAEeS@^A}owu}?TjEk|-ZF_nX05Lm0ElQ7vl3sV`qBrV|k`?o!A={uRY?#jpL{$-Ko zn;UXXBrh>}ksm%|_M~Y7O*PWasGK&EMJI9@Q%L&StVS05Qaf3<-<6%;9}dXjh1$Zt zrZ@HHaMqHu1#)x(^lfW09>KyS77a( zK&T|Jc&_8%HSlGW>3@sf^O!d#CW8>^FcAqC*{5QPejWw#g%uVRav zO>p2cVK(1(NFhPNkO{AI`1XsTmy7hsLqpP~h)M62xJ0J5XTI5dW|1qG+nD_+OqND& zx+<7k?kgnanOZUL%?)JOTQT-@C#n*Wcf}tu&s#n}Zz?GLYMT@eQ+z{@`yMJaW^|E3 z)=Qn}iNVf<4W~<6T?1?T;C8lL866}}B~nyPWo6M~3McUKvpD*e%JS0wv^tU(kJQH` zdC^ufldYoL3%tk8=rnHX{QrAk56?OhKIb=Fa8aCMEKJJ3{GIj;^-ndCgLFU?iS-qJh4~~pKk90_fO099ctaNj= zKVEC6zm&O)O<1SJ@cPR+1M$~{uOui$yk`N5xN zti{I+Ml3D!31Yn}hi2v&4crOWUuUaB!36n5j5Ru1C)2U@1pzYf1=u6ojeO>*)|YB} znU0Omcy^{&O%cf?B#%ej*1}%~>_u?`jgyrq@Mgbf$9+|yC6<;+dnwV~6s z>A^i*nZR%WjY2qY6KswesWPzgyg zJgU6K&?NNNo*=evM*`wR@=N4vGp4EP6$-2rh?J6DPc0k5oSh6SAq_%mR;T3dHu$j` z*O|#yTAeP4k6CWAOcX_?8ih>$6|kR&P(51#_Yp#C9WEoGq@*M)E6-SsusGmf5k)}h zgJHpZ6)jrUI4KYSO^{Arp(hAo!NJDqYDC)gh@a6vuo?^at z2jKh!bAPik_R&z~i!)vE8E5gChL~jMeW?Bmqyt;=fH>0Jo|R5i&zkXxVg4}wzpyK= zENfR%mI69G`Aj*v?qR%`--I8PtfmZ!j7=;f_Sov=)4>3J3w@n|ChZ`R=a3bN;$R&TfC>3=^6A(U_yMle2%q1z0d(B{xiB4?8u?@8+QC zTiDEgJLE#v_g|OCgA{GWz5gKUle+@H@tO*Gktmu~ceRvKJDI{b%wIh@G^rqKO#jAY z!2QkVvUh0xY7;{RjHs>m1*%OYn6Ii5*Hs0KS~G*b@r0 zar1m*i>qsL;a!@@i&X+4&N|A>bfb@tc}}yBt~ExlE?jzLCJF>^Jn2OfSq6Pyzf0VzR5wR|)RcSwn(7}lrxj6>YHI|ix|dL#()_UA!UXKA_U z&I1*0;nNWfky?)*q~Bm`dA<6}pmtD_kk(@8O}XTT@!a>fbAv^uv8m_pU8E&~q{;(t zTE-CK7jOwTVH!aw5S(G?wn#JWOrgAML4J;yGNh!`A%}XO6yzBDHf#olhNm7pcmPCu zuMkI<@QYWkf=f!A{<#{vcIngK9(4CS&7v`Vu}G(@wFyvidGaUK6$Y)<RS%kpF$cQTs{ROJdTOZ#^;j9-W@EoweYwR=< zyb-SzT9gja*MlP*nLE^QrtdvMxDdu&7OW$D4tK0_km2`ACrgl0^u^P)MUvA0_cebj zp|ja|uxFIW?CtH5w-z8Ff~*CmThwdMw{`lSzJBTtvaX(WPku53P?$i<=N<^4e*7S7X=#B>nz}ly++BDD=qUY9;heK2MUrWM z6B(e4vUPHrdAiH>U$P~6-<&vQxRI|(0%SlG+`D%VN-Sr7PW{>3_U4G8Y7`DG;FL^)R7I#ad#6mUMrvOF=1i~C<-d$p5B_XMZ ztAWr_M{YDTD+`yJI$5wkJ2NvlS;%Dynp#0AYke5S?dX&gBA9&)|GT?;x1Rz=|01QP zvztRhLsK9UbzPrAMikiYZ&?Kd1*Jiu<`nnlp(t;_UCX}fLPFYUH3vugtFGHC)GOn4 z#6gCzqyblWOg`Unu5w-mJr^{-Y8e_UG?s?CtT@&5>hmzF*!5UdM<+ay&!%B~oYrcn z*!&N#235I5COtfIZEbD%*6;^rMcdocF8Ah8EG;iX3a-#;QB6Zr6H-4gnHXpxM5TJ+ zLSRC|6=u8Q;$lvxg-7tNGw076L%*%0CP?o75BUCdQ0xMIDk-EUfB%kwe}ljg(j&+m zWMFyLr&}eowG(5*Ai3!eGF?#N!iT=aVw+{JfwEacTb<2JPn{K-hTTL8Y)!sW?(FSN zEf1IR`y6>j@GNexjE1>w%=Ye{UxenhAnLUEO>2^7QXUVFVM&9Wf?~RC+`AEmPjk8d zF@r8uctXxgf7#h_U1rzn`Pr|lPft%D9T&&+Ls0#L)>#z4{ZCwABan`{#zzOcJDdIb zb}J(Sb`_wf3M8PQ2Z3hEG9+r@2~fgFh(CY+0L04Et9foW-SXv*^D7Qr6e?XR!pQ3Q zXRIQmM*VGSci${|NlQ2O^1youj7?(S;Lb-SxL-YH#bVx#ZVq+Kn zBsr5%UAgiM#KGUbMHI;={r~EVKNsKH^8#fl$n>GDE*?BoxP1u~mDpH*`qZh7-Gb6m z$V>;xFMP0*N1i;~H9uK%n_am(&iL^s&^#-fvWhq_QCbcwiXEOo!553}F@E3ny7zKS z_pHRPj^roq4uJK9#;V=?Gcp*nuYlH7HT(+CyD$0sUJKo0PrQoC3JXu6veP(j-|i%> zfoIj`d9?crg_4t#>o8Vj!bU{MpuIdjHHNpB2K}d|jEc>=(qubVy(FzF1kmO%=lX4C zW{H&{DGlTCKrN^;Qm&GqJ}e~99`d-pyxei*Cuf)lHE zotvAKTF9Avm7=5z)|`%mgD79Wt_6ynVM6(Jx-%sos1Mu3xuEV-54rBz^ z3rR>wNUenE>C^fOv39?I%8t}{l&LMAQa=(Uf@W)=*K8X1Igar2JFQb;e-?&+Kc@as z>*euus2Go!Mi@amE2CAdZJvF_$A>HXaL8qJj`#E1Mz_J=G()%Owb^e}KY#sV;Nej@ zh_da^(=D_b=7rCo2n-DT{O#L)1B2^YrB7L{Uv=y0Ryw{I^2&en1|=pYb^sfkg@dDI zbFrVx?f2up-JaQPxvQ$O*^nDYy@6Ewloc3>`uD0iwyR?zaGDq(fA8$&vX!BhYcD-0;Gk&@K9_&s#u#dU=bu`clTN(AwbSdOid~0 zS7wyBfc6pY1$>QRPnOa^sTCFc@(rZ3gR&{xDKA|LlzYVyI$SCvXh~KD9mCLwWe4G_ z<))tMktpN?8d_V=gFc)RdSiR<&QOqFx>VTYxH0<;;9eutA#gqZd~slS*m$_qs$}fA z7E@|9eEHnDb0}Y0@11)GG>)rdx<>NZU}({DaxapS!nurF4B$Qxp)V9RG(HL!(5rH0 zZ;7N1dn*y#07VNvhnp18MjJmU`!lIr7}M?Bz!dxY`zt9cp9a3)bAP$ah|9xA=ZTef zU4~K|CMY;~`dcF36wN8X+Sf$f$>A*eS5*mtAh^JK6sGaU6+Y&^eVf>3tooje46dNl z!WjsbbZR}XeEITaiW_2&a@)z%G@_okQ2U^vt<4}JLJeE)dvEWP-pz&HTTcfHP5~(k z|Nl^$+=j>|qXROEFDD5);m^;{&w;-eJ^Z5*|N8Y*N3xLX+Qg}$5=-VlLyve1AK=jEZ$ZQXL)Q<;jX zK}ktTu8A^IlA3pwsB{aB&gP5(VKo6I8Jq9ne7S% z<+g?&I+qcy7B;m|2QtIoETP)^U`^xZ+eowXD-@XkOwi6CFYqZ-*TZpz-#GmrwZTc5hGmH%o~M(ouG>9S1!8e}28I`jiD6)?U^lHywHP(;&hn( zYLRc+hGFG*S-F-X?B)kx5*{-S3YguT2vtq=w{PE0p`e+kVVr}#{b>|5tM@guINn!H z06D__e5j%-Z2O>Bb5$`#_yxZ=G}Cn5`;)!13S@Qm=sY+D=nldQ$vv=$M@RcMq1+G) zwSZRs3v7&c$q)=*rH$#z#=?h4CP~CY&9ev;N@r0R4CYN%R>*xfw~F!$s=ZQ& zhlk)eE+q8yLTLYUc9#CuEdr=Yf+G?L*$VK0B($`*Ihg-`qHu1-?dbCy#_F|iH8ag_+5DeNf@M1C=jjHbCw(*z7Nm(`tCuZfsv7) zP2J&T(72#J?FBR3yonD^k<{un&?G%oh% zH~ajWnStP32E)M06w(q5M_z_XWlt2i3qCNC+`6Ri--Rl`gCiYh69WTa_YQi#s`%Zm z-8oIDBE)KCrmOFBc=whZ^Awz&yJ&MOV>z%aHF{*paCS2CE?gxgZGZwKB-QHb%8x3z zVXInJN0*>%o?uL3Zf;I0_aIb_J}U>)$D}fJk=4t`)i){W8a&!{@W_RP`MOn?!A`#F z;e7*;V#TNvY;h#DkOmh7^-3BV8u{|9fI>VeJu%9HV3UaT(D05R2)b>z{AE59A#H0Z zxzgI01$*OOzYK8KM_&o5hgzN&@$ni~$)GU^>bnaAxljgPWl-ezP)iGnVL_p`9{p@P z`@vK55J~yh8V~@ThCq6%Zv0pj%=J}xu(?d>@cDMoQ|cxbV|ep%T6Og`sPZWp8jt3} zQgG;G*~^=&sa@uMI`CnCFk{>|09Sb79BE#&YeuTQF^CEgWAWy)bCpIr=Hu!Z7IbP#y5=Imzp ztPx>hjo=r!VE!2dPj5j~mvqQadcpMjn|rEgbJ*wKp~OwF*VM))3i`n6)Ok}AP;dm) z)QITl=l~A73bDxaM7{siM+6ef%Holdk{a095cBZx$R}{0-QQY9a3pNDSKUE9n}epQ zlQZqFa0v(`zz@EC`}SFGE*o5-D8mt;9C*}cH8nLm34J9Ix|g7m3gwHzkVEDg{&@-t zJIcKe1v^qiZgHsZ?t_~S1zG8IPJV3zSlG}AD!wVWG8^kR=n;ir09cpsYXYPYP_VGE zk&7{9zdPKFQ|?;Yhu*iy^$=a#=4K$kRmyj1RC^HVbKbcl32>@unq&NxGC2KMkBLvG z)_IzsOY-|k90+oeIL-Ixl7}XmwUJXsR<^z|n7HfX6FCSy=$M$!9v^HFUuM%l zfw*-&{Yqm)LsKg(^&|j68AU||wCd>Ut}hMpWW0O#yuDg%-y5tSGSmV-9`+-W+x)l? za|5edqM~^ZbXiEmm4Vk^J!k4((0aL(TD(L(t_KLTH3|RQQx& z2wW#15<V6!!!AoW2YNk>)*JOK>aJJ*-1$#8jQ2yHI0U=;uSNiu?I!0>{rI}fw? z#63NQ<-XnEjN`f=!1hO|FA5`CYQbsfGr z#0~Y+tx+VGFQ0=@4Ex4(D`o3;(RgACNcm-^Y; z&LD?^iqEqqx%fCIQ0Tks@IWiN5zPwr3gM!tFx{*5T_TrkHQQxcNo@OviLr zDmc=I1bt7tPw)?CcxHVZlt9<{rS$ZW%KgW{#@##ML+HFn6##{<0I#cL9X5bw!ZAA0g}2!9mP7JlV% z+bOt(9 zP4tKXB870>5WEQN#=FlI=NA^*ayvk z@zbY-uul;c0%*+ci0=LbzRd5s#v^8|T`Z0*FFlR=_BCm1tu5(JY%;5ien}V^Yj1aV z0~C=WSH5;F92}|b$^9T&aA=tg6{b_oVf9clwaNPSAue2;l8UN5W6T0u?6NvW2?HnL z&<4RI9B~A%hpGHsx6K7U8%P+aB=wKwM??(;1)m^zm4ye6gqyH;)=9YMEvcX$l5;z8 z{rkd5SV`xXCiHux^5!o@*%dYs{JB@8^$7GsIE;j{>4WDeTxTk8J^yxPZu<=t(=zqVqw7J74(M1mKQlIS3aJ>Uug+pLy9E`F%jl3vC5F;(k7RW~gf%Vf~RHagZ(Yt~85V;q!uR3`_j zM;)m>ZW;!r%^wInIst)-wrQ<0>(MtGxop_Yw>Kd^in?%{YJPO%F4%VEJuc*IUt=I( zeL{H-n!1;}ZQKAq4&~`61K@=DJ+{~YfC9M(yc1}hz>z(J;0v}GMM!wKWNRd~rqd=! zl%*rD-7_?#1JVGh4WhK1#)b%rLkFJ-g{L}q*`MbbSWTqXQT5<1tBZ!{;MYj^hF#7s3*=K`QC=^ylsSeyv&w zvhz@o4>GN;aV_J;j}O`6MXBHc6kIU`j=3h@_B0500!m+>L$pCq*8|1*7v;=BT*Xz8 zN~a)6E7>>pXduBS7?dInGflA|ulnB#c$D)OQQ4_?#5x%`1O$N>lyE|8wtY?C}*~>NUN*b-ms{*nD!6mL6+KFTX0)bj}m${~|J6A=p3D zXZ}Oyw*I)-0rxQH!OPC@$lLjg>(YFD8!1#vjX(BlO;Kx~8KVA*IlA(6x$`Q(KGM~i zZJN`kPwNbWr8dNr$%vA5I$NP21!!yT1$-1@2 zZkR|IDghBm3j`XYTZ3gbv~Zp$+*hnxH6A{k*eW@gO|*HatGm3hdP_+?MfYQ#ekW$3 zxbQQiONZ4qCK{s|@q)|h`leZy7k+ygrd+@|eSTt2&ZfLHS!9idJ}A(5bLx^vWcQd( ztQ<^m5>xx8I}p4I>o5u(Snq)u4FdW$9fL-9JvdDHWe4A-xt zoQU)7hL2WK%C5_jE~xizX=9un6GZrKop%fJ2$YN z7Y1Gt-Is2ueKNa4&(40q(9qC&zxeEMXPJ447V1;nEp^-7-%t2}VsvPp+FBmAJJ_*{ zs({dNksEzmr~JDW;T9uI4o9O<5c)d|GxPBQk=VZ|BqAjnW4koKb%&2{|6m{86Sv?O z;|GRm6mJ@6mi>LjismW^2(@K-&&jAbPw6)DqxS7o)@$s#iDj=x$r=UwWk zI3J|Y8N-b}ggIa`1xJ;ce|`z#mkO;`lc5USH!Yf4TRqH#aw_enrILhPI;OdR5FB1k z=vLQr!?yq8n36Z&Z#BYne=ty(y;GbwKH1BIwJFu{At>Y1)^i@t|75mehl#APEN*p{ z*n3>YgC#L+d{|`^H!Q07Nc5cSf;Pq*`koyXETx*tRSC+qv25CeE7R9kU&6*PPJ$10 zosQtE^gKx5F`WXx_b~fWo|XT(3k{Hg7+w~^iXE)sKt<8$JXE61XHus;Se{Gi)<0ZO zx88SjR{ZDA{<`bw7;KX=F6?pl+Sbh_7Omkb4|HoQT~(q7T5;8jDu%Is_va65Q=Ikkke-(qPv>)rew+ID&9{X0ynJdm$v<{;M_&^o`5>gr8Cmt z7aelx+1ynnXeS}zCA=-Np`GNqd9hFJk+H_yrgr$ymcUxoqPnV@aKV{;(K>1ytI;3J zgWdfvts1&At3>~M^{>F{(*brtSbPMZ(E1#Z0QhQr$*#@mxntWeYEg0(`5hee_5Qk} zOH{m1KLOJ`uncW0rKP9i)b$YhU>%s0DF{(D3JjhtPDA+N3S{m2;r6)8z9?2vbeFOA zXwMSK4ggst088WH7#^-%smdtX^2V+YeW$~dk_w-uX(*fE4Hfnoqinno_D!RQLe=xa z%zoie%81ML_wJQj?%+mkvm&SIcyIska{?xi&V{fgi^RonCJjHz11&aq%wZzW{#R4M z;;R10kr$eJkyl(qEfAEsjEkfNWp1yA!;8+3HCFGNOn0o|1`u6&uK8nSqudi&4>gYW zpGI9G#398SHJ173XDMHmh@AV%r~Pncu@)94(%dp7wB!-PT@(7*Oht*8H%R>b&Q+Fn zzE0{l#H5VwTSsxYgnhq^t$jUCM!O>Vm1WZyIa`!i$sRpZCHLI*OH$?(L?UDBLRUG_ zhd6NjIi*-hO8PZ1E1KmrC+}GPg!gMPxz_U3KUUZnL#pJFeBV4#BFd&2ezjw}Jvls9 z*rLAH_j;CN937^#KnvIR<3fjK)vTmp+=Ku10}(0Kbc`_k>deVy!j+|1-Hb4#c<@!y zwtlN*8XPZBc+xl=`TgrXHPO)*<@>M`Uk;dh6e+P~wbtp6GJn)R=7wI#5_4n;{C4#6 zH^_j93ha$Mc_1bG<+g_W|_C2q8nAT{71;^4+-Kv3cC2Qe`+zJZ8?C>RGI zPeZLC#E=L>`sJ|^d=w$IAO;q}+EsBrLO*XciX$W}3=kX%Gz7M=w0x1A%$^}u-Kzpw z5sgYmR`@9dE&<7NmW!-#eV~4UpxA1kcD{lQ4Go1HPH-AaR(^hPml?UeEh{T)R&H(p z{3IvGzuw>?H!}kR&fU9rA*gx+p9~3XZupWH(*MkcC?_ifLyC{(xgYeo0Rw?QPi(V^ z(aV>1a=J@?|DKf<`^S$T1GX@5t?caive-~vscfnAdXeoBBzLIsLCvg0i|#xHBwv6h z0&2L?s1P@ijGFpFdRGW=1F%jHAXkx&2^rx;+eEUc=JW#1A`Kz!JH^yUz(54>d0Rag zR+Wd43WuN#e>EGfOBo?0DJ{JXU(Z7kKJK2pe0TxQ##T}($^;WrhO|LJo*X5XPZ}d7 zrAMsdvzP?zyf;Df%B6xflUW$dabqgR+!Gi(7m|d}A zMW&rA8=i^Zf?$!NAojIsh2YrhXp`<3^RCZLa(-p1b-k*huHj>@c(qO?&AyuG;`(|g zanc-TN0Oqb|K_cJe7rhvs4dUWzns`;T;1MrcqiW$V4}m=LF3vvZR~)*6oN|?m|`RK0TxxfH}!P^uSR^va)FP%DdDog)x(c8@$o;3jyU5rW1!$sGi zgBLs~9O@L3UW*c#RHl}hDrWG>H*rDULS1R7s}N^y?W>7?RFo3B_MwA*>#JW?4mpzZ zyL~De6zkS4-o`!$jLZ5rzHta8 z)%CpsTWNhpj9Y-{Tn7g`0b|aDB5B1UA!lFK83xHTZJQb-Upcv$Unixi+IvCT+_ben z_Se|R$dcWyzZ@KjhNowN5?mTAN~R%G(!ax|F*-T3yW)5`W0|(@v)bI=PTo1@8%*zv z9?IZ0fFgynGw6rMxU)xiZ*_jgft;SjSSIoFQ54gmh@lB5Tp2@yv;&+>^SGu zBxTOU%6dVcMj*6Tj;7($#54ZlLsco(O}u{|HN992XCcerL|mYBVF{p$(Z$)ceRyDbn|?&9^;)OuEe=TqtQKcB%Lzyj89FZ|84B> z*kjDtEaJg7dC{GzVo{LbaTS(wbuDj)ldMZSTo>Y111JFjG5IvG?j6vD(DU`Xnd7c*xk`9IaGHMH`!BfO*MHk>z ztJu-04{D1;FB1~xo#iFHHkV?Y4xQf>=d^E!+L1-`a$SKXo*ybL+uair)^~HJ>L^PQ zmz_L}$6)$aU#$+Oeu=o6*#hvyrDAozZnS^hqv&NG3`k44U2KFI)BESk)B%{U-t5!1 z9-f+>9_6@qEc~$)a!j3~`(Le&!O7}WIbV=_$!0e!3XBozQ$rvDoor25H?YN3%MPv7 zE-2KJvk;?f1MoM{KIM3Dx{!!k&=D5=XvckHqzZ<|!BSccN7G4+M22SNU%i~$a@2bp zH=-N%v(#UIp}Y^jTSOg7OA<;iKUd|4cu7%Y@65R~M4zTAhz%5{)uPk~$IURME1uL4 z_^$`kEIW_ij!J5>yp$*sxt|;~zVTZGA_vLEsP=7;h6Ht)1$3DKRnIJ(R(wd{++%SU zWdNB;>tTOCKbYL6o)^Hld6d!}Nt2V6^|_=Ie3S@{C19#Udw>OA`wZwRp&Mzn?>SgV zj>I!dDG7=2kppB6@VFo&tLc*8;>&#T@Yy}pX9aKHvLx#+3Ff$^EA7E%6pzWEse979 zf4ef3eN?6LZDUaeST|zi$Q^mV{Q)I*RT14ODXhA+o&rbEqPW$##RuZ~Z9z1!Dj|@b zbrbFbJP;^pu9zy6j`1`+!A+}s>Q9_A_>|m#AD4>9Fy`u2pFUq!voPu3e>Atw&#WgB zP;#jkmx!okfr)sR5nU&2PwJzw)mem1MgYf{_sJq}Ym09(qM2kHq-nhZ#E#aZtcQoj zRV>Pe5p*077+A3dLB=UxJ?VJ}itQlBk@e_izvw@3>J}r~V{e3tifSE37kGGzreh?Z zQ-4@l`?is2njh4t7nr==zjgB;bd=k=70R_7yNi3fbr{VXIj{m4S$0nVZFlJ zH_`d*4gdlI_zQIBa4Y9@&&?Na*r`+e8YjuNYWGm-piYua;>b?K>@6rdpcB75W) zR*E7~5xt8B2}TWz->PgOTAv-|qYC>a>PwL_5I(9Xq@-JV?HJwmo>><~U=zrRXubZBK-wq(jDLek(dK-L zvTUXI?M2WG*#XmVu$k}E42rq6sj%Dlq1`E>+n{qWK+N^lu#J#sYWE6qfMf31xhi=R zM)1(K1o@pWbY3_;CuI(t$E*VD+*-C!&Re}p3{4X zQ-yYKe8{x5A5PRwVG$#T2$bp^S`-pPup>gIYlR7hr$} z15Qr#7fU~X|0`I@pFv9Q8@-p1LTQW{l z)XtI&2Z4~4U(zCPiKoAJ&R+4Vov4w0%5Cgvk z*?l}1lmug&g1)Cfxu`f?@{hY$ov`&QrPm;=0lf=gki9*32>lK9o7&pY@LyUok;VR3PBPR&<-%p0#B(r!vq%sC=5se4M~(8lOG zAD_C6k84imA9oRm%-*u#1FQ;6KD1h7y{`n9`(d*_`~>s9*J5td9qb8k(EvFJ1o%s| zfMh59{E-jGtJbH~KS1|I5$MMegFGx29@mywqz=atUsH3Bac{p5;ZGSSUA^uRUE zmvrqP)%%hf8pI799^Jg;D44AOL11i-)#ihMl?YQiH{m&nx(@=QV=C{}a^Ch@1X9PB z{W80Awf1{xwZ$jjQ{u-8(o%ZIhK%-ITg}&eG#!R!L-3nw~@`JPaeudz7^J;zQyVW`!A#gM9xn;+Nuj_rUf22C>EO^k@L#of~$R#BtWX`1Z zZ!je(*#oHkg#nxl`m_};w2d7yga(3Ugj@bJ@2D)M1!_57fSfl|e@4aX&%fd`k+=2l6NitqcFFuc?yE~33BU-2;+aW=Y z`s?AthxwxUMZPy#Sb)e32@PG}i3ev7(Wn=xGo(}?&$+~V09iOsnzz)U&~FGsNQCLH+nw4S0^`sn_e8O z$=+DsM;cOI(i0j&QP!PIEC@nY&zE#fV zw3}*DNH2zO23r?KG}VI=KuJ?G6yZ1l=;g(GK^P4Ff!BHjH}gj*Bsb5TJxd3KIf$2n zf6O<59uR)pm!~_tsw8Ok{W?5}p8kI0(Ml(T{N(20(cMQhA3$+8!WtErbVnSem%FIO{0Tfi68C{FUNC1T_mR?CgPX zzW~`t$jJNwF(GhSA(ITY6{WDNZ7`Qhy3+eDvyrW;-}?b&=#Bk-@E zz*mE4309)tsYN-zpMjM%yS;rJk`6${RDwRW8DA#mr+buI96AtEJyET4ii)eY9*GDU zk-rELyP!x_8w(RXJ!!DgP$SFoya<-s%NhZ%q5yv!hch!WBsDNc!nLq^izHasF~krj zUnD30X#y4q9wLAUHi*uUgt$_=RK*JQhxhLrVwmJ~wqFMY1{#7AMm(*@q^M$99prnE zj_6TQte`bMR8{FXIWIz2u7P6n*u`DBm;fY#WL6Rc z44Q$(I_(_rJstQyb|o$2_}Pdl@9rq zR8)(Xu@IvAGahb0*zHxc5vT05k9`0>=MRq?(bKROg10Lj(JviCuR0$9+gk(Wwv zjGsfDl<3)(Zy9B;-p{u*wX~cp>6r@l^gFz~mw~7ijcTJRF{nSC8a%XY1h&QNNEA?H zNJyoNwv_p!N95sB>7D7nrC>aJx%8{d`4(h(!7rW|{fA{rf_77qz>Y%r@>Y?Nl@$+S z22D*(h}beS5raH9I7lhvoZH#>Q4B~|L|zEMGsBzLYtNC8MtCQvRt(M$`JRhbdeFrvhn!2*ES_KgmuoMI{jsXPJ z@CGr8h$%#&OcbO@u!4aQ5kzWJ9R(J+fV2oC;0p*3ZD2X#2=WLalnNp*0RsdaAd2F! z?1U&VE^xHW2z9=LcGk50*EMUhR^Z-~drt1Xxo7Wh@BMxEq9)6c1>;wwe#rt+x-4)L zS_D0vU0uloQ7E>bSJJgo7Gejs7O^x0b702j<*knuAj!y$`e5%Q;b-9ZK zZc)iV)Lc~eRN$V|(cRvl#bF$X`EGCL{Ti%MwR6s&PyP>H<2Cl&O#hP6nc?=@T^lgXMFZ2?Ue3s^;?a{LuTjq?mG3V>fgV4&Ih^1$`>jQUE`H|Kz&5EmZ#W%a?tR9$_!+aUVWxARh)oH1wM4%9n!BsXDru z%C8Bw0m)*_HCiN(>pBqK(;JVwV*csLqM2G@KfDy`o8d69?pa3Dv6=ms!!N#GQBo7T z`f9^n>&Z3DBfXDua$h7R)}My5Zho6v2~W1+?fU*5|Nei&@U(z6Ikn3DY^(8BoU0RA ze*bzaG;z|}vWZu_V8ODFy*+mZpz>SyRJ1Mb)wuiF`W9kwpRX;c(fd1i@9u(Vgr)Pa zWk(XsUvU8v`&yuL{jg;>JPP1d!jFZxaMO-4GyB&NAr^`pe>5#Y>I)XJruT{!zO=79 z)9>LP!nSB?^4OoLwRrJ5H@CvWyGXw{l5EGz9mo#jn_WSagf8cL=jTIO$Jji4^ZcGa zZ+*?C>BPYr82pn$%vM@jg6Ow(|17IGprp?OZYs%fr0}WG?xw4{bRept$M1ST;&C@q zVfzd9%)PfI8!vTLh_1zmG$teYEiPl~%Pq3#cv<~w_9pjMz@*}}?7x5x=%I#8qv(H zDzzsw{n>Tf5@!bo18|iw3-C}3ds87}B@HZ3z!J0|0JC4coT0{ZzM(wSN-rjVL8?Ma zM1-Wa)(9>2^`>zRAsv*IJLD0Tm?^Nb;C3z(Ux1)21+f~a zn@yviud}n;(@}`qClS#K*@@=z`_C%jZt(HagLMruay>|@t5=~b3U3A{1?|SsJt(kb zU%Y6+WwBT*!9<+pb$8yom(nuoft>+6+nnap(4fZm>%958GVn$lf-P+F&Walh?0X#2 zcm+9mnvrg`R4SkZ6|}Z`2GNWpxdX$E9HR^`&DCqQv3YG_2661|h+*~2Guq7l(Z7$& zwLt8^p1<|m;IE?5L1LpZ!O8D5|P*qT> z&BGWVZ%$Q^eMFa`gnvt>#>65u!iKW7CeP+vcKzj&cr%pOb*rEH1sG(dz$beSV|y`W8jz^1zR8447@)=%e{?YLEgm0TU)@KL1t5<1X?aB;n&?1ubgDU?DnsLxtrB}H%ltV6qQadfn&vvcRcgTKS}yxz+~;^gKX1C%H&qn`tmF55O7zPSLKW-U}-BILGCum}vB++OV4+;}Dii8YR+I5lKdI{3N4!KS{J7nGkc&Yc@dS}pdqgz2$F zX3p}04xBAx42}|H5uG=q%JxX-W-Q&d>)|?*rXoNAjPuT@gn^RkCUR8l0RrCYi|7}6cm(%k}1`nflL z|2IC*^S%Qv_St>KiSIeriG74AzaqqcgbxCN2<2p@)j%K&0^t2EE;cage^ylmf$%83 zHD0@_nRw7TIy+cc*_zY3dO4cYntNJVfIyzJElD=cYy9Bg+Y?eB%vK3%9L(MiE$!3+ zVm;>33(?yLA0ye_yW-((9 zN?0cetW3D#N<57a$~a~teEIuhp1`P%_tI_e{hNbsF@c`vC&Y|I7SB{l_$@b|k2|hi zDLwyJfjL&BI#jBsW2pipdjZNqx{HP_aJ*%3UUn$l1XKiN{%BkXa#|+jqK51Bu$-L`vEH z!NmT#S{m;8cDnUIy6us*? z0v5ChHt0@Hn6$3$11qvM7O#f5!g;=svh(zAOb4eyxM)kBuDg%pxChW7^y)+S{O{FW zJzIM(g=iD!04*TuuR%4XuHu`EhHXnTZSK0@1);fk7=Ho znL8-@(qzH~Z4|FcFyhJlk<=%hY72dWH=<^@oj7&WL?~vUxAg;1`R$GS48eGB4yIkfo^!Fim?)nt8sGXA8 zPEm%_q~$Q8Fwxkf>tS~(y7M$ivpn`TJJsO5GEN00%Zk8R+}xr)9c|VrY-V1178M%m zG**jJ%BsM(UxMQ&bM&!a$FVZ$FUW6!D;4yA%#5wZHu zB|*Gfq8}8kojJn9^66!@8U())IS1Q$(qE{Qk5Nia&Ed8yg6*+O)3w6sWd))E=*s#NOR`PsH*Pcrq{6n& zUVkE7rWx<8FYxD5*b(+SkPRr;_wPTO)3WU{NJl z75w)1U`uc0q2>4k}l-?HNu%JdQ~PVzUmf=7jv<+BY0m zn=gsa)ij-+D9Ea7rTLAsG!3Cc<>$+(}-TF`(6FLuzS@b#I51|K4y0)cn+Tac;5W-O=t3_ zekL3@=?ie6xcQ5o2Ylbj(OgD~ydPZG~ej*xTb zeFMXf29Yg%ZAGUn{uR1VA(G~WEaO={)aGYjFO2)Rpyv&K`uPc z&hSi*K+g2g*Y&-8XyL6hqI`p-RykDV^lP;-uRcf8f5fc*U@Xpd3}&;a3`=^g?XkQk zsVZ7f+=;K9$+5Jjl)U-v5okIlx0OjE#hh#Ed+J-epK_jBHsfBAXN(vu(>F9KcvO20 z-#=!P8wm5E9nZiXq_!=*emOV&RR=#@!ZIc*l2ZG8w75qAr)$UZFZWe4k<#sEQ~`FP z=_7am+Wa3{tE9JlVIUA%u$7b)OioJbe_|vcGD`LPEFudRhx|0s%l%dgCcp30150E3 z@QL4=>=TS`0>4x+N&f;%=}{~x#jEz3rKN7u$@ZT*+Bn)0#8)6ES7$ZX&kt@BNp(9t z9p|Gx5Y!%rpn#SEjVdz;?0LT|^86~@rk?KdjK;K|6D($zi1-I~MZDAW7ejH7=53Q}o&BO67Uxjnr34#9Jg z$2Jmh&$Yav4vd7gvh2d zGB4e}F-EvBh&W;5IXcbAzrChB-?-K9c=_rT7C;?n70(hGnS+RtF*yholY=lZkni84 zA;)&)5NM1X#i7WNmJ&JsKd1lipZx!9@P4wV=YuWZ+_n$mAktfynh6th6fBzu0&UQQ z!LzO}5zz;WZAL*sL9sboTU(=4Lhf5sYV~8{nV{1UjK5r8ZJMViFY8^Z^97s{)Ap*=vG(cW5aI0vq|k5m(8I=PW}4t zA9b*if*}shg3geI#6Q!v-W*EvK4{ovkkcyGbaQiS^gLcsH=-aT%S|-&mLnr0(_cj$ zNlPk~_3fMFu;}Gp{i1`7&G_#YA3PkCd{0gyK;S5CM{@?vM;Lu}-aB}vdC3P$$U(oQZ@7`zD zz!?Sg^`6RqYf4L%2nh)VJq{qt|4EK=G4kF^BW6`qHo`xypb|#c6|Hx?MO0@WwU*g+pda{*%foDw4;-!ct6)hG&(ODE?pjp+6=4?Q_^N z+ST>4JS!$GtrXx*(gb^XWMm{$Jzv>t!Tn@ou&A(*4gx~joa8%4TGYEhTEdW`BGyua zri70tL34Eu#bssoYRfQPUDoiQ-z?L;LjR+ZkJQ=O8L$KZE~fkwQ&YSBoNcF#`*}(! z8tUp&cM@_T!PnH(>>D1oTmg^+5F7~m_tM_JjP=l=oc&8s|73_7DMI^8^J~6So6HAW2`D94w;_76$#r_f)i}UjS zBMlIxiRt4P_8N9}>~~0zG;z-QZZpMUZehXgM3rF5MG|K%+N%g z0?05B#>LNHfb=WW{EmUJz$p|WEHnHz+~xptdplKT0B{08|Gfz5qsNcU>*nyV{;@-> zt*xuACs_ex0}e2Y9N%WDEdHk{9Vv9xk(q@>_5a=-FXZdjN9J$dK%J5_P`nE|tprcm zg@=dN0Ic1uZ>Piuz)<;`Ef_s7x2j70?Ck9BOkAv`ZItd;yQ6&;+^;Xr%%-{lNCV)c zB^Bq7C@&~@yO&ITH+e&l^jE1~{?3lIBpMn8I3y&*Ooi|%1Zmmg%*L%DaG}HIY!$KV zI7g(%5T^~1G%?8n_=rnSAL=}BZ@F=A5C)&|+wQneGswN5*7rK~%kRz_y7?;?ok&?F z`>`UNL2kR(rW*RIB<`OEd!$N=$1)5C%QR?mXAu%gLG23IcveAyEP!X&kqM>mLV&^o zIK^JL{u?#mCixGCcSPAfs;Jw`SB!o6^>)1j0`L#;^3Ma{IQy{mvMg13Q@u{F&A$b( zHN23AjWd3lFQ^SiBXP7{t1hj7>>DZOs0sk0W6G5V{sp(1Eq zRZ0*7=oSxoFMt#oDFOFb?Xsy{YS{8s?rUhuf>Gi6&{JUDOXX;htwojPN;SJdPm#Cq zEI?Onx7UYmd(&L+QApsy3zZ2c-yVFir~wGKqvIcywP2QG=S5hc@IsIF@{zN0scH7g zd*@prLBZ2vqigxn(o#%}z)a#^QV=dL9vkGKE2yPeLp_sAXsxGhta^H)|^aAhVW0LZi=eiAJ;a@ z7$uszVaRkC6eP!o!{O1bT}}kFNx?k81;7Z=)zh0?SYTJqz2X2wdUI$QAeQ~Q{zj*~ zjA~oUDE~5r%SX7;zfy&QNCbBa@q1>mY|-yL8m*y-o16Pd(?VH$d;4K0Itr8g14VG7 z{q$p*K`JA{sLL~<%?pg1YatPLs@6umOO6}es4NLd6h4A6mZ5pwCgbNm-Il^b@Dvg; z46`1A2c#}eWvlAf2NPn0I=sXvmrV;n=cM#KmEOpS=OXdvBrZ2elC=zI^7q)uaCN}W zx4e&!#6B(LC`pC{6CMjO8)-=#x^bVZyXrW6Mi`8aG<4jsK+6xOgPf-VbFp!n=>@Xz z7Xj?jk2-3ap@uRJY~VhxZKvOexox>%^uY7bxgvDj8OJ1|I20}yisiP8H9CjY1!^+T28I?TDA<=DbLSJ>v3qLgQYr1iU;U{^f38(@6@zFz(Iw01 z(aod?4;V{}6f|I20tF?#SSFTz297d&dbZ?nyP18vnBRgQ9j!jF5h?#qF7io2uA+BI z{5_Y+nSgL2Z*(L!iq@X9>T3zE!;EFnK(9?eP$GD{bxl!S-HRnH$jb{HbFqmMpW9`z z?PakmeW|H3l^r*mgt((+?~22f@~3{A48YldQ-lsT=yNPIy4fhh>1waM7_Sj+=|`7; zr3Nn=|F#wE4z_){hE)OEb>T&zHRy3z9a~a;LUbOrdmrCuH{oG{lCYKK(4mL$c4H_r zBclw{7b`6lP43nU5g87p(V&2Ti;oVfBby?d*1u8L>YoZ~9eW2wwb-vo`F%=R&~~f5 z#t_M0C4m6{cVs@k^VR$DU8!+RTo| z_&OxLO$r{K6Pw5^&iDullv{a(4LW)NuJVeM^1MP%_E$Se(<@V!(F#|H-8l6QO_I&7 z9NeuLd3!T7C3HErPFY#pa=A0_Uj_%K9lZUOHzBr4i-Wo|I3fC$90OZtI_w-j5d^zi zyDteDUJmp@a@hw|z17OJ7|TcdLK+O~+NKuEQi$5dW|}evdU+VirdyHME^s?7-NU(T zXCma~9eNv4FyLC+r#Q7!ub-wrR>&zB{m+$##5A^MA}){d*y;;7xEpZF<75AL0qGft zfK$Gf28msCXo2E5z&Bg^_#8Z8cKy6XS~InEdRd^~x0 z?wYa5iqB-mW_v|NSY{GtkEpQ@VF?eS1f{NyLX*CY(_^(%JFQnU!cbSR$yObir*0psi7YPVWaOPLO4DDcn2O~IdNZG zhO6!PKQC2}k^FgLH5Xsy*q8@e#ry@G5rAchW0N*XKWxFF3kK8Fd-P+w|dOXGo`dm2{d)%p zbt_KJoi$^5%`Sa=to{ZmD#3 zB(3Kuwq0K>f2IS!M1_TpxLq(xIFKF=PyzNH2)Y*r6VtT%rXHQ%^+xv3VzWG{BKj6$!o)`!4 z|H!NoT@Zqcg**}zjB#hcfsVAKC`%>=j}u@e_A^Fz!*fv3ru~0S1=i5kpLsU&@~&JA zO|3jpWP@Fts_b% zN)%Y2JIAiu`YPiQQgn1ll2;A{jrQD9vQ@N61eArH&!~6> zKi&IM<4zb)Jkm-9C;eVaWtUlnNwyYhSXG=WGNH(aEd%8HE`EM!Fp}D|gk{b?{lg6p zr720d=zN6?k!i$4Sc!;|Mv??4QyYhiE9)0LB-yla)j}NG{RdLx{(h1`2Xy)O*xd>n~%V+CY+ilVNl`0I;PZN6MfI!8uC%~-v= z7NP}iH91x0eg<|E`4sZ>H1gKG%Bew%;SDQ0o!&#aU4CLDt03XB?(y|6yW|YLlqO?5 zTsr=XmH@ms5E&x|uXZD}WNiNmRn8n1tp8Sh_{20mS-;@w=i{1=xS#J(Ik9-`&>8Q! zZHYPdZTg0p%i`F2>nce(!$6?Tbe4j_Q@6t1oPn-&Z!Whm?l1TP;wa&s@0L|f=C}Fg zb21#CwgSV&hmpWx1M6_{_I4 z005t;PrZY(%sS8X+B4fmTYG!AA5=%}#;?Ll=tVlWsRn_FV@2zk9^F0_m*J!J9 z-v#^x1wYqwZ#Rk9fzd+Ia4aKX@u3W`-r|!-ce}iyIXF8n6vg|z;YD(9F)Ebfk_ya> zT2-yTE4F^ZMUt&%aq5lupl&28Ov+mU&0Ag>p4{~QA%TU=7J{RE%J?#(ts1 z+4L;-Mg9SwOC~CDX)m^ib{T-rqXd-s96CY5f4s7d-#1s_z52+V zm=Hy<;|^Y?(a7O+dB~n{9YTK5^zH|spTui04i$=OVc~2k|Hnd3pN5Tbf7(z`TRvt09L8&DZYpbZ zTk0coz*8-16y=5z$b@w>KYy+XAPKm`cU-&gFKky`oNamt*+Nhb5R?ahzIU|yuiupW z)O75zimwRMSiwM!BoO@U06J;=J-Ahy5rhd^5=xE51jQPa8&N(=o}IpFUJ?M@HsMF1 zW_yJEMzlFMgA-tsfXj@@86Caf7D**rXJbJAr4Ue&oL!3L@2$G)Ef0~kOcdY5Z^>Wg zD|*jWciOh?zbfBFqrpaU2a3 zM1+**58L`p>wArUeCGm`7kQ4lY8f=;UQp>y=RkC1yymjowG<*}=P@-S=&;dwadeea zced$5XZi%lSpf(8BmBd6=C&vYm&F9Pqw1-B4n*3~u76UtI)=rN%DfIWXS8}a?gqH8i$s^(f`K*3+|JS%0s97h>ZZm$j|uPFRN&c7^iRhd zR!k&_nsK#*fg8a8HrL={jNgE^jE1rExFxFw~03; zYu{p0Nxsm1Btwbc_^*Ej_zjPaNH32AL2o|YX7UT?AE;nN{R?>tP3)mnV?KSPPMfPj z&!BM#Qw-Tc;pLQ){y|(5E$>aZw`vE%m+x12VR>k04Z$#HK*%I2Rx-AzB)5&> z>L8ssr1NOM$J6S*JZJhO(p%s}4EroKi9n83r#2D;f`oWdG7vwsBwf86Ik^3{Mb`Hs z{=#>DAg3dUqY zw%ofaQM17voW1+xLNh5LY=cXNWw8*={L&Z3+E(4qMme1GAF>To*qN4ub;3JJ`{48JW zS`H|V?Ck9k)cZY?ze+chy~qL}hgKnmbQ^vrMgwwe5nK;r&o)DD*^R09EIxeD)VwjW zQQyhHnm=~Az45#LTi2$ku1*p#f`%Ch^e4n=D|JhO-@d-Su>^L#>NmZyfiragsnw27 zpN9VO6~bruo?b%TTi%x|O8{X*$}#1fmL{`}Y8G%Asb%agrw%Bjdu7+=9TL>*<^OIA zFuFt>P93jypTh}hw}LC!@QurWdX|mhtxQ~Ua$%`n9kvF)Z0w+)LgGc#ZtLaWk`T$4 z`W1l6VXmGL!(B=W3MX>Bva#c4Q`=D%HSKs1+;VBR` z&Ky6!a_-kK!iKLdI|8}Lq85ZZ7GI;%R!=;%6=MXVUT=}whtYLxOj7-3RoDJuOaYkiIvtwyFK6vuH6p@dtC~1f z#}CaJO4TL$?r}ei#o$1eVb8YnGrSl0#Keq%P6#qwLjzqs1kcRO%vPF*1HnD|f!}nP zkGad@FDdPOAd1+b+8G-uu<6(*c{2D3Kl-zPcL)$Tzll;#tMNPYfcnnuw`$cO^uG-H zziJu60m3Zh`ck?lS{wE2@=%6n>|A<4B!otR7kj$Yj@YZUy*xyDw zL&J2S+NlYH{pdsoObp0uC~>hQQ7%H_F}R_j0Vtl+1B+O~I@*J9khR9UhbN4XTHBc? zRWk#f_X$XL4i2=;%;@j3BcLfkOPNQ3Z}Y3K!@S|dvu^HhGoEy zsRxY+>8LR4=H=yGdrpef)9cr=cMF20m~o_xj55Gff;ri*q933n0$Tnb+58a34RhQ5 zRoL9D|MBBTOpH6t4AePJxA@czr3r1i&2@B0B9GDM$JB)q5D;uFwFe10uYH(;_4M}M z=?xX=;)RLpIpM|`Q&LinWJ!fh%+D+S4+WXQaDANrwk8Iva82d24r(Gv{!IT0C;|he zI258hzXI(pyWh=Tzu+ddK_M-Gew=cFs$?*pV2b~-A?;sOsjE@t5^&c6= zRW%H6pK6Cfp_xRY|HPG)l>VDN0}fkRF^x}1xL||$k`b6?jm*!p<&VqVF?IBce{ZJh zmE~}H8qjR}-K+yt50#OqfEgH+0$o9pJ2}6ngXBFXz`($`ID!*RPE1JOt;Rh?^7l44vvw(JGF2KWoYclKouP?Ud9NI*HHQ!Bw z7wCEVk?Y~zu`|iM@fa!@Br1U)pS5#COYLjyF z@Mr?UiH&{mA3+5uf({m%+%^W1tyasW`TDxzNJ+cf@k-~i);H$OBaFEDL zl%AnvEBiOgNWW%=lE8EMD>(LYEa;4oq8;b0;+WTriU4iFXS6ausZfEVx_cwu57 z$Mgv0C z(N$etUH$x?2n9KDL^wP+5D*YVNeK}p5D?JWe|-`L{9h%5V;>m=xYMqlS9F3)69F5Lmcc)r%i&^>wT9b60u(2UEurapl?m+UREB5v7-Lf3!0Wj zL1NWuD~T)93&7a%x#x1rzGEUMZNGZUk;#4G8(IHoTkpfZXNoJb+L6(|-yzlAy0xAyGv}~&%uVjzKa;#mqwmr>WP{n>&9w>?t*gnAem}OfYX`1EOJ{_uS z%neOcR&}hMt!E%AU$iaEbY66ls1EGbwAN{bVUfpzYPeru{vHHSa3vz*)F@`;<=fb zYP-Hv2SgjF5T|zC4u&EcT;?kzUmz)u41Fik`hQ#abqNsgf+XDGDu(Rh*AQ2-LZX^05tRh%vn}uMunKRsv0BdK zo3AN?hUAWg93_yK5--nEneI#09xp?-69F%T8{=8w=;$Zhd2I(>!DXq9nlMXqmq~}O z?O(J7FfII!NBI)rfV%|P4YU=Ah_TA&7&E^9$shh=v)73`>dieve01o)JgTXbFSn@0 z3?M2t^~r$WWESL9>2GSgcX5zrAR|nZcfBDc9=}PXl=F5d5WJYxb5oASq;O7Lbv{`x zCz|jWfhxIV+t5-uv7k)Ift0P1l^i)^FV68O2TrSYotI6`rJ^qdhKumamlEeEa*4lc z5~7&4?cdMw%)1r0<9)Qc<{;QimAiYmVkuz^7|l5VOBZLYeW;guBK%028ZCp9vae6! zIEMT;!1SP~MQx{C2BU;L{tSJs8w&^PHtBc9mrQyw^4kG+`VqQKPv~Y~44Xv}A_)-d zFm_-p!JQIh?urNnRN`Waap$jm*5t_s%8Wzb@yHdl6`4r(S17*#yW109J48MG+aKZ| z@;Bd*Uol$=eP(Y%W{3+9m<<}}kLu3-b~b-FqrR%ss*qe51sR_gjxYR@f>ho}F^c9! zNM%(x7;C|b=3hk{gR0xd@Sx#>wv7|S)*ZC4*!0chSm8ADp6yJ(nsZjAaylsW@o#_5 z$ncpEBi+Ck_9+sya!%PVB}~Hm4ke!5Aiw47J?1Ww;s}G!jha=I3ADiumr4aA4;&sf zKmYNjX}VAD=C34!_4dz%c0E?ZZS_KhGN{0Z+l}rE3viZWuAoG~K;D$E7BN96}rl{CGMLZ?hx)@5i*c_TP?0O1OTvUW=q6Z)Q?!p_)Wu(&Qb zXUK|jKT80y294+lew1=gD4imq2k%5bo2(Xz_?#&zG920C`lW8k>46z(fo>8g!d*!v@A5vW|E>ifdZsx1JwoG z>FlJ9vqE@>f-DHS^!A0;wExbv{~asf3N!bJIA`6LO{wTi{D-J<^Ae9q-OI72?zd5g zQxdpHb+gqm%=gequghBSqBG-bVf!4B&^90Gvq1!5U94zgB&Ee03wDrw{Cbda0r&G=-8O5jGc#5jwa!#S_(nZ7NM88bo2V4dt@7^hXE*}SfwF<)9h#} zxzHeGNdXyK7E9N`E#kOF9}*5_$D9F)S18;UXJT|r`;h5%Io%o)uEM7nKLWDQJNp1w zZlb2`Pe3a~P-4y!CSmn}0o0yUGCz=>V`0?qTvS3|wv>At@v1F+Z}9To zMr=lUS@2n3M{H`k%jrG~TFR=Qrif8dx0Gs<3CHD1kIyDJtnkxfR5JX<)=Y%4XP~Jk zgW+=+kg8o}P=!>kkz@ThP#;lI8J=u8VX(vAo^Q~ip*7wd-)-t&eh2eIfnk&km*;gi zqnN>@oQSx=J}DC6e1HuhHwv9jC!988hPj1?Kti_{$3S+}d)3m<0A`qN!3AsD@CxZB zLl7tuIqWQpV(aj?(6ecIneZc37u#@twF=l`SvDAVj5J56^u93&TYsM_DH6RbfI%0< z*6gnkSBB#iSJ+fR&O}HE^qAP$Uy%5Oq|sZjLBRA~CHd77E`ntvqf2X=m1Etv%pJHy z)T5o8Btp!==(Y#Jqlm=9@p((^UMQKzO)Eb32n8gOQn^%HY;-6Lii1aH;pWFo4m;1Z z>^#G7MRc|AkW;+8M4qjuzeGC+i3`gemG7hI-hFcMt4%E3NLr^m^9_Be|93jk>*_^3%wW+rMcaA>_(fX*mm13AKg!rm>? zK6&yQ?i-y#=i)_`sEO1bho%KAf>9qrB{9n3Ely*=evna34n_T0m^qpf5O@mBlL=s~ zb_(HB(V%u5n6{wJxBz{Ov%ttx^qRj5&Rhdm3Z8hjJxh5EA5KwM=_UE$eLx)QcHl89 zP+;ab7VeY=VPRNctL(WS-2tVcSPOch+p+n3mE0)0Rv0f!a+~ z8YYFI0d@#%SGgtzOPU+AZK9()z`%GvLctOtFLJYf0b?F=oO&h9m>7$B(NGMEJaX)2 z>qlX}Qfu!bYeWEK9?y(bMngPW^}1vwNXI3T7C&cMy6<&;?%J>=U}7vqp40%MFfgFG zX95tso@2=e!zkY$T@ylOCnQ&cJBe$m1LXH}TJ@j?!}}Rdp4z5&{PQASXWNBD0?KNW z6xZ3iG_=!W>t_XFbwfd&NYleG!7?auc&00s=*9t;uF2Ue=7>E@dMvW}1ju>=yq6ClCp$hb{R{MqI??5H|rb zA4Ag4UijMTq#Iv+8a#wm)R2Ves1zhGh^cHpUOd}wgxXU8(Q#V9McPk;o z!+-6|v%_wR2?<#_4BMBaPFd&CT=^X`P#@Le>zm{ypwI1}Si{sH!}y8jzryyvbMF2u zojGyfQ2g2a2#168r?04WAmH1evLi0s*s*|1>h_)WOiwz0h|)sW{U}r*sLaAO$2$H7 z)1hol_7=zWlJzR69b9FnGhIO0!P!dw5COYQcEDA`R-0Icxx-}l0;-U^WW=;uZ9Xbh z*S^wxrVni2n3Nw08q$HINzRU!k5sBaQO>}O6blwpR(#Sbn6P)g$vj%f8c)4Nvt~fz z!j(xoL8r*LuPV7L$m3_z5AisQLkr;~W63N}J3T4c-$G4%r#JoiY0k5N6_RiK;&at| zf;0bs2khe0sbH*(VpCC(;N{5j1587I)-q9!WQakfKkgw$WS&Luk%te;`x!)}47{Wa z-4VP*7T}^CT$Z9xhLEgHTDN2EG)Gga&Jr=(ks!ArvfixOKT9D?rWsZ&@?Dt?q7PTM znU1^hOa$!Nx@t)hSEj1emf;RhIeq7&F=atYiv?psx{65JO;9m?Ej$Z>BBq-B6XfOM zwWipC{nhxSxCUM}UJ8bobkCitYA;q#$s31%ALuein8Eo9B!)KS9T z$YE%Bmu$m5R>xQCQ`OGUvU*jZr?EXQT9$BxWP7@{D>;S+I6CNW@{+uoybKf5(XQ(8 zk&+obYZiMLu#0r>Lg32{jzz1G+qe2gcH7OrA|%RLFdBlz;x8=5#E9RL!w1t`r~<7G z<*DJOcDmqs{G8j;ygWLPaa2YysG-|=AG37mUw_dcB%|-0#*7*nj=W z-rh(l#Cb|fNe~12bPbx2{_HP z>rhxtkeNSxwC5Pc@Tno^k!ev50zS$-Dw-s_TTOhk)>=1#M`eudliU|ugg>fm~xryD$|2`EXW(FB)u?y*}u=T-U zGOc&9Aoi((aJeM#be0?)$7l2v`;iGrrByZhEGcjxAWarN$%T=_{eY=D3j#~X8oL*%; znQ*LkRxDOE{=FJ6&ed~1^jKE%BcH~wyw*WP1ip7i9ejRD_(B--%pSIDfC{|CX_Udf zy&a33SVq=|2nM7=`8t+X$CnYpJE0+P;p(Tu5=cb?lMd?-bguBlF)ikp2e)mPpAbdi zp`ghx2EY1^F_V^Uj*(0tNidtWAYtcL^HI$QOEZ+cwGz+5+~SL!`>tG%a_sgZ5H>z1 zQq9%qEB2Wl1KZ0q(Me9kH0zm80W9Rte<|p>q2mhR&mF8*02GH@)r#jTW`pG_3`;r?2@a z_++5x6dKSD9oag*hxYGc`lsDxQxRJUYttfalZ|6Q41!lVG@&V~Vk=UD)K2+q__qd$ zOcx2`xoiX1=av=1j(?R)*LEk zDB$jj8_Trf>AhOgGW*FvSLk_t@uL+C7Beb))GsyFf@)d}O`$7SU=Gb3YPSgLmGn4z=(JQKJNk30#276i!c!Qp zxdf_1EKZvaN`~`cS4)CHV^EhG4ZJTDnF41N@XV89`lL~Kpnmu`e5#@@E~j0d2KKCM z6{3Xok6bgeZFBoZw3G?w=w)TJ-R8>*zu}qs%ReCi!X`kMP1op52{6ucBXO{5gp_{< zA%vjLrkxcWPzenEq+8V8abP=(GdeB!aVqfPg^LoVMc@8waL!dFyf3?O+I#OQA48%W z$~9-kns8IA`Fuj0C){?Pg*S#`E^Jie{MfXZnJNjkqsmu5XhS1oCy_DzatCYK*28qq|+$AX7- zE{w!Y3?dIy&E78dS-^7QPW@RA{$rVK0qIn4mEpIMy7j%#nGu3*SV2kVwaFtH2 zjCTv21Jkqn4p>UZ&7nr^4k0v>#wap@S+A2}kzQ(PjmaQXa*9&%gi8G@mx6Y+6=rsO zUoAfn0THS}@n-FMB^7ZF9}C9Y9;STl1tA=18WB`uhQ zc{FXs2E#wZDNdxSW-DH>iAF#}9dH4&@oYmvSdJMjH1ISjER(Bf7DitQ%)(M>?ugAP zN=y1%)O{#Jsur_m_a{Lkr0CGND|);kv-@1*bTePbeXT|`CfPzOPAl`#(8U5~z?Y6t zB8o2xdQpv7OcOpR*k;o;voHpipaPs`NR-FTLV?wBPLXDy3o0NMZ5kg+zzDs4?~Z9r zV;kmoQ2+UzM~l|D5{US!c#i(;OBs%hHdb`Wq9X|X9=XpV5xK$41DB23-=v|^8WwO9 za^9375mPTqAx=|$*v}z&4T5V2%FXyas1kq5A@C)+H}NHIu0)Y>Y-lgX>=vof8}4!y zyNg5mAVznoFtYfFq)N4B=7$(0Z&%<-F_B@+W)Uk>E4XcD82bwOfPl%PRr_4^lKJWT z+dF(Fxwh$k#>s7Fnl*8-f`)hvlB&0-WbPO=xoIWU!^8#p7&T)1)Pe~387@OkHBJLI{geJ_p?o9g$k zOG}VS*@Nk{)|II>kCkxl7q28iq&ev#mxMXYB#cjj&4<&JUkGmnP5AUo|476$*jc4K z)j+>pkJg^VTel`DHis|4MXJRILsv`HMA^fS-3hP|FmrY zYK?nmM{Zj3d{sD1A$ANR7JO!nq;~CzK!6KBVT&N&O?{1mj~;Q{h9KO?VK?V~2LJf9 z4@NjHEHT1ED{Lc!yDY$`P~L#xwC{!KX~Gs ziohx!sunOP1Y?^cdPd4)lGaa4rsDFKZ=ipzT-fKtpkA8Y8U~dp3p#o>2IbsQ=?PU} zlBj!vSc$82;o43u^cet@itw66Rtl^h{p zN0<7h)PHfTQV8cq`JXc!6)gT?d)qou5P}g;6e`7=>T@JARe^0V*n4G6n;hDr1d^6H zYDRj5`b^e-LDtTUsw8rY=iq`V^WmDJU%m;FK8T2Yv%mwyFeKl{1_RgXzweBa&ZVee zXS6c31hmjcW5y=aeBWPs#Dj+qtV76ARBY~@hYK`I)I}}shlXP%GibK-$*pktzBC{c zi$=qQUiyXZ6^YoL{#}R+%*~5r%HTGn)lW42%1AvNB6^QXeh^qDph~Q@pZ(X|=5B$n zdf*jj_5ug~?A@2DrdayHL!hbM;{GiJYq^McEm8=Zn$Z{lvpN9VkzKPNMnETa8OGY- zbJ*5G$@A@;w=yb~(&|S=;Jqf~?LYnjlOSI{Du<|Q3=Y+y&zC!_#!P=(@%OxAh!Ys4 zJtVVrS@X{Ds4lb;Or$=qbuIl$|2b8y>+=nim_xlw!}&PL&cN)MP*7R&Tv_G+?cp8% zVX3=ji60#J+@FeLb55OyW@05qC7+;Ry#an+sA>Wxq!{X*tfReIvgkJK<%twT`g{|` zDlN%!2D(&m*fBsy7N{G{v4X#wQn;mAs|GSHw2hydUf&sf{Dnfe(s(3d3AyM^2MqOI z>{h`oS!UVecjvCAo9@A}?_tUKIx_5^iUGB^;O%e%qT-48u zeFcVW5jLZA!SufR^AX}3Fwq<7{7WW-Ero>@B!z|lH;nujL1z0V@JS3RV1&poM2c$t zxFFt(FW}Zh!E{{wg;5|>j;ZC!=y^)SYAKNgS)AkQ@owM4f^k+)xiI`-Yep_%-3%XOPBiB0Zz(6M)mf1Ef8 zHXEI>I>qZ4twHNrKR;Y$V>P5a)5v2Yk6;(8XK-_s+9T_1-~n8iphoA4BXt z6WGHQSas;W4-t>tIRp$pxVqP}~x4xQpt$86`|rt^Di8DB3^hmeylh?T{E z`?0Seqayk*EB^lecB@yJo}RwEywn+==H%vwq5bi%eh&mb23ftnzRJkRs14S;d4(V$ zAvHHQKgPH{hB<7~i#$C)eSUrl3kp9>PsvD1?#u!wr)Tf`yB|869_vchJxo;9)QgIW zPG^BU{KDVQ`}g;Ek8A6+^o&bOOKz@iZc1`+jKpSgvJWGJQStGIr~As?RlWVa_XSDl z%oN&M+E3|Wj!6me+RBDT#!1uDRtAOzQ?oIF!Oxec^lql7XJ;6Ebi2FTPw_q^I?{hf z$Bf3N((|%YdweS^t7xToeaELA$ER^{aGvtwWomN+bv1`vEz(j`XMl4JJ?&-2>QGQn za@kqph8ngGP8Si*1Jkoz(=$OH-on|@SF>{=(^CWEgC4(s^The4)Rh0-`s>xGSvHa^ zuA&&RvN|<7j3do$V`Y8rXZcv3Sz7zY>bJYTn~mp4Z+~IV!SD#Pwv4>2-102&ZGUU% zZ`*WZDiD!9t{JfZ%Z=^8oF9TjV>O(kHNN~ZRUHqXU^&yZ>z`sEd-EGKj#@-+$RZ2&j>?xClr%B!R@g z0jz_BrZWf#;lO_#)Nam||6dW>MN(E2`Un&e29k)c7G4Vkgcw9pL{P40=PL=YK<)dCE8t|pZ%Js%rb zY2x>Xd0=yDru~QrOLI3x5qRaIZswz6qPEfI);q&@d}Y_YZ2f=RdQ#3i_nUhVTOIj) zuxlQ>+fY|@=)97a|H1nI2grIk|36vAM~wDE=X#f#bq$tob-R{J^N|&BDYH^k-TEt( z_HEPtT4~4*?)*}{m=eGjLU!aA7Y&U zv;Pp|^q>8Q7{~wYA3jI6`{Ps}U+>*I*Do{oRm097-#6Xf+r3_FH6OIu_Kq(rKhFkt z_4I0b^?G@>+Ij(twV|JxX1djyeztm-8Y^Klb~)V>^y(b?v*nd+#|)pI>x;uj_zmTq z?$b3Lno)kjW#`Ab&TZd!=P#BHVMq6)_)RAq`>E@j{oPA$MRsqhG96mVdU@{6=w_0w z;&iFsF(2HlOP3lC>zpR7d(i|;Xcv0^0KzlMHcHxT3EIy+s``oL)tM*%k z+ktGAyzh?ASS}$$L<~7 zU3^Qf+7F;{S{w_MIPTJEJoz+KGUrx`)-7qRWgP0Zz%aAuQTY2P3T@9&;izm@=T=2vW5O&K!Ia?hW$CNqGKTT}i~ zYF@ir&zi5cWH#)(S#{{{5zdaoR^O9L|5tFmZ~Kb~yQ4Il9_avlAm8_m|MxFves{k_*1w1w^v2VWGwa4T7hU&jdnfena+KR2$`2o%7IUjx zLJ_K)@iFem(i+aN-xq;pTm8J1S)7Hj@J#LT5S<#WJqaG()c&qSn-EI5? zdo{&$-c#)22<_`=O~02Hznii)P8S#(!|DKC%^4o0`NWkn149E;u!@Zi=taR-^l~B8H!-# z9pU|ItoRyLSfV?6=*- zWgXI9RXARBFVTMU?MZRKqVaI?{?xOn8S#n{j^Bozg>ohAGHXRKRDM3t z#0|{~qh>a(@rd**0+G}L^VMJ((&xe6|Lg1V?GW%im@EtEc;&Cm8YE~tMPHtFcf6k! zb!D=qUy{G+=Q2j;_|Z}?&|Mt&HTit|_LxUmx_V%4*O20kCE<5syc6k6?f&9HZLPPJ zdupL-IO7DD>tG*Vfqf6$_KjP~`!;mRzLfd{t8T`t4z=M5ISp9RnaE7LMt84VPwEv#=CKR{nhbAlZ}*nOJF+Ox)vM!hIs#hk+v%_Ks1>}xXW#@EUp)4O__+<{ zu6w`JwgV)IzFxP#A8Wtwlpc^e1p%(cu_vXK*|>4n*QmEB?(_!!$&IupvX3e`YkD7lkpo^u3 z6;IQ&A9ji05#FBfnHtLBRTPTbaPOtkU0wg3F^4TN0U`UIlWJcre7iE7OrIBcy0=-t zEPj*4>yWHF{KjfoBYr)D$YKx7C$lv@Rf0m!A7$f&r{p98X)G5>ba?@RX( zByMO(>L(SBc{&$!HL=n2g*0vFfO~dP$y49(wK3#7 zK2KMvT7nIRCMr_)^4l*>Pj{yLZ@sf)j?zdH>fCK^khu2}_-*fvEn2N_9Tyo+YQft^ zf)glxi}|C?X$%b~+sU|#va?hyP!)wmO><3TEBC5zlzn!cawsnpK6xM=aEt-iW3GT) z-H?t(=d}Ih?JEy9S6`g%aEB!CkJTir&tW95SD*0FWhsne(sxWIwq3VvJ0NmzUagki zj71-EJ!PAhHXpCg%T*^)&-=}r`D2$glHD4Yw3+KwQcs6ZIrMty9a=XFzmdg7VCiw( z!1`N9FV+L5o*sn7@^p6FP4?i`Ju*>Gk>C04(@}fHtoFln-keW;5PblLBq-~{-u}iy z*&z!E_U;(#9-ds>mq$+=R@-sCjVITBQwVzfs$I{dAYG0l;6vdONq_#>phlHP|Z)J<*?&`P1j5eCN117e7%=UgA0*CpRoQe6N?KHbH?+PG3K7^Mz37tE+ zaNx-`_0RI*4_o29gbN;xF+|na_WDN3UM>0-v9%v+&6(E$-*26=cZ|G*VOic+4#~Eh z&tu;z*aZ<#HWxPUrdYc90El-}*tZn0@&Ke-#k!el5S?PQvHR#V)BE!|n1{4~N9De@ z_iOsvulMyPKz=gp+RtNaNtooCEyy-Asb&J%KJ(E=y1rvxy7kgErxgsC_N6da5(AEd z?2IKs;5mYW`F3*c`~#>D=vuoO?47m=<+ta_$S(D)rfOY3wz|JfKKQtKDiw2e*bj-r zmrug;zLWQ5yG=szDd520L=H4RBRrHXPR0QbH=Gf_Z+z;tnGxXh;q<(&$oI)_dbCx& zL4MR3b>}?)Q!@!bT`RK)9JnOa*$Q2*2JL+eZTN#r^!ai;mHmCw1HU`X_1<&4X2<=# zxB?`)i!^|(hfKDTN6IU7wYH!kl@mYqb=j%f^m(39=kqD<0D_*~p7*en^x%E}z;!L1 zJB^w3YKNF3kcu|>171TEgRxIzeIjHx!%r&p|hHs zT}Vn1G`8;@6HJT9TTH>Ea~F*bufaCx;BPs4g*|03!}`2m;ySjFW3^kjI`82q=}CPV z7Y%oiLymcie@ry~Wkd&Nf6P_UWN}9Rao2fWbNsfe5d2!aW#ll!ao8615Qc(N%UBR# zXICgt0HiF$L%S9t)t89(YB&k=e}4b=iZ1B=cuOPd=`6M8u(_x!02%(>{-8AQ*dulV~+*{6rJ zVT{EKlqilz1_I;Zr}GZcqr18fpU+}PJK)}F{Ura5`v!LO8^hJOfG7%F$qqZjFMcf4 zF@LR_bYz957p4#vRH28 znasXavrt&O%!@m?JbVL8~TjrouEW&^jgs@OWJ>tpxZirDr7F`ttMlVj3$NFqBc%Z4j}x-ogj=v*v|l2m#eE z{Erl|{O_zCU^=vOH#(eBT>krWt$07jc>cO)??ETP-iEW<)%&RG@a~fY{C+l=h?JE` zZXALj!O$mfASSJ;a3m>HMBphFD}~awVdTEA+(v1_)Ow$CAUErPery{%Y9jecYA9Y^ zW{jGrTS|$s_=&#IEruB3;|F)o}joyHf5HbyD`>utXQgG2YptS*_{4-QAa(i>rL)ef0Dm{zMQr2QM9S`k_77c^-kUQp}p)^ zxE?^xf|0iw&M)&&6k?+&=5-e1?V*>s43V?` zVp!N}yP5NWqeVy80vVLsEDk8iMT$72ePf*Zf-pPjsgB(J8DPCIf*drgmf#on!R{z2 z86HStXUu?RST3}16gfVo82*TSlux*+jCy>sbq#p^WiusBll=>qBo3RNOx3nHk4X1?@)V>)|_W`7G-% z^(q-EhTqvoOwC1AU<~F%Vbtx{HHl|!g$758)&pULD$u?$(qAqdTwX-Em>0BkWm}cO zxmlolGZRujch5E-^ht8oaiIag6sb#f5H6?X9+!&kL6a>@$ehtz0K*)YMHs2xk2SRj zbNq9C7M=*Teh6Wg1DJ>l4>0#%9m-_-PAbCS4{1DFC9_^V>_t}Ivy*m(um~DUQ)_T- zm8RW;b+7>PpepWHo=ASq)L#(0Rtf2N19|;Ft8NpUV9d*KWL{m3k1jHLBZni4}UCVd|a z6K!#Rl9Y{0JjmCT(eSwHe>QqYbV1}apE})RBKa%)8ewbDs03@xgS*icu3YbGhd|G2 zTDVNXbDClei^w*%f$@F{VT1xlf?xkR^Aml}y)h}0VgcGym z6jrIkBS|<41N4)*jvZWG!S4YP%QxK^Ox|I23*hR|Q2*wvqjZV^C?E;=;xeC~d=6`X zlDkvQ!>iJ}vY=56_F{5W9DGG04WAM)qd6|MzXPIK|Ez8LG%0qkZuxaS#IxEPgBiz1 z7EIqidJ=QeEYxnHaLpfd5dkbU0GmQHIC=2G(q--ng>wkMDVm^rQ|O!D_LRGrA8zG) zw4WvBULE<<_$_qnyjB{um>0yUCAOC^hWqHL5FFn!)90@YNT<M5 z9r4Y2V<>1iF;|K)SR*uOnOMtdQ%CMRw!|l^R^^3hN$!*eCDad-E-(P^JqmG3Cv_s1 zE6=kk+6`oPRieu|D261*kdf$i@P`iMCn(4_aiFN+RrQbvL7zg~Ch?Lo_N#!|J=k?2 z<8tINUny4qBl-b*p$e-)7_v31A_!Ah585X`v_Hx<#nh>vCEb@hGxGB9zRGzurK}OqB=&Sk0 zS&VFmn;TZgh7aW6k2aFn`UDK@AF_IAxW}g$_7YjtwC$vfEsJpk+J=U!FdGMQ#D$Dzt8Cxg zqCYS2$T+=XZh&Dds=KTPy(nB5GFsDpy<(q9jI`b7>lrfx%wPXr8nL087}Gy+@ui`@ zxv}#}`0tda&h`JUgr&8k7WE4tmRKDZ9c!ZZ>$AtI8{w<(ux;W9^uuF)KN#fqKS zsanDXlabp&UkiqB%)}EV`>AWtBShreuQ-4KC*&+D`FTC!7nMm<*22oomHIt?;79k(Y|nYxRpuWd>{b2#5*xyF z#+Z-337j^DfXMWtI0|7|XR7LD{RM574c#+8?8ZO+up9k4|KF5 zT#+lIcbcx`>SUW~4;I$#V#~1Dtz#S;;exj_*0%U&6dd{QZLR41R?8y|Jq{ z*U@SVR+=l&<)QN=9E$bXAIjiDg!6|@;haB&7`BP<(z8T-auwzYv+bF!#=>2h?Ws~T z%e<^Y2sDGw)s4L}-*Irlp8$iYSxM|Hkl)HpuP8{NPnX35J5GZx<}SMLEb9jT3MN7P{L}d2XORl|sai^2aU~u9 z^O>uMf$f)z4F_ZwfYVIa7gb*P$2UgYo!07a}e?(R?t1aK9=~>FO zoBV)ZYE-!0e^1N6pIhr>y-{VI7N-kt=UZM#N*<=IiaS`u? z+gW5;IbM?Ij@}mcds%FCfR~3UiYp1PA1_fAUFmxPUqefr6BepYw`OJ9UMSIHSh;T$ z)K6&4-mBqfbti*Pw2$;$)@iisrovr>CU<3TSni&M3^q>V$k;K~) zCx?gu^5!701M+)$btx6$7Z2Y4{=VBDL%j2-Yk%ezXwb$)PF1DxJO?O8!2x_&1x5$# zVnO2!sP-D*W!bzo)^8au)X#Xeo80)If1mkcHjYdl za$xcWQlt&|f+`t?ysV!Ft?X~iT%D75azOf0dJSz@^9UP7ZAi7I#t6< z;WQ-#m64=$U;otEPJR}ADG$_)L*JsrJRa^-D&mjrBYB2nkm4j8p`nx5hX#fmWDB3& zGlb=Er%>X$!zF!ECshM6ZXHqIv2C7m_R31A59@)-5lcmmOe~qT#Wnn+v+S?OATf_Z zAB%ypnLux9;6qbGvQRm3+eq|lMMlwjhyBMK(loJz0@|gTsE^Kv8PtQ?-RvA*gXsOm zMNs>&GJ9O!L0;m>+ukjDX_{x1jq*h)r+$RpKo)lEX-2lS1C5l5~JqY(U7udKV@ZXU)iGK;q*l2nAItJY?+l4C>J>UJDgUQ0?4S z&=BPmWxMYOLS6*cA8hHYlA)e@oUhcZ8s4rUQw20WX0CIWV?kvG2Eu5cq5X$+MrfgkS7Eu0ThE%=UF`++dpBjm153^cxrST` z*kea(bp$FGDUHHJrlW)vf?qUSRKr6nNqWm zDO7>*vKjraPy(a4w6j^RUKiny#RQ%ZHLA70k#G>zAjVqxfZ*WPNW6{)wx9u%jUGgP zoz7F;&Z}i*WIB=w&(IxsD;qRnmgsBnKn6GYR2_pq+IG9db;Re}GczA8SP2;-GY(P~ zY?!~Y$#i|Tw~z;3!#yBU)xsy@-rCFTpNgit-wS$d3$x{|x3cBoGXWIAQhaJD8Qzfz zcQyRMOAx2)MEM_Lq7?8$@OM;VHM2**W zzpAs`7i~$Q7PMrv0`o}CVBvQ|UeF=f(iHTtdmBys$K9nhuJaeN2*J0!nDc*!5 zLzTPUr^sO@!Yx7{VA0q+(f{{f07~ffZR`uEuH{^*2vBpOzupM32$#}&Z)Lv9L?qn| z^n^iS9jl+Ma9ZAU4s!S0!qGXYf1@8oK3w)i?#7U@BwdOc!DgAJ^r*7wck<#zBCC^V z*QYw!D_ne?oXc$8M+q(eL@SswW%!^qTl4HyF&LLt;8=o7|CAm?c>-VRWi7Oy0ra=F-r0Vc+D*L*(@Sn9rBu z*!W&ty#HI(;TfuuB>710raKwZQw3n9E4obIhS<#?vNEZ!M$HtPd^M-H6R88wTgY?a zGw_XNy*ZZkP4dAUajayErB1(7rQdjAmsa! z!;r2qG@00@?+-sIQDX|8KcA!cj$}pS`-Y69j83|`AuGf;eni-BHK*%50(~5WB`NpoI ze1~?kL(&=66R>qu4MA?FM3S}u{v3#(E!MaeiENgbuaGtoNR{!bm&Di_;4nD;d6>Yf za`BnK_C9AI6RM-HkL>={IajEILXW=wdDz+k|3pe^1pY)s`y79tlXclPQEQ}Qy>H!e zk&9w4%haEwNQ8-{AramIStQI%_mc!5U}&fO0N~!o;3-1%Q$02nFAAmZ@MA1EWoI6{ zIW4v5M)r~1H2xO-lS8G}Gy`3{{!~DRAXZq!ltY1%5|*D&hx@{-Cb}^!dX*saJU&Le zaBhNB*o`g^H5FEY;4}aTv6?z`)%@}92IimX1z~|VwQF;hxkc*FwB$(`0EXF#0jWw% zwq2iRKlrb8LpT#D#l*3bw!t6kLRz@VF5_VCP3O~ej;4<$V>a>Ekt}oxl@}jgfI5lDBqrDr%!Orwn^Xk_%Pz6R{iXg~9z*aSO zwvQzTTU>Q&kpM&EFwYXJ-(vYK(g%&q8HE<05z~%ltg%T2MZygYN{Qk=_Hj9_nU9Zd zI=rQU&L`4X5j6!c)xiE|S)Ci^pFAW>orE@^IMFi!X}Cy!Ymhsh)>+b=(TJrM4}Aw; z96j$FCFCMh!gs~-sz1>-z6|G*QwPDQN!@mXjB7d;F=&Dq>Z%EMcS9+5um1^ia!dGo z^iS>=FVG)i+0Hcj0L>IBVa9s*2%mQMvSj0HPe24l6k-$k@o+!G!a07=5QB=_0@Dy^ z>1ZGziJ`749Frlw4_8&9idoB(a==Y2ncwEb2~^V)xDS9s>Apiz!s2>l0^$t>kx@*q zcdqaab;a-bo>CN>!JQ#Lt;FYYY?;MT{}#dUal~S^7F`VP7cYSCQ$%YksHI6KJ9Uzh z*b#0wxaoT0m}_G1X;3};^xOQ&4UyuWVcQ`hTGe$Zyh?mPsNeO^>hgY29nCzDjl|NbZgHQ zw8`bOU+Wf>Mbesj=*R_C&DKDJ`zz@+bk++(f(2HBSSEe~-H#Zy7-a-DUhLO4FJ&a_ z-O8uQ6s-;PJLX=yxa!s7Ms-kl2yRqmncd82 zKMif6cte|?^p<;4y6%0;&BLeT*C$v2&scW57kzStmUAV?u6S$@HEB|*N#GI3$wLJ*wFxLln#fk4g zsQXdwBPErqh~l)>WQjDepS;D<338pJrc^AD7-O_hew#TRNCFCi5h(#$&vrQ7ASo(K zMa21Q?aoPs+!?2B_xPv5*;zth>yD4nl^yQrpJ8evnfzFVz=jQoun@J(d?lrtB;biC zJE4gb<{*wO=cXoGjSx~2aKYn1Wo8rlEkiTf2*mP0qevI;S&fFAK(cL7BILv9llJ~ zoATfO#L-f+G6Y%_H{1A`JdHK zyC^^u4>%#_hYu`ZWrgDDKBc@6Od{EcKh2`a%GTFrT(n`0jwEg$-tIy@Iw$)>d5VSd z1FaxX=#TkD@O_FI;EBIo=sv{BiwW87^g#zCUwA?7ROez)rUu6D?tDMB!mu4#lb?-w$ z`Z$_=4$VPp2+{`njNQFsm@+rT;eOuxPV>q%r{uXA>H)|dUU_&piSHwlx!9?tPLznK zi}Y`es5+tMR7&WZ0eyvU%HKnGDnFs>gpudzM)NXVT)Gm(ZGILGB~u5$5m>>-)@J>o zv;0#mG>B$@wllL#|5oLSys%l4v~4`02{?RCzNt`tde+)b>!Yr81ooCX#Yw;qivsY% zLp6)Mm-!H?*#Q8Ts7{bx6Bfo7>fb_5DYdR4<28ad+LbkLT>zWNZEuy-{9b{|G7pCgnKax?u~JihTv)tpBoj_LCCCk!KL z8I+qrM1mPo(*0TC^E53RqC_~}*q;G3nC$zzxpSh^a@G()VNEmRkDnXuivF!mgpbIs zX=#0>MH!z3_-a5>Axu4S#}nlQF__AYY&SMt3b#6eGBFeHKQ4!Xg5zz;Ygu4@#uT?D z+S;}%jGm6_&x9%IN1a3RS8a==jf>4!3`r_vE!*_I^JeD3mA|d0_K;NCjdAp`1n%xe zGA%cUNE!Gwn@yOKSrF-D|16(pTY{933@CPptQJH_3(Z$pN6=?P382MGJPNJ|U4zqX zx!W0z@@BSKct2;%S!4)(91dxkZFyA5c7PXTt*JBk-vNqMVfT#!+c+{w3xsNd2RPz$VN>3=xT8$ykKUsJ-mi#^kzrDfs)Y z6eC}B9V{z14)G7U0_X4XLsAYM2#y5%E@aZ}0`XI9dE!lku?xh{>CSo@lP*5UFSU@6 zNK#1VP&f%2>#&bJ;09QT<6roZF5e-47jsa5Q`B#NP*bRPclc5w`ZNawa!;;BmdAiXmn6N zTW|t0cOcSO31-%1=AQ{7U;+iT^dTj9M~=^Xaz!Y~_&_5GJmZwLo-H@Za@)a^)s1yx zD_|lb<*~HC;wHkUqxzFVW?x!ru~TMskl0Es-UayMi3vVZJ@w2{v9s%?T#QJFlRqk0{bWw(~aLh3;&E�k`v|mOm-b4P`YDD2LwZD=Hc?unyKznPH zB-z~0{4?dJxgpt5U;um?DgMuhV6MFSOaV0Z$aRZ)MtS_4J8`#B;-w`z6CQR-rtwAQ zpHOc4L=X*}C%CQ2NZkEgt|`#B4HU7Y;`%seh;cCJ;o#28jj#d*F%)RjN&j^7t>JBp zjHpP%hztz?^<8j(1*m6<1sADsGcqDS3Qm})L>q5-eKaJ>%^BTw=-4%T@4ekr&%4?c zk6qxIhfND|e>QQ~R8v6Fp|G;GEGfa?SwVSgb!*dR(&hcrWHfpP2-?A)48s8H(NkzB ziXN9g1r9%WdOfk$KGx|u>^rGu+uDuZJlB%Srhq%lSrOtee!5xbl=0KDq=eO!?BYBw zDq$_7?~u{x;cf{_3?{4}LF0>d1Ki#lp$*ahi2CJzUTxEfUQ>T!zZQ|lJ^IbA3|CFB z^eIzh5dK+c(@=k+Kx`|rU5uYV-EevSA+eUir13}#Ce{6XT~K(!$NZ%+tPK&ljSgd@ z=rQMi35#l8*-)@=N3z<9ZPd?+>z$7Tim}!p2r0D12(H={FB3@ku{*kRfktV3&=?psoabMAkTYr%!rU$3L3csx)(}jfLImBs5r#k5BUzEl_>f zAhOJ61Ks*%^vjH-(GzyWMd}2e^@p=kN_X;4gb#)v^mKLyuSs1j8{VGHr?LLQsGsdx z#>a+nXf7PlMNaccpg4zI| znze6dO9ofVXxx8NcGJzYJlU*)DLe6fZMFqv6Pc)q9e7&UY^!rJvoIS^oSj6@m>~F^ zdbN7N{t(ddWvkf85(EWmANJg2q!T%57psj(Z~fj)wPlB}KR(5Cn*?1eH=7Re%QnOp zl#a=&VA8{Skyh%gM47D?uqBB}Wx@U}Dj#{AgG%NuTs=8G?VMTm@&12}l`V}}C)CqN zUTO~z!xWITKFsy`#Lb#iu9ACI6aOwZ96yO+w?(da!uU!>(xvuSBpMz!cnQ22liSxX zGnkzWeskcp(m2G~->)ZFcz~&Rf~nck})4Cjd^^^oh6i{rmtAA&E63xAOT) zDF}Frs@TY>+qP1lDK7U1KKW(#SA=f0$_AClO4K=+D#tbVUmszTqmtC`zF-zcclyMT zebVO*t(JMgEhi`1w8s(>mueC#F|cT{wVCJfx~J8!#fH3oOWbv5|)!}EM!ZUP~DawULmhag$nAmgA~Ei`K`!uaqa>zhKOM( zk^5t->{%9~57LJ@2($!CD*C*E-N1Q3%A(lZpmI*QZSq&mxbvQc}BZ$yt}t=LL>M9!@eh zHM3KX>G5V&9^QTMahWu1mOahEkK|*=;b+`RRlw~yUrd_4~w!(%n}l`EKx zY+Y#wI6m~evDm^nzRIpFnS$$}34PEqs|hHKp4QkXKU$>z#Q14QL5!6^g$~1h+L7GA z120_-8reA$$YJ<^bOXouOM@ZZ0^{^2H^G82$ZX*b&#jnIZtrJ?*Euo$0Y46ih0o}v zTHracOYsj8MV}Hpn}Vqt`?&i8*i`<3Zl03B9VyNgd-*;d9j2>4qu^#S0Wqr8X+#fI z`@&4X3E(HU;iZ2HWJ2O=Tw=bGrYnXN%y4xZsfof~*y9-(O9+35{Zk)+_w_t3bKnE> zh#?(#4%^M4ApB-Or`~=FFYvrO%=SnI{$)E@1#AO$FAl~utZG|Y-d<4O!ILm##@1&P zdT(eR$&a#|MyRL!qOO~|2Dy4y8a(^9KBVFm^7%JYornqglS6a7>ciZ8%-s+ElUW70 z1@dWH4TSA7VA@y}rK*`?VmqI0sfn@ohME#jaN_R7dgd2A` zH=Fm2f5@H%wnP&aO!B27Ol%>1LIT|m5N#UJ6+;DWz(Kp&(eeE`@o4(aIws`D|0@k3 z_w77@^sLQ@adAV&*;}1}pRB(^wM!OH7t{YlHcf+sCx9x7ih~iAJ3>n0?$6@wDxozI zQyKstS=3&v+*~KUxWbxee@q`R8<1eO1!Wh+%v<(P3oJGluUAMRHvz5W$WzEB`4K+p zQjq%Ou{OzR{OEBeWLuP@KFsB%Gn#eNp942+*`3ApqvV|yv>^$S&@~tIQu<|r7>tEj zjG{XfRj1CCHd5SFf93uR_G0He4hW)up3dA&Q}WqxrOxS!{Ml{M4-?sKi<~CBkRL$( zi|`NSl4XjBG{XcGF@U`iVe0L;xguj8a_2^R5E8`26o6HWt-7sy(_v8%A;vq@ZUYP6 z)G8p*eVge4FUhYNQ3u$e6_mIXV^vu6b8kyE-j+2Ty9vzDY18!b_};kz>zvhEcg4Sd zuyEb>i%4xNSdCkf6hsO?XxcB3-ySnXW*{QPKc9(!hVPyV0o87HraAqtp+%k&{mSt> z%Ph9_+`;YU@t1C-)XH7-^x#$tsddsuBFrC$)9yE3WPb(V2>^&^dFurI3kPwmK+kc7 z8RWW~wzfMc4;-I8J|Tsy?Xdma9Ad$}{cx#TA}|6W`#=GPeIZzWvJ3I|bsuzOjVA1^ zk2^@IixjHU=Eaqc%BJF~oAq$uxMl(Glvc(Zu>j+nkQXb^F5>#9l8(SxJA8B1#FG!5=I$)9)OI;xPDW`V&myIFWgL*N z*=>sifI3m>wgg20JxWB=FF9WU*)o-AH*vngkOkFEFW*8v>?SLmaUZP_&*XW&a*9%0 zSB3^F%zLJR*{XjOy2L$t2f<9aX0+f zfU)-~5hHbY6Yi<$&7u4xclR^CSnx?}sCUpx#0d~#MDTXIsDC0~Jgtimmn1FHA5y)&fHOYf79vIg zWsPFf&%3bZOR^H880S8Y4F{j_FB5dBt9d;uxQK|*&#v97=yUslYIeZMJ@f>DJ z`<7H#mg)}~#2_GWn%OV~EA9yG+Z!~C3Wi*JniX_E-?k{Wd3pms9nKh#yZieB4$qOR zNpwOjGcYEE5Fm$Q~;TQs)r7nzsEcu1H&BHN^?BQ0w0%TXF{ zZIbr5KB#>ID=&0nqA1v=o^rOrqkbq!6L;@6thTEYlDd^VsaErZrCm(FELN2U7^6v! zN>TSHaTA4Fv>SuE`!XWGf*XU@XuPE8J^p-~+M_nI`#hJl*WE}_Qv5NitHjNjcrY{o z`t*o@CgJXd^zB&zlx2}fIjNInp(h+yP~6+{$-;srsPQP!gNghJfZ|Am`@6B9FxTWb z=gfGSvgn2nlT6IS?#2lLccc`RGB|J1II< zEhUoun^n~^G`~TP+YP@!_~rBl`bDJU>A0n%^tsdRQTR*<;iPZwaqlW+@3=U9@`#zhDMhAoBfqt0!H zM@XBNKKl#j6D*`B#jk-f_3*t)g5UJ?%9>KVTBy#7RxP{lDYFjKxlH?q58UvF_ z3sV;0+FXX;1U(KHKb4W(@u8Ch97V71^q<~Z0A$u4e4$hD#5rv|E-dY~r&zjaijBrr zE-Q)ef3yj=q;V~{g&W|X1h2NBjJ3dgg>VT-BJao4R}@m7ByoW9y=GU4S?*u%kz|~3 zXVu!ciwgqE$FH@UfJ>Bhh(QMe!0)fC`pg-1L6H+HPdW6AgOz|DvTfT^>ni0+ z8YPz($!|TMrZG+t)225}g#sO=4vgz2sz+CF;*K@t-TtQt`Oe65E83(5vJWXZR@9y45ie5#BM^mv0-sDVf9YM)NWb%_tv?p*KBx znRKV(^R!=Pb<4YzfX!)NlcH&fyR)~7?{^#d15=%eL^Lh=r&w!A&$_%l4Gd6_UdZHh zwO%mHlT^boC+fJv&%($}CM1Wa4v3F~A4O6yyzUT(7ooL!szVD=`z3p;hb^MF87OU0 zjMqXE8=V=zoV^R*-7VvwhI>Tb5F52og4#qO?Pl*T-Cx`tUW#ar-8>rW-bEE882rTF zD&@C=6&laqBWsu&!}b-!(&7^iJs<(ON;ItNT40T%`V)3~5j20d#6|s32%(VSdgAcQ zD^Q4T!?G-H8c8zf8LshNC8UVkll3R?lqC+m=oOpiLpjO)B&^fbRcjFqAN?d2vx63lZMCG=dB%lI&^OU{jm1tHShf?%z!Hd}YJg;V}Jb(&~`b4pCeBw`!hcgL6 z2A=!Ucu#zvM(P`OKQGe=Y+EYzyCAwf42-_qpe08$^7c>Ept+1qYgLyOQ>!^qXgR@=TFx~{x}qT9{$Mq{c< zg|2{?M5oMU%$8w{pM%S%TviFzP3Am-+kOZF=pXC1U=!RiaC+`-q@gQz{Z8Ll1lP5Z zJVYbNE_l*rThBV@ki6EbHKCtKZFtQppNWXRWr2Vw^kDD4@T|-((6nZ-&TkV+iw9h04}$c;~&}A7<3yFl^TQpZXjqo4Fcl-KGzb6$0`y zequFxd~Y|O_J^Wv#?vG9w%W9|#q<;oPCQguK@=r=Y^p@>-sv)|rww#|-eBVvpJtfm zI$l3LH3wG!%zQPb7cvrqi7hRYhy83q(~(irVoPU|*Ep)5n?p$-zTSP>&>{sxYByFS zJqe+Y%496O000f2NklrO?RkYZ5fQ|)d*k-TFl&@s*qYF zwctX+ORP>Q_`P~*YoB*boomRv{zCihr%iP<4iVK_rps&z?VcKZ34W4T{odC%VRbvE zvSPXt(^|yDqN+MjjP>97V>I=T`&Y9z_33Jw{r>6Ils~Z}3WjV7oq!LH`(@ee%0}7= zR>Wn*YwwJw|%bKb{%4M__=e&fi&-8p#uSv9d zlreB3hsOdxO?*`;I+A9qO7)I$-a7!ly4zv#pNjP~_IsGvThWCE?h3CVrF%t_Zl9@adx1XkbpGP9jG;LVajY=4eF&rY z=}P-$LbV#gCkc|%8Oq_Y)v_{S(QApoBn%nJEnmrm652+>f~@i) zWF%Pf9%<@9e}I?W!u|@XzghCs;J7-+@32{M5|bUtsZN2)q(!J6K{eBfaCgNQj#oU5 zCA}00O)|c@q!PpJy%IGn$anLoHD}@tLEI+gAw4$4Lhg2mqA)HIjXZMTKvR--WN2}P z;wPB??#eF)62UI0BK`&7_ak9K!y{6I9*&F%xLIoGW-dZ;sy|`z6Qs05t|`geTiput zX%Q$j?u{jhN0K&bX>ox&ZmLk)9geGn?Abt{X+*5V^bi ztQ=vq)C;$AoiCeo%e)6?GBWjn-cKkmg(ydRl{xJ=d4`G@yOd(aWS0h{)JHOq{Tktx z3Tdwmz=aIO%#iVloYx}mgIng*!)@grZJrSUYzx`jG?8SY_BH-MXy)F1Lzfqm55mL( zf&s!O;2pfA(v9I5wIwi&W*M(oa8q!GO89w{uqK2L`>OO$%it}s6qxcLo$Voox!Bz| zc1c1`jA&R%fFv5A^im~>eiq1aGRS?%V@1RTakUE3@GWgw0)8iX(2#$EVVTW8D(tol zN&?=@_~h&8y1#Yyf@|HRucW9(SdIzubMY51!?jIq)s0Y)PeL{f0M|pU{@y=kany0ZM&{A@x41*qE(h~JQkurfY*|z0P zFspSY7N=2jj7rLIQYZ3$CZBHGYn^XiWcI?@EP?;jfG`@*Nn#ikkb5~s#c109U5nkl zR*QxzZsBW5N6U-vnwz#7Nu&WjNRE1UqZfLYH;VMPsam8BHUjIKoX5f7aSV%QScwLH zFiCevmrdMa6xE1*=2NCuQJz7WY->@OYkkw+8VBnsljG$gmn*9w2|M0 zMk%;&iNi};>*FJ}iJ3<6|IO%^{J;YQa$f1RQ4yd7!?jPuw+nbq) zeL03fad*f-`<}@&#_#u$o#7-S@KjFkB4a~&!3|h8~FI#PyIt+?uD>y>& z8Rr7Kr&8RjMPc6XjkRbdtFgs{!eVVp3Y;yq3P!fW`j=kqC}%H5?x!)Zf%9FmICJ+Q zJA(@TnUA_ibBY&iwWeVicmJqm8}3+bm|IjSQY=iEKPkDyw=-}bu9@`@RY)ZTE7G)4 zf{-FgXcO}v>uSXCyV`HiqDIbFc;8c?Y)zbB8&a<{QI<4)V~J@Txr~X@K+73Qimw`| zGZ2Tp=CqT!E_3{GvY5s{y09dBrnH%PzLP)HY+iCV{_=2wg)Wz*?WSmwqgC*ZZ zTMNaeAVQxl7w=#7-8oTuWn5T-p`j zc+6SJRuvSz`_ctZm+)iMjyplrdU8Dc3aQHN615FLVp3=FV&wZeiCU^ zp4%pplhrrBBs0pSf7Ot8VlOD?%I>_nf?a7#vSA3R&e%@VXeB*iwaXV(FGg_c=ED}j zZKRkwu=8Kr4oTN&)=)*{JHh8+6uR2v5TAFtX5}VZ)7qY0AAO%7+5QUKvVYN@E zDp(Whv9s9piQ$xZXc#TO+ToHuDsx*@7&ZAG4Cx@Q5GipbNo%T0ne}3|!KJGg zla-u2{UqTu375A5!)HmsIxd8!E)d{`^je`T6-NbO0wah7Aw6ZgwuJzy6Ct7%de#<6 zF~0>y)7z*=GyMkG2xTTu)X&zua8Gnmsju6zWZi1bW$V#IqF^$yV3mCv_p?#!6G#|= zTpASWlKkd+(k>oH1CZV@r#Lcj0u5kar&g&sg!7eFx4Bl5O$1`=`~8*rx`;;@kP5~H z@IJrQ3H1!%A3+gL{<-?**R4mD%CNdhEO!fidsz2GB$3uhdOocot?%>Ku19@NKQDA5 zqO_WY99GKn+LL0H)+=W3ee2OcQSS}6>J5qyD&Pl$#S}<>G~zW|ebWpxS6#g*P|!mB zP|9)B^0ozL%yjZ<0Bphtdwp-;t-}D+Cmu*nNcZ71FJm%sBm+xh>~^hC-uu+0m2GBB zA%I_nvQrvi(Ly0$eNW%pqGkl0kZzjDubI^5LFg!L?ykL{D>-!qXOWzRDsP3*LOiNdIATd}T*v&|KIaBUVHApwlxG!j2qopJcLt8ZSZk7i5vaU4^n zRo*sRtzNUBE6sHi5iWpngFbI0PZ0clt2M7V*Nuo6{ezCP(P zd19PyK~!UX&#v4@RVM1v=eL>}+)e||_5J#GdPcMXYJr_k--=ezZ|2lRX53ys8$_qp z{mpMNjkNtSN_GxdzqCHq4 z=nJmC`K_P2JwI5x=Crp{k9PVFt8d;;YGl^}WxdvGz1C~J)@!}iYrWQMz1C~J)@!}i mYrWQMz1C~J)@!{kcKv@2to68AC~k)U0000Z&pGOccC~~z8d4<2t-GgZ4y~*7 zNmq9dYLSQDmpriUwAF?#Hs_JmR|n4WeK)sbulxk4M^`hkAMPU0k409o{V-D=2D{Q9 z_Gv&YS!dsUP)T8D1u^CAimpSj#vepKzWexVM_uvH!}K2k?U`@ie|6gu)!N+rx^cHG zJZJh8Zws8d)7x~OUH#l4x+1cR7q`lI+|Sl$fOwux`Q$<5NAZxm`q`hzr|OvC#=XjR zmH2d9Nm%A$Eci+6emMASjAYP3_-)c-Bjk9jt!33)sHA2x!t(C*yD*B0Q}0Gcc6Gl7 zF8v{;t+pR?YcqMhl0)vgPQSISXs8%?^1rxMyG(iZClabLf|1ao2fo}xFG|@>+ddKa ze`83KUTI1weM7f7Vs!&bKF{P|Is3RL;7P}v*kic+?TJNy{aEN;Nq>E1i|ReOylR#Z zI-xY-)XB(=L-}i}UB9!B1_A!9KXyO2!(kMC>AdY)(#r0=Au*mkSF+tohK;x;ZWM;7 zjz5qEpr0NLnX1wv;wzU&zEj0jh~#y9iNxKk{3-!6U)zjBmL9}|{!Z`y=ThFT9>a&U zYpcdciRq>4FX{0yrirSZpOXM#rQ6!pWo6cfIkDDE4U^V33h4BVkj)`C}) zHV%5;$9ao!@#`IY3*!_0#O5zQp^})8%)PQG7!epQtx?GEjkUtKF0J0PmeVjW`I(f# z!&$XByL>h8rpn9OOJA7jc7Dzgt5@lE#?-Llc5%sH{xGt@Q{wOOfT|_8S~@uV)u2$g zrtfF=tx3eDi>jc7sr>ub8+#;hI?R#q!NT zX9^MRkY2?3n&8D(&Df8NpGvH(={XFnRL(O;5C=+6&9BBC91a&WPf1DV6_@X97u%p( z8iK9_Ul^U|5G%BQ%zXS|F*dp&JEB-UJH!MGE6>W=P_4;juvp$w{yZbK=(+XNZ9$Hk zsGNS3eGb#wOHY*a_|wK0uB23tZs16;qn0bnyF$WW?Cf}qH_%+}K60L#)?q_13?iX* z*0jai?FjpcfYY$>x=L@#&SHB3=m>*!0?##9EVvoE^T%3r;1RBL#SA`D4Y`K&zzr4>^isU%fve#aeU822F%3GpF&>#41v?XCy(XljEG{Yoaq>uH(ls(zk%dy>Ig}@U|5l$It<0b}#Zvf`bsS!hx#>__fZm={eJ;}Z*4$90vv+V| z#zPg+HtV5=;b#oL^7>IR_1vtluK9vLz^zsQ<;{}f-V3DO@Vx{oB3EuNId$qrjFT^$ z%P{y$+`BND6xtVnnx4|VxP0$ISuv<}y^U}|T<8!@cuFgy*|O}!msnm4zHlRVdVc3R zsHsPgE{bxgSAS-J|D~MU=fZ$o(`tbz-KyI=8t+(4rXxuI1Rzv*>OJrapan-2GW}vJ z8Ko|h$R-n|@;yaD7rh&9YBeXOu7&$sa%=TYktV*$V#Du8$OLeW)V*wuX*JWNW-)yT zX$p{`x0G&6FAtOty$D?uNHU8ZCuv4LG!<{jG?~@-MQ)w!cI5jQZ~W3alxpDKid!15 zd9x0WnRce9cqCy)(Ss0W7$`wsU^mu$ne=UxyyDEj9(vLyv*={`_7^TWjy0K$T@+j3 z#b_$OD678qe|r2^Rwy(j|(H5y)X zV@GvtiM$-0GNiUk#dr)4(=fs$G-+gU2@^%#^xo6u?XSM9B`Pzg?oxRNaE0L)F^^Q8 zwU(g|iQDrdbMg23Q}#)gQVto_()Un&9r5yRavOM;(rBqq9efgk!aiHBj*LC5neNq0 z*nCtM#%Ax9O|jR+q!ZIco+q!)tWeACC0h|=lKN= zm4LXza*xh$Y8{}e`GSR>0Cfi;NEchxK?d1&PZ7ufR2$y643RE}<0XDId5lE$M&g84 zR7&(sNTo733N7&KkB?VkIVY~`sW0CEJOP&I?6Q~$>N?`~^bI`27ThZb*E<4R=CcvZks;id5>7~jPKDUd5WQLY^W+Zh@fJOu{=m)Vv5{r9d z5At{DBjNHzDC3piO?>0JfD_OP{Y7JmG#aCwk^%By8@w5WsGj8gg}ucY4Hx9KK6e+st`1qo&M zxFALAZL`8Eif9QRVkf5}Jm zJ3AMXRp)aHQs){I0<>-FpUE%oirfUFx5!HhkpIBzmu%hmab7E+&u_{8^T?Q}xbS2> z$4kRD?kzOt63ab751H~&^k;XTt40K`gIb}}J#Hr8{cwuCi;XIA6{bgM;`^@h7)c6I zgm?oW{Lwn2K#s?wE(VEp&}Xtrga~ODo^q%h>8QNv)T-aLvEh(jaiXxu8PpN?;EzqiY_&%<{1HI07-e*$ zjyb!?^V;d4L{;Jo$|Tt7*PJjN{mik3?uK9^k#kK~59B^$%gT)KlMHH<#0O&31%*tS z9+Fl<7~?zaa4~pz{R2F(j*8y2zqpV9pCJeS;X<6RB!^MP(jxQAtKUBcU$^So{hHe; zsK0&dwPWIhk>1{Kii?^>_$fAodoy522Or!rv-r`Lc$E1N+M!29pAsk2q|>wGMYQHS zDiR}$^TUlX2rENyJmzM0fff4MY5e^>agcD7dYM9AR13BCwdy;9v~M^&pJgIj#^KDG zHd8pZjH|y*;6_i3Oy!K*s6?&z+*#Fh2#_z(AABTQ*RQ#a| zR%#T8&_mnCAbp-)%{loCeGlzX;v0WT6l&TpbIzbJ!eCu#CuW)evEl7>to;DAwVTxR z+=pTsRH7>gfOLzv$6FB+IDy43za+yr5(Nvp8y5_P+j-@*H12E1xwjF*-KvrwK#6U2 zRNVW^94YM5AnF889TV=>fH1B6oy5bJX^3LdjQvTia}{jASI)t>4oV{j4PjGq^tk?Unno?@2Qd2&68x$yXkxx@!xw1dPWvmXYES1hBdRjC4}p zNOvpd`88dX?M^ELL>Z|fFGa@h)t5zw=@ z`p9w8B7ZxJO|82HK;&2?IasBog_a^5y3F$)#%NjJRItt;ohG#OlCjy3<5EzV&eSk* zVlsHAs(F@1w@0GBudeKOahz&jv9|oaJ(F-(m9|{*B@fyDuJI!reHq)bTIZXDIHa)& z*Vnql+)Gs`DVRI!d_@n@%PK*i4!aNd3o3d7?Nwch`N@t(^NdAbX@&xvWaipt8y)M@ z97Gyppg(-4uTbm2*~luS{jwdc_#0x0zzKGz(-rgSwFOo0tFkZb@y!Np|m z(c+lLqtW(v6`m|OZKh#-N06C0B8ID`L5|?4*sftE(%*aFZ@R(>R(xXu&R z&3rp@C+ppkkI$ss&27D%tAnIZyI1SdZ8ONzcejzsm>gI7{cqmD@y7b72F`Hu*P$13 z-R^1IY9B0QDJB}QHd-d!GY5QLq;N@)7;*h_^pncH)@XZ}@)NP3AnB@Z#4H>0i#=vH zmLgycj-o_6npR)PXT|O_YV72$v1+_~^m_dw0@?D?ob1(NpPP|%E8Wk7A8Z36gRinj z`Dk_DZ&{>WZM1~&={bKi`gy(^huxJ-s2pGy3h*Q$C)Y{nY2Ra9pIplg7SJeS++@93 z*a6Ep`y8UY3+53L zugY1*(?dZ$gt)WsoUj6ym9CQX)1l}GQ^IE>*4J%xeU!0cvzGWpkjY&*hSso-H9pT@ zJ-rn>{7d-udppd+l*{eVh)R5Nhnp~7z}(dpasAJN*`1z~#Uu5oGwPzgs&(13@6$uB znJo)8OVB4n`MWgOyj^1-_=EeBI%# zWdj-#h%fun!6)t;2HLxo#8cl7kiZ+K%R;TY|fmxobTe~%H83w&42GJqPuK-f;1k{X*-RsKL+&h_r-kL3u+g9 z4MIj@N&5*W`9{O9c=0J5wG|OLrv6>$>(rV$d4J71uGMRaV+Ptclh#rW1WRv5t}etQ zX4*f|?-}sxB7KbwemuB!L%2{9u~O@;w2c-Rr!mo<5XKLDDawvpCXqur(D!x8?GyA{ zZRisXL4^06k6wJM<^3z{)e+WY+({ME(IV7^(B5{^^&|3;r&Tk92((>Un|3kMIBA%eV}oouJNu1iI(xM=P&Gtxd;)m+K=jQrkucg&LN@ZorO!{9 zPp}nd_#74UGy-Bo&Nl0UmriU6dIZ50CsYAK5^T&I!zl^*Gy?nkna$sij0J{Uj>q;s zI1?iJygp^*7lSi-LL#g}LVt}vtt>|Jp~rGg zwkj_7tTEhw;8bo?b>IU6bw9$paY}x_6X9z?9R^|0I&J7Lk-2C)|4(q8df8eHhsP$1 z_L*>x7HjVv?ijEPw-e62bfSUq4~reWt~zR$0mEd5CxdYcKjZIfLwv|Rg!3GR5D*(g z#?ts3W^^af53QPBqa-y^uxEL zq?GZ!fbZa_)8HsEG4W+qoP0%Qke*hLt7URh5_Dp``bSfti3SP^iXtRk+DOyR5quEo z+%-DZItmT;@D_)BIvN`f9UbW!?Dhx<;Q#EKSY9;0GVfKRRoM4cT3sb_?&nBh- zt+ma*pVdWCT0upzb%48po2_SGduMLOW^W(6j=YkB;_TSO?Z!&aeB)?M&Hlkb%S2gd zXt;StH;pj+kDcw͠_YU1nnsrS@@d?n4nUi4KwbLU}f9L9~)Es|r+oEE(PXWs@ zo+`FRq2WwO+D?N8W#`Wix9i8MvGsW$*uEKd8>1}eM5ao5rM5C zu0<;EK+RRZF)A;I!R3Lq~op)1F;r|6my#gO_SxI;U-k&EZ4m~r{83nIe}w`oB!;a(_5e{nEF_v5v6G}3exZ?CAh^5-5xm)7Xng+ZW5E* z#Db(sdjJ1c=T6|adm_5_>$xrXT$J~1RQL)3bpJFRIEYh=;Nyx#LHC~#by^)(WAGM_ zZ06(Zf2DPoM@gUvPK4Q0=Ko2EhUMW}EGf2|{3n6d9e*HI12pIRtM8Q&Fa6Mteyq09 zfB$PUbjOP%n1L|={cmH&OR5Lf1Ox+!p4;34i6ZW>magGHUE0*$DhJ!QC4=CUT}P+q zR+hM){~~A~n}}{jdc*oZ6AbWB4~S^e{#|r}-XgN*sPm2)9LZz380=LHh*NrL)+ zMo>tgky^An`E3*^e`T31I;>#qkk%nqvj5j1ikM}FNr&yS1|xQ9{L>CF={R<^dK|&2 zvE;;N|NN_Fh17R~hlpd*`OaY^|K#420P5?iI3So)6T)Ni;nB}+xXY1s*vW{O*oAf2 z=pSlkM!X&1leNNEJD;$Uy8nrlgsfYhL0@3@Baw|b|7Z0DvEmE7VK_hl0RJCCL?}SI zLioAc-|^KD)3f7$V#JQq@8{Ft`c3&v{+lqG@*kG)X?9pSAULWP zh{IWoP}%>9Y&Z(9)`xQsyZ{r%ikK>D_`k51i<|PkLIU=<^w}NAbU6PFG3ub>Li*pn z>G*(9q(5V^%2$T#NdU%tAzL&QrTQDs7Oa`OwdDJ3)7L2rIJkl6egE~oU9(l=TwD8} zE(H|e6suQyKyWHx?C%t~>b+RD(`M^Q6dxhbl>fAw@Um>2Hrh4Y9w9is9KTtdHv~mv z|BY-pEgW>lL!fVWlHY{)#+gr5rbF-#1o`fydWapeDNtbxB$tuDfxk>yhwF`JgcZ;R1-t_p%G zfn)~%(y9a+z#(OE;5EA5$XrpU@}F)EUwG7$Z5?k1VgPbRRgRD0Us`_92os0S-y!jO z3X=V!0~a!cEm88AY%O1qEO_e^Na+uuOZ+ekGlp{7zt7&0BLEP{itt^a{~)vOc3jXb zon6uBh!-Rq0>4~1%MkrLf)>-_9_wP|ip242Ty{nzbUX9!43FTYAJw>d?f|?fQ-OhG z`hTggK);rKIqG-i_#zdMQo$s)^iQ|jh~xR1g&G_x8=0+K98LJ|-=u#)0uaX<5er)I z!srx=Lv}5b^1k8zLw*qjlJ9$F*A8=h7XUbSTVeaV4(yWG17a3Dax`p6yWz)4Y?6Y* z#s96`dIVlOM5l#~{hH{6f+SPEMw{Nh0NUtaO7po71?=XBJNr$pHQ!q;aUc3d=acC3wZ`uP>ezi2KnuB|<76kIw+r2qn;DQ~9!@LtD|cXir5yubLtq^K5bRwazMJa>hR+Urq)4!mz5bj-NP7W|1X&UJTec@ zm_NA?%W;8r4fve;^1STiQ~#ypWQMgJ8REnapKdwpMBRda@z8}2uLhd)UhdJzhnqWd z{EZ$64qyZtafGDCew6?0`A;FPW6C5L z`%7d7Y{&Tpb31udh26h-m2Hi+`)8#WRwVjg4aCpB*nZjdQKJd}EB?ozRJi!lPt$+< z9VV}W5ie2ON=3UO?bz5@o+Os~XuE%=yx*bSaxj(7Ed%jfh5kqc% zcDaEx|At0K7tU8BRTd=!XJ0o)N3);zXIGhkDSM>urVQ~>Lsq$*H=+0qFM}s89bxys z%^<<2f7byj00@-fteL1F(n0u_0#IK(bK(GR?K%OLs!6E-Vi4-4To|$Iavd|++dI?2M@MUY*YD`( zOOA#JS_4xRnfkxhsZnvzkhc&J+Hj{OBGN$I57L(Wd=hnT`7>Wa z^dT#mcvD~8^Gs%x2iP>BE3A-c18GlVP9r@z=N~D$r@*6-UDnO#{fi49%sSiz;$Ow+ z*fr}#=t5!ds%ke`a<0W%uN`zD20w4mX_~O}2opStyFac*L&*N+uq?1S@0V|x&(M+KLJ z-PF;z_Qu3{-QPIr58#xHFus%4h2U7>A?9oXIjF=NJJH?c9@}cGj>rw{rQzr7&WE40 z!Bjk(?HoHd9b(o~ld=@S7=sHyla-o&h=gZrc3&A4&r!$}AS3xx@8w!!dDt->3Q;-&gsT#w z=*%7e@t5;$m1(dq zk-$NcVB=Jac54CA@)yAj=2P$Srv0SWw}mSUt6su) z#nh~Tj>Qkkh0bnmNR90`2O9JJaz6{mf#e(MTS^*>-U<~%1_gVcYNwc%e=WMU-|6e> z-%K_BcB3wAnAVE%XCc#s=EhT7DIR+95pmqTCZ+`~KV2}38%ek-h?bKJsvh&li7QS0cHMW?zaAK8f;F}{8;?s z<`Q|Xb9{oAUE7~lc-u}`664R>rraE?@4R>Wz+a>khn)6ir#zvmK%-yclY=)Dq|T)# zIm{i@zYTY8eDDHl07=eXt@XD@6=qql{A{xPb+_oT+nGCE__8$MFV__s$=(WA2@WMI zlIc&Cfa^WHs?5=@&6bZv8hEUaOC=agJXQ4iKFD+?%m4&)EB zz~5@Uhk{y}7Z1&=L9y-N4+(zlKpq0{h`u8Jz$tLlg?S&255{a`;2_Hai`g$u9iS3M zF0i}3>+HQ*fG;#>wCG$=vIc-y`nwaeHs`GU{r$9kKldMx@%Za1kuzeS`zq*9y}}SI zYHa$PB+SOg9|Y;gia@>0+Vc3a__lasM!IdAD70jKrs7F%@)f;SO=)4|hx19}?Fur- zy*@Bu`>|gJ6>RfCJ9G28wM(eI{F~Y=7LT8<@K5rd zu}EzWwe*8mGhpAd4U1wfHfFQd<}6Kn`p|&E?qCJH=G_tmx%%*VNVF1y+!;wTDoV}g zy0d%T6&iV;E|LBepE2xY$dxO(@LE&9AjqGV*R9mJe3Kg#_>+28i1P8g$Gl{tLM{g#!9Pa9FvV0?9^4}CX zDby&ru$YbE8xEGBI!9A!%TfdIx|)KR3pdEx>e|asW%&SoZ3m-Hhx3mzkKcqUc5ilX zNgv$_^AFwKkU<2fM$lO7z%3d~X}>Sjd@qB(MDv^RkrgU)o!&Z-I_YCvz(W-?>#Z`Q zq>#8fzP}lEN_jg!s&nU8rZg!lL0IOROu^%+D_lB1y0T|ueY24>bW*VOIp_$*M_<=} zt5|kRh#YPB6u%dJGa~kATjo~{e*uRh@R!d+1I5$%M*D;CFiLRLZxN&oq2M!D1Vuru zSUYrcX$QL}qq4En>6|S86}^4t@ClU9C5Jgb%BF0*nz;Q8_YK=>-B3ZR40acXqLo0U zpV)8xf+1-5XFmz1b}^&EY>{TF+q5UqLokp)i};^r(RsPdK(qAq8Lf2=v-dP)1xxfw~7lL==sAI@7=k(U7!vQOmgZOgA?p;UL=nIH?494%ahLzbjdjnZ_tq8sM;4UtJ;E( zGv{kizEr6HefIwGlm5$bsrjh4bvk&7A&9xvhjdceKYN?u3hNpBbBmTcb?(d%m40u$ zFRa-LnM?-)!757B{F<>-)(%2c7r>W@elTnn58y{av8y7X~iq9 z;$8Ab8&9jOj@Zv3@^YDjj-Tli+n@SN@X#W3>#3u5KD|x; zsN<2)YCfrjx;CA%^_7{=?y1aIyWz|~BX*x<-;&<;fvb+D4vXxTl`v!F0ZP@c#Wn}B zW8aiX3hu_B@mI-m5tr60G(+0^6*Ym90d0Sb(`bLVrx1R+KXVXfkhslC0x76C8A>xc zk1YYPKa??H{DJM8LU>twT^9E_O`BZB;VKH3i2JqV?;*x|#} z&e3RUXQb28Oz7qbW|3}ieC?QWIh$B`w(57+so&nl$MSV+J)|-)iUD(L$zoay zacw$v%jbA{r_8rKhwjFT>|sfdLSyko_Tt;8OC^noV$4qV;=6{~=gD{ypF8JKq1FJi z+2KF=Nu?6TVot{=fAzBC8V5aTppM*RUHZi&^alj9Yir^RX#SW&%qf9W%+P|S3u<2( zco`jT%(^!{Zdl(TdR{kuP#UO0Lkr`E1tk0q7ie7++{Dz=ldO1!1xne1^H%XC9rest zR?rLc1F+^0h{9I=>rG;NtEZy)j&1{hgf#D)`N6yvTpiyzhCPd>c6ZGiQ|Ub09`wo| z8e_w4v@Q#n5J95yy5slWVt)~1f zU@F-5dgp%b7-$vCM7@xD9D&dRR8fg-D{7g6FN89}Y849$FT*lTBS|_ulwwPmP&;N^ z%}@&&qWf;neF);`PD%lB8@!m>y*gH7%cuy`Rcs(kpXhQ8!l@xYFUj#!f45#>G*`@9 zmCO&iNqCZY!hKl5XT17|o70I~z^rHN4^5F+1>S7^)>(Q!l5p{sAKTHjoh^vPmXWA2 zdpGI~5Bg2DgOwC@N+)@j)RH(9wE(4sRK27*AlxRnGGIQtCbA3P(}fcEh-Y1AXi>Q; z-p8TMYT~PXZAyz8#zOD2hi%%k(`dN`EzPWk`sIMV^KHg6kK-e|Xp`=6vsYNZYcG?? z=T9#`mwXt$nk;77)MZ}1tOh9Q&me-A!bFA1c`~;w<7;iVWF`@$5DUme*8&ZhZfGCA za}~`!uD&SdN={^5PwS-xaylY^wA+P=?%Y)wI3%e}Q?%b%zJYh=^0HY}+-g7HZv1-1 z>92dMWW?{aU_Mz&pRkV25qK+Nz5cLP;2t*F_3Bpb)J(2}_tZ3Sntw(#YuGi_nh!w-Rw zt5Ei}goa`6kGA2kT9K!PefzV<6|6Z4u$yypb;PPLb338yaxv;AFIKQy*r)}_%LvQd zZj+Ccw1X-M>Ah06HeY^s&C4BK^-L&kqRzva1Ik!5DHaNcN>K}8?@(PUKh}Ms6|`Iv z`pedgqiAm$R_5F6($XcY_Y!OiOB5r5U(FTL-gm0|RtnK~*~0`S<=3-U>3I((TMWlJ z9~he-lJNk+_`hl^KD5wM_VIWq_m9_*Jdk;wy_YXMLv2yNtqb~W0Z2h(OF4&*@zc?@ z3-68yUu9-WbEqgf=?3BTWVE+4_V4Lv(Iu%hcN^_iKPaUKLehU_9XK2}YRf`bXU~Ne zrgw{5BiR^hOLs$TD2a3efyqYWW24~^Q@z8*Yi&2nulA#BythdK#PTLCxt4X1tA$lE zDKP^BfzxKa%q z-Wgn}g#2!|lv^B;6Ia|7GN^ae_2&L^R`tPopsMUM!J7pw&QH+X$WigwVb&e-Gp*Qr z)F`epv1kO#**IqG6giW2tH!Bn`F<=Xzw4Xh;HU{CW7gY?D;OQw@MD(LOpwP;*J6(W zu8Z3sxZd4*>44>?W$S~=vn{J0M^DCc($D)Ei}|XW-UC%daQb|5O!|Ju(2eVqHs7=g&x zpn^jzHw*^&ymr+VpFL>TmE;h^iC!`Z(W{0)Vdf&Sl8|$IytuPE+t0~5eC0WZ@)va< zya(u?F#I)5WpDj%%*L3+W4l=`xuzBbKa~24JA+tVHt5T#XRPvvHwebFDT4&aJiqbp z+~-M_Tqd_a9T9rG&_^A1Z@{gYILp^?wPQi%P+4YIk6_iua&a313-RP7*I*3XGzx5% z9yczapoO;y20*~L!)8LPaP?umeky0!7)ICb??t{@XAnaCNh-krHobi%*QBi! zl83pt$(P_U6Iw@h2~OFvMFR8b7=x+~r?1-TP~%Lhh`if-_}xu@+RBMSV_dx*NXNim zd(+H8(`s;9C9++4Wd+omZ)5HYE-qx|w>w-OID=!1*vCWi4VXkoGFdPN+%}US?U@r6^|ClxXJh^Wux9 z+>8*!H^JO6iHQ0om+@m%ZjE}Mc(Kn~0P$EAgXa%U7DbK6vu47=lK$To@jNbDWeSB2 z$OBb?V6Xn?j5i>=Ag&%t46t;tD$_)~Ag$KGz`2V=cr8}Rni1V@iUTuHbknAmrU#Y{ z+6{qy%t4qS9W#({*-Ars|8B8PDvf4e{L%AS%NGN7yW}wt-v)8ONXpYi`DCgrkRYxD z3Tq=BdMP={gIbVKQ{?7dy+OKJkrCO|kOC; zZq}D#d=5#ZTR%xQHN!-^*QqLj^puU42th3HAHR7HIE{*b&mlMB4P=`T*HosOy6OJi z92jE^t=J-;Z1UjLirjW&3HJuckV*{d9$`G}a( z!3kY5JQqW>^M=)o=|VqY2Et+j#xgAYUaj|aeT?B+Q1usT@NN-@dQ#%;Ls$Uxmw(%u`NZg{1*jNa#Z-vWRB`b)XE=ck zYCm|^NwA#jTE&hrhErKEF!oD<{cI13HkT3`EQEMhU2A^Y z4vQ)NoM?G|>yVU3V6#9zN*!x8z=4Ijr_6z{#cjB==m@9OEV;D*oo$B^uK(&d>Lpl0 zG@x^$rUKb!M&+3XOT*uvODgk+vk}Gh zYS6Rh@@k?$N#prEz^@T>)%HPpz*DEXD*X8?+=Pij1QSUM7cPB5kF?uS;gxg=e>PSp za${L`p&C(#N)6ZJTb3tX;H9sj%f|f~^Q#wgNZyCei&L&j@eE#%RJJl&90rL!3e*VEx9rEQS;FgjFxQ*NFr=a<c9*Ps zwOt9|8D>cbz(?HPx@8vMYXn1p!v=TOPfj-+Ps(Zo^yDZH9%ymFFff9hZh~q;2L~yK z#~R9j{HB?%ouQrLZxVu5M09~D>A{K%xD0$pAJ+G0sJ*<@I~FTyK$B#sZtFU(BHIxBj==a;gt%b76n~oT?!(GR=XBY6Svd&D71GzmwJ8#i>w>8tl4z%HT885Kx`WQ~ z-8|V2Wtcdtg|P+C`JRD;cpW3GpFrJ}$1csskMs<(_|akZD?5+5wY54WqZ>+5GV zLkNzFU7a~KdM@OAnGKwpB-BoLNuxp?kE|IJW@a1F8)vBe%Mz#a`t#B50h-Im8!os{ zg^;D7drUIV3!3R{f{%%1Y{OQxo3-3-3k{5qEM!DAXH$s=k7$G|Rz%&}5Vhn0NLJFG zA=jrZ%HA|-OIbJsZp)wfSDyk};P%-fzL3tNpIpYh;kqne(NaR?048h+B*yqfF+N5N zmW8~cU_|rzSjx6(`>S@^T95D^9TPba$SE``B6fE!!lD67j6u z6;Ei;;&wR?AK%7kOVGMUAnSxEl!&(1BR)SeK;7oWLl^N_WFQ|JtcYCtr1Z^U1WXK` z^bg=;>sp1@`E&n-p-6$xjG3 z%gh_4QBg2dOVK`kufn(Y&Q37ned$IcxC_GELL2d-b$YFZ@$jbkIn5Xie19%J)4-f< z9H{yc3bUBX0o|2-acY(3j{ZJx<2b@vfwH_f$8a!9TX~$oEI65&*9VmaMOaWw$zA@R z3Meap6h**V+($)-NbJB^AALlwA_#!?je)6@?OC^zaJd5$EH6AkFbo22n6%&b-aS0l z;R=HoJ!T;oU?YO_eMCrBJZL&Z*hrQ$BM~x?-?!RfqSi(91)!K$NY}iwB@CrPn_%m7VUZOVC6|#h-0V$9aBQGVt9|mwNGLr?{>^&Ka!T44rP+$JiSN+b6BL zjv9e1nduOwELet(UGAjV2rVa(8drl+?UnIR?Pxo`@SFh#d~VrSnAfh^l6b;XL+gUf z0mwP%TFHylNoQS*7Gsn!qE~~URf_?7cYhKgO&R4fD!Qw6CN{L@t0=DJ#Lge^3*G@9 z(%#xGgp^;zN{ix01H!FTkq`yqGl@TxWk-;1+X7s`!~io87*Yd+h%>P$ip6M9alby< zhl0zss_G5mOvr#fR)<`h0*Ne&SUlaw^$4JT&kWk*YgS6sZ$Z|{@Lcc2Q_<6gCdBF@ zmgE|2CO;~O+yG?f;S=g*l)|mCAh}BEh#3MMIZHH2)phzHsOc`0W;tw|&+l7k-EtKq z0o5FIhYT`FXWlbzr|KX2#eFv2fB^E8KH0kt(2P|r^$a@;AlgLQ6k$MF5W>xs#zEPe z;0%t)j}l{%_MN1Z?33kz;|s+MZ$_c?T4I7Ai;~Yf*>h)^1%tVOwY)y@$ksE{u2erX#@F? zH)Ey?XGKQv&!;B*sX~X($7x;+LGh_t(TxP82nEu`l zi<{aNV8j3!>;XWY-PzdTU10n{QCz#X*x|*qtf0usaJse_Mfia7`~@!Gk7khTGE&E zWHgH_LRl@3uaz|wNhb+#-FzFsn2E&huo|8at8YLs$DBeZR_l*VUPtIY_Gq%DXD=uVy(c8Lse5Z8-y`O zi*8@4A*a~^m!+iXx5JSendvaN%wbvo=__Xx7q=1c$09uQKfz}p{V~1iGP4T5P)-82 z*Ig|@4$jsuw2E_PofkrxZOT~7n&cA)Vp z1i2Qy=!XpMec zH0jj#D47}$t;JQ2uB#CEeLX)VJ-sgeTfisr!A@o zn?6+0C-_lE+E6Lw1yboFha*-(qP4_1OSRgjoU;7I8^?ehKruGB7g<}zHF)?PlaDz7 zaf$XT`S_RY9zh;)B_pp=t5jFboD4Ocq$xYLKhs&NON0MY`Vn|M8UIeOi9hd)EzC#% zChQ8!6cjBKn>mc`5=`6wj`9S-v>Ii)XZXd$S2OsPBzh}xdt2P07jMoA*3`?o@xSml z1;-LRzwDae<{~BOFd6NYCmq`w5K?@hpJSxh7S0G0e?ARoQNjwQ@CUxz3tUbX6K&qB z*BVQeh`b=i}tXHWeAWS5Ekc8Vx*SxZHkV4uWW5X6PHi%y3?_u^0h1)^zhtwe!) z`#V)s{8LVdz}>q~yIA$qC*DWvw&TO`<%sOBI0IP=OY76BAvJ{JP<>ITTref9^_S7k z92Ph#X=I1hQnYXPgNYVkZwm(y)D)WgW?KNTcS%X`>bjJq08!?SFg_FKl;H&7mr4K^ zSQFQsq}3aPTNOR%Xvp!!P~^bAewyPA7tgL`T1(u@|@ z;}y%hkyQQft}Jmj1wMFfYm_aBLSbFpSbSJS_m>&Z1zwK`x43!IDG#Qu*^JsIM7Qxi zR;4h$oT|)-lahh`u^g#<*l92NgR7HJ7S=7NpE`3zC<7~y9Wm_|0Jo^+bCg=2!L4SM zm`n}AN<)qLKbo$>q3P~>(hqiBfj4^@D$|=D-Nj zey7tdD^r;;ptqt9<`Atb4dNitUnA-R39EXMSkW5ckfa;A;YzC1ppjK1L5UZ+{CXbASyIG_ zUlc!qXRG$;5>Xhj2t|?BU%^MR{EiIvHiV-+(Yt02G7U|9A3z>L3;GB~dYWRU!2*0bx3W>ORgVz#QCGH39Q-V_Cs{n|W8Y zDq8$%i4EQ=(NRe1t!g`}4%eTA)7=NNI8bf1iVm=*lV>2=rGi(I)2-^uiG15B10mfrAeMzk1yU@X~t;$#Isvm_+X zqd=>~O5(3eF8TwcJyH*h6g*>D{Bd>3C%oRG-x{}7XgO0(Au&4mf#=2iINO1v{HO`e>1Mlyvso4gU2@y zQH;(v(vhFc;&QQH#7>kIocc)IwrF+nA0f|{s|YbrB`%0;%i_zKd&#Z}i3}~aIpw#) zFUQ{xJtn68RQ5-Iaw@+YR&hvWYc5r2s?@*eceU(>UKli+CX?| z)v<7lC^RF(_RBR$OIj0=%hJZEtao38CheUPE}I(c@;2 zaOx{LJ82n_6A|EmW8^0vH}zM1iiwO{vhQ@H0LVZHHDFzDwQPIqt>!7L;V##invm54 z_wAV(r~2@*f7YD#rro?U(DA+uibqzjTAaWC=Ctr&UOk8Kh;aT4g6`OH$jCb?FPWnn z>c(LdEN0fCz)E9!>;sGDN$?4G0|K7JTClDgliLJTdV3J0rZ5rFl(C$lOVpZ2u~*&* zoE`a@W-jlf6*PwFz}cn}+G-d5^)L{dIdd^l^I#Kclc4f6!R1SE+7rtxcF)y&%8`WH z_9(4>N9#GJRexZ8!0A~X|IIov4;MUzz6dM$gt98b!4=QW8@j{aF2vw%PT#S_!h$+<&;muCeHMt6QF@GDq9PK$?C_18}f@zT|5B_FVp{k zE|F=5EAL`!azUs{cXG`M>R{ms8tGKr7+lP|QSUA{!Uhj1r=G}3)^D%dfQkp z0_SKZE*_~!MiVLq$u08kZUY<&jnBeCp|(O72!-Oeks+!}jLUNKdIjyQc|swaT%2-~ zKE*id{ybx(t!@xCoF9)vPQTnz9;?K5*v+!QtPh(UCSEAc zTA5l=tG8s>kKvu`Ph_$@YE$VbWzYL27UVV0nrMOq{-Ar;>?Sg)uEpM1stHVy3MkQK zxCs?+_%-jICY-s>`=+ViE!(5Hfo=z%81t|;ncx!tQ&|p;l)?{Qtf@-#qU_G$$fXCpgi9>7rMa=ALLlSn`JlpY`7{NYTPRtB8L9mohKk) zZmc^@)SgJgc(!3Jg8;D?d`JQ@s`KQkfP4qJrc?S=pAoa9Davig`q|H_B;VGxw@k!V zyVm2+N+F6vbt>LD%=N8;8Y%}!3hN1s4taLBzoXZ2vKf(_Bg7>tp{COry`Yw(=Gb+? z21^L1glL$#WPlayjz%Oo^Xy=Alj2Cm^wnSf<{_aYJ?~325*Q znIn2Z7Y%{G#?BDHd{X}Mh6r%PdwPkuArtN~4?w{OBp;`{hWRLVq^(&Be-SQ3U&;tH zzSsFeDNk?483e{-mFBMPy%+AhUS%eS$CLMYoonir4<7mL?3j_Jc8h0%2pgk1&4+ko zr8HDl7f2*W%3qiBP&%$SL&7Z0E(35KTTlw8D?~CLxRkQ<#EH}GoznkW>X**(1` zK~_gig!H|eQ84NP0Vfc@qNxX_Ur});wr$=h-EnB{2fBZN_Vz6jw(yYnnl(tR*f8HX zA641&YO&PBKdPzHFX}$wqo3rX_*NdT^R>%~>emwZ7xc3lsR<+CC==VFnDd7*bO8s6 z@oatz1PP9=iMseRfn@tE)d*<-^MZJr^@MJ1!RT zWq7Das}of!wqrMY#W;W&)5bX)_s;!|v<+1KS}vpCDUh}B>+gI>t~h1zoDWg9Ft|6%vb+$-fk}%M$5=^hG6-{j6j5fF07%(1l03;1D1nK2aj~s^ z2w{gg5o#1ryXihOaIbb<23NMUtEkF&gG&0BN-Qx3J0Qid&)t9&H|19EmUjoi`-8@7E|z{ zQb<&KU7LZGmeW2H%x+z(fN=Wg+!iex5dL|p9T{m=d~dNmj&IFd#6ypv&Y5XaR&{tK`5nl*oF9kLRb`~S#Ani$FWCZf zd&4lxMho1R+MGP_>e#>mdy>(>FRScN_LtgY45l)-Y@K{wgh^!p-VHq(;1=mJfKL4E zz91^cspSk{T~nwQHLRO?U z#!D4bS7|U+wD+<^ z-f*4E{_4^6+?}-P48P}${EJ795qSJD;d8=;DX=MOZ zHG+P7kcU5dPiMaaDE=yT%daJPjmeA%7m9EVFs@BBLpgr|Jl|^Uhzk|;gdFw}H)ENZ z%X2Fz%S_s%`=pmXoGL%tl+Qkh|BP@-yzI{;esXt0B7J7%gBQ|@ z`Yyf6vq{nDZlLpio^f4r#4W3X&|Hfho|q7~ak*N_ZtOg+SL2#9Er1S{$-Qi8Z-N)# zLvBZ5Uc%C``9frWCdS&~D*vsm`gBjBs_eY4+4kvg0+AznQ=5X}2cpV;Op7mYc5us?V+6VE9C$S;K z?4|heR&mxMyE!-9E6WMCaxdj20@Q2U5_rs!T%$7V|V&_IT66ltb*@ zhV0-SFcb&Vy5e4UOfR?@$)`HT?H2O-wDAhoCcjC^u`05bcoM!Widj(D41A+J_SGWR zYRr;q%T^7;C(cyQ;4Y@7w);d>U*~;^t&e&Qi|fj%UwKj(Fr@v}2Fn;pHm!S(TDH4l zAzH;%A|V}2*E}@aDBsJPfr>((TdFmZag7a;b1^W8yq^twi0j7cs*Uw#Qn<2WuJM$@ z&7aHG7CjvRxg8>=!%XpEM{6y6&={_$U@-W~d8mY$aDHK8~=>@)>1d*bdnvt5S2EG!5 zjNBiYqGYHG14%|;!Q>E*2g+klvaAejTw0!liw=`N#G6KX6CyrDT5`Nm(GC znO#_R-ZVQLpwT4bQAuK}rO4a&Mq6Z%7c!w~{6@@UA6P&YC7zqbcEjLuL`eH7mWZN8 zeUyI>DkQjSXF$lc4O2s?4S4&2RAX^ysazs5{PLA#=GG!KU6PxThnk>EqU615rc%we z^~q?<#P=nW2(>?WMBijve<3p zqsW;&NnYYrZ;y}ZACy3$uT7sKn~~2pzT;4C%mO*a>Y^RMc~X8W1Z+lrS2o!1&fEG3 zB*TcAKsn!%$npu052}?)K|Qo;M?OwP10x+)HDu3C2S$F(NxM|39XDcXCDX^gE)10FnGQUyDPU8gG1M++09yY%>$HGQ0oWD?ZgaM0}rtvaaW=h7PkO6N>U zIt|j($ESA##jj7!W=?gW21yK_ivBjeg$%OlYGIIfSfi{CohBracFzHk0Gy&fB2{6I zItyF3-yS?1G&T4I_fjC6wh*QulB}SPio`0|U+_?Xpl2S7JQwPv3G66RlS){b;BKWTJLGIkX5JW;3ZY4YlPH){9$> z@`JA&MukziSz?Ch%O82sAiSFEz4eU9!8L`gaoc=;H*`+a<#`z!!&-iqYd_|LSuZE8grhn(gU|1{8c;}n|U`<7eS`5BMA4xqjr**oqDl8ebd&quHg zj`hnat)Y<($f197G%-v^KrC>h1Dt`Sy~O`L1Xg?rzAT}a@E258TBNdfYj9O@TZ zN)~*I3gdrp76_Nr3At}FAC?WO7*78nzwI1AyaX%ur z+9Wn|nua<*Ey+FLR2tl;IY`yazLR$^EIwI`js7-ib4NawnX)8Y%ZJai&xwi-pdGDt zAuCe^=-(E_tl5n{8f^82!p$!`HEC$Ha+nNC)#bQIC2P-qR4)5@Lsf44)40&xI ze^7T${YEs;k>Ab|Vw!EmP( zy`s|FZx~$cZbY85e|?Mf3LXTxp%6}yF+zVw{%m8FFZqOqD@#eHjP0*v(^EzUlTskN z_3CE1OuL6f_RkQ38SGjYc4-2>t?4IIUa*k#1v&;@m1sO9TK~+f&MO;ABeua!;fj zM2m-JNsX|fR0heg!cO|`daprT);vkp5q2lJ6hQ^Jn?2#3Ye(*WH?*uHIlHreUOYQ6 z)z4AjB5>m)@CaKMVk-jDDMQ`EtwjOhI7kXubeF}Hegfj8jvU5aEKKnOE-5rchc>B=EzRMd!Axd4=7K%! z>@#WZn-44#Qh4nINud6GMue8gU?qN}vKZB*g)_moBi1PIm`+X7WZ0!K6KmTTI+(B+ z^BKR6BhoU1Qn$fkkEmG~7yU)Ht5`tW`qy1f&*(uYo3=s2CHc2fg)RFs0?o)#WjMBL z>rbZCjME{jj83cr7>y<)HQpM_fd9-^cX{4B<46>pQ{_6ppd3(;M3NS^T&$7Mll15Z z59~;SVk7kve{w6i`HcSftUVPL3tc1t4W>K29vl)|sflqsEM)l36C&q{PhC zF8iLg2QOP0KrjD2+q|ER*X3{gTI**>Gmd%T!^VV)`!Ec_d zf6@O7Wx$a%0mNnBe9f=+QI~`+AEsbzS=E5Y5+2D6RwT-a4TrD?r&1eXG&`v5MZjSj zJ)B(~`&@QfmbE!_Jvv8cw!G@}7AZWBN_3KpDd{CXOR*bG7r1-^-WktF=$PE?b?wS$ z5`kJ>P+N^9YkcmI2BG9(9UoZGkhD8dCt;YuS=S9l+@rt0iL|mST2tG{3x|{#NO)If zEa6$)?aH0>?0#fH&9=J{15|iMVMV6mK`R7@*U=Zb%$us46sfVXyon^>mF2A|%}hNL zS0%&r=Ea3<(o5;-QLFN@E7uo(KZnV-b)SFQ#b&={dsTaqlZf2l_+4p`%_{S@SXd5- ziw*ZTZRfSef?AcbF0!!^tovq0GnFw+FZbqY&APnrjT)(6%iim_Fy^|GzxQ)TlOvv| zohx1`&ij?RXBIQ@=j)`N=qwuw4)*Iv<6?O>xLC=Hia@!0eN0wwqh zQF#=Xrl%w5{_b_j1*tIP!T~tGIa?TY2xGZRY*m*918a}`J%1FmzSk2sKBePw#f z>t!v1ijiMq8kukFf>9Xcs3nF!sS7H;APxF%wf0Nt@3r*ta+Zf2^3R9bLs$)eSYt4{ zqa_Vs=d~5tvgjEm02*xj0g+$0i&+@*eEk*kGbserqlqWWN(#|+;%3+llJqwdA1eFI zq0tu)2(KTihl^{w@JK!!0Pm1Lc*QdE<7kr_3GXg@LyI7tpSn{K-eoFS; z@f@;+Q|Iyx5Uf5+h$mp-Y5P`!bOeSJlCV<`3|ZD|L^|BDdyrk9{L8px>#VpJ1l=T{py{ZjDw6|$vTZDpFWbyrn1YcRhGB*y7PaFsl0lrJyLvNS0 zj`OfBve?86&)PYVTmM(Y!@9J0l0)Pzs>-`_Wzm**tI1et#EPz^W6P(+Si%O1%d(9f zpK(5mcYGH2q1E+Tz-ViXUc9LMRAut6%{#pq#50`>7^NGbw{4mwbu`j?tX2fG>w{bT zi>{LQj?VM%e;$5djYf{ex}+WV{D^4GE~rd7cfpYL+f+) z*xGB3t&;;CjO2p z9K1iH;kEC3NW&`oH){Fj;bWP%ZkQANmr90_TqqXYF*lYWE2d@8-JgK=((GfmGs5hJ z%R1NTzr=&sN_5_y%74t)6t3JZ{$o34A2+MINS+9Hj(~T=0+;T?!{J%=Rkz9(8F&;g zXouE~c!u8L9AVA$?$FXi7U-vNd);?`;n2iBsrzchIEaOFyKYa_bDDEI;@h8u6PWyg zh&>o)lnrOfB^Ce=7A+-P3rW<4s}-1m-7GTW`G%#RXzQG8P8*V7N{yvcunb+6b~A!` z7%rBIKEuQYV1GD{Pcya`7$(c%vt^Z|-C>XrB=^=u$$ek`H;!8O3_)*kkPS}9me^5C z8uK_6I|nADPDBr$)zwY=T9joNNE3hOgdU}S3m5MReu>UCKs}~W6lup0fhTBaB>!PLxEq6403V{B$TPj@mLNkzABD+IkqC7n8%W2`Vw|Xf%`b~FhlfW zNg!hS>fDV)=N*Z&ZvC_?AoKUa#U`ZmxvWCuH#EDiwap5aVzBjqZ7Q^R*wiJb*$OSV zQId{hrFBIryFKp#Q|I^NM-jXpngqLTKF_~5WJ#Srph5>3il6knp3q%;WN+d{J(^c`1F3!aa%m~Isd|He%03y0PTKZ&aUy1VPl6FZCD5TcQk zds}&opkFHgooqEW#)-Omm+MfJ(=ct60sd*J)+~kZb7VxtTGvo1O)ecPS!z;k{zbcX zg`l-(EA4=ZkopBULo1?5NtDM!d@(fncM*PMk1U0d!ki;V&18ccco!QdK>p!#0OWgT zVbNz_`^2wUtzh~Go;3ATD)1oq&KlBc>@6osJtcEL>g$Bv7y*piSt|MysgZ1TVwQX( zevB733Het4^Y?|~#&`KeCmDfS3>4+3#z)vW$GZ>SH8WenJHOSwv3{*=3%5h{ zzI0PGAJ|zqxGB8WDflIwMEh;sFj9Ms_j(-;Ho;WT&?{6{;pNWEA%e5 z+E1!JB6fG&QcM6{Hs?e152fh&p@E^2Pu@_g)Y^fo*u3pf#Bxs546e3cVBCxl{&+i$ za`%ScoMZmwC%ZVP<2Pp~-Lg@`jczRS|^F z{8iiYLv+p$NqeeXzy`nqov#9^okyT;r{90L6>V<+)IAja9me*xnUUj=r5TBnIf$%` zpL6{{1J!k-$)2dH2Pmt>6;6K4^HVzI-y)os&zAw5=}L2_phRCH6}_t^I?Zw6Vq25O z&mtXqM`sRf{iOU4VJRGCkz5*NUZ-F?<45QEJwW`)2f^Er(GM+%K}Mc7FaJBfdDsIA z*ilN6&WD=^9Vn1i*eJ;DF+$?)S-up`t#trFYHHj~;5kh$+DGJ6Gbfg- zCG4C)2Uimy0;BNqZreJrhwlwIKvPIvd8ugEtJO}UtTptnFlr_sIKc{0`{nN5;+%sJg&4V(qAna`9X?)zw8x2BBcWd@E81G)q+UqFPC+O^M;kY`V2scIGSp zhHZB3;dN$G&C53)%zO#z`dL-X5Zb=sAmu}`I@E2K`xn!vX!j>?NdwsBFE^HKXtpTF ztqT&760CQAjey*waa7YS#au&OD9zptp!G4ny(bsnJrT7W3uO(1pdFQ2i-@iGR9jp# z2^3OHl7^7wTGfv?iS2pV?jM!(WPGq(>$g><*YI&yP+%{w$J-RxsTBw?!w_unvi#;X zn0%fp$Z+*uc$0{$$)VOpWP2;Zt;cKd{l)d*t6Rv^ak*LQpWCmVg+@*;l5A#MGugD` zaPl-&gSXR{?%Vd3WAA5vZUJ6+ay!=ZP4W|5O12E}(UnJ;l_iZqTxd2UXi|W$&=Som zseVJTOg_mt6&n6nEL1Sy)enNwZCC`3nb!-ea2!RG*E3>vFP`BCn6E4@d#IyW&6Nh8 zJs6Fn=CFOblxWVi-E%PacM1tl}!M~dBmj9e#-DId(W2s zzcpArFW3uXyj}(JGlAhVOVRgMr3KvIP_UA`@_H$(8!_dlZ|vseE&4N^0DsHgx6)kJ zCcTehgW758MjgN0t~u}D+8)(Mt~|*P4m_6AWy20)AAe<6gd8_TJQ=~#5EQIkh`!zR z%zunEH9meu0;v=+on!?aUwvjcSUt=fzs23S1W7-j$s`sImwKsbE#;h&Gc!}gUVbjC z+N+R3swSHprfeC9$Gt*jFGW9FK@=j+pTOX;Y39@fba?Mu(1%EmRSluVPNwn?Jc>VW zKuQX}SuPBcU0OzU+-&}-xINCrFLd~@Vs-O%3v*fdCn3THe?zu1S}f4&>|lZ2*>dS? z%bT6s)3>y!UoJv>^jnnT_r`Q0ZBIhK{*dhB-Zg6^X}SLcQQwk36C-cb%UaKQx5Zi2 zjiI{?$nuB9Ty$4GN3z_VL1WGPcsG<2NmVte;PzfLt6a-HWecXhaI>a<-C7#TdPN-+ zIwNjZou=@00(0GRQ#af@n)ve3?MHymdVQn?G0npx-#7ZZyoOE9!y;okf5Roi&VT&L zdg@M7$^GMjG>PROL<$wH$B%rAb+7NIPjDk_7&Dohz&`_Q^1m|Q2QQqy-SB+HJ*}h(==)VWc!LSBIk)^{sbmA~HGo=6`*-cvIgERxWu^g*q2Y(`7v~r&%gEx# zo~R$aN2p<(XvG0`>w7`s^t8iJRzyh1>CqN;$!A8y)(=9zIz-u-Ne?%?pp7U`~g_b zOx=J_5SQ1*W4^_Q@`7rCM-78jEs8v#LAu}>TliGD3Lo_exAG^T-xC{M5x2_wFXmLt z-0m&OBAhV3Mh|a$^2Ir{aia-S{Io1sh3G3oym~efNsb2UP0pqtvM;>5;Y^Q5Q>JE9 z1ZMV?6+ffz%+_Hmlu>*sHmYBS2U6a77wL$g^tkkWkynUlp2yp?&B$`r}@ld1-5sxBR3iT~c!p)R>O(w$`0(19r zE}R=e&_j6WGhe+!a_*^W5X$IGcT7zTUJwF&&V-8EY;Cke{{88>e*s4{RhQ^JJVOG} z0t;%-mr>1+xWzIWfC_kV!Dp5WJ+4IT&&zYKDZCfrv$|s;JftgIyG#=bK zaFJ;Z{Y_)(L;!RSl8e);>o@nzDOaCz7tt~d)#M!`DbR6xKyYZrsa^x)pmat!dI zj(hx)6x@gw6cmhP(vevVal;}AfoLG)UPPsvxjOTRCpQ~qi-TKIYNeX9`s#KAvhd;` z1-o|KaL$`t!Wv0U3DTi?Zs!z|Gq0Ja*Kw?mxYhMM9z&pAH6fV~Kee^@ z3vM3o&17*o({#yaT(K$PFN1&vNs|MYTtR>bjP3tyH%Ro3r{Lgq)i+XHXFOv**we?Fe`mp?1DEtf;SYdFS>G@6_WvEVm&|c@ zh+eOj@2;Lh2s(Bv>3G~rQ+l8uKjr<;NKU~|ncMeI!Xa-S)5n&_935W?+y`&j;S@~2 zay_gQyjG6m_S1exqC&@xN(L_pQenU$nDuGBzb$}E9TEL>+p6Ejo7Nmv@gME#KJff3 z`52j{^0HevZedlvwa8m%G~zS8_jHvDp_tBivO82D*vjc2IltMn_*Sv`FcSO1s=Euc zsATO2qy#FT;;>{dUoTXXZO8CErGL3sbN^VPxmAndF@V6Aj8y9aOx&`=M?ypiLsrC> zJ1h~6EIJ;%NsxMH1wRo$P$pU7w)_~U!JsG7UL`2QK1N#EEoEna_KbUca)IOXMTT1| zIOxtyPrlz%D_tVbz0!EDI2y{jC0bW)R#+H3sQAm{d?TTzulhZdQQbL&rEOMfmnH$F z{|XxBe`(-5#l1W*MT3e%X-h$@LRA3rw}yMls5TXTjWx{ml}>@+lw1Dp)2O zX1Zy5Cnl0IT7-&X!5BYc4LVuG;mJ0S*0|!+W{`ws=Ac&-!@33qpSk_~$S31xjiFU$ zt2g%)^Vrswl>Aq>aX^h4P0H=~EFs8q-T@GwxVLG<^{o@)_ujo^)&u|bJXFXvbaQ~!&7?<7^(SI7GDceN~5@L`8o;h!(z#=ZiYge4Qb8BaqW;!b2A zk7=$!JAb%DM@>tDPS_?(yg9pe#C8sej>k_~nI!Q^hZhw!uqUwB+$%$D8|!pJePZ1h z))5AhRD0vY`tr>MHULRl#hRABU=b}UPxx&RWCh_YMQ*dL$hSJE&ydr--CN_2R&_!4A z5jvTxLRj;N#9vQ~Q>Vo0Z)i`BOn#6?v;RaExo`?QXHp{$#Cd!3t76nMr<4iVxoLq!wp zl1EP9h8}T(n;tS4tYKuqH^ZO^^AEZ$@86(%o`I`sW@&ZD1Jijr`qF0 zTA#k8TYBLF-&o31dmzwU+`Vbwy}BFf%H}&7>N;MUzN;(5Ga*PU`zBg_x7wZC^`D=| z3G-MsR$Wm!a>Qhi143RC3VIS`(K5WP%R9X4wg)qhsF#*>ew1Ty@P9&+S25HLG-h%@ zV7gp!O1G|U4Fvw#x7qx0BYj*cf)ir0i#+&x{vrPwwLQ+L9fi56C&Ba#@|A0V(9YtH zw+SxBo3lCXf)rR^iSgH%$qebW=6H`}$93*H@fb&7gt#h-v8>Npu>Mfq2}b{)UaF;~ zX_V#Da4;$9mJ7F67~xMT{3fm+BxN9x!RM1lEQR|sRriBmrWesLx&Q22e{R%I`!I2o z;n(JYlo^*lbc7U-WYA!Gnfmfyk=AIez`63R^@V$vvMj>ApvxCbP9Z-MvbB`Tr>$+EhE%%_uMh53J9cgz2G<4z8T z1!i@niux621a=7ej17m4=(DjXJ5`^pmgo0Rj*FkKq&K*zR^M*8#6|r-7vSg1D2ak8 zJ>aXb^c=NUXwu^C37ptLmw(HkC= z;&dnex$LKwrYVxNgdyMy3FQROm`+vwJwm||gy7;OeghDaOCMri#k59gG|r<_ zlJY&;zl+=U5WQYt)tI+&k~K|cs~L;S+?{*wLGVn5N=;>yo)fFa66xVyt0HbR-dG&o z#*>tM$^YMd+e4h{Ep4D*%mf4)zr=*F%D*9O^Gv7KHeOv6eADt%3@X2uR9u0g-_wjZ z@wK-prPs3Hy-R#^1e(paJu&$9 zitOO9&6I+oks4J2^-!;T0a9MEQ*I+^B5_8BMgFXaB)T@FQKP)ZzC*0!u4u`IUj&CL zC0=|BBmTcT+-e4HHu9Mh;##R|^s-|Zm9448*Y;;ZwgGpB!{mF0v(C~??;6UwK|1M+ zku%3ayTyf1Xw;v-flk?Unky2>zQK#-G`M5#(aNkxZuw6h6GV%MMOF~fxXRbO%0Kv~ zK95r^ysh|Nyff+Y+7u`}c_f%As-!tg_0Ywci)GKSr&@!~pUylVQZ{oyvOn9>k!B}H zC`5=~l0p`**k<=%uJJ2g@-?R0U@B~tgnLnb=NMY+-WQzN!fNb&|IGoBUHg5NCYZ8r zVqrxVe5gYHp_W-TdD4^?4(^M$r=xmDy)p_{qe>^bTL{Gk1od$kUAU;#6qDKA!bkIF-r=uN2(d(~{HTd}bsjF+3Qx8lP zOtpbAGBi#Bu2-LM+jrxox1T0E1!`|Xt%sR}V%^E*J|F#TaKvel*Z#cYDU^I;ed!^; zKAsALwd?{qO>~#!d)-DGZFs&FK+aBPbo(cN7=@nzqiQMf!pck@>i`$dXv)-eg-K+q zI4#~vzdqQpfQ$b&Q}JoE^ZoY>gJ?n9HhYbH!g*=H3B2<_zelZZGv$7d#2#Sf%c?zn zrEFbmc+wrMiul7JVq>U03q*JQNNH-DwnPoSaq8a`A18_U?p{!s=|5Vn44=A;Fn<4n#+{jTCEQJN}HW*ADj zGuLDrN!nzJY$kIK@CbT`8oz#{wXSr}OI0Q~PrY%s;QGlUm=Ps){&n`go7g-}oMMPU z;+q8=*9CW?YalIRW2eg)JpQN`Vao4=UyyN8o$w}UK47jRM->~t*GtAiJO9#pxiTzt z6qutU=(YMC$makxdB8Lfj?BFc5wPUt5wyVx#NbO72h4r3@PPfWd|Ih-`qf$!e(S<<*u;+Q^iblsr8z z2Q+T$*Q-XW2swdr5Zp5?G@oQ+Z`)=wusnlz##jbAL=~zREBxQZcHH{j zh+?oGOTQ;KvbH>TQ8U<#ZcfUu!&d){$FGt4Y~E-JqcSBLs(4H_B9&47xsU%ux`h2W z;Fu})Q5~tGTGLn+6{&UtEAOxWwkV6i=XbByEANnbRFROWtn+}hat~x=zj`pa%bhW{ zf0jN0%fH~T6qw7dp;WvaeE;n2!&wa>Xa-F*o;+dU&F)~x0w`Pm{#0XfV-x3D<2}}Y z-6f$tq)%tD*S}<5)_QzRJ@4;)E@wX5D+6;1{!z=JlW&{^533gD)-%q@Jb$!44CST> z!x1*0%jKVMzRkA8+frB~2=sCk79{JwOgQ~FhQGk>*ikc4sIw={wai9$#%0wIq9-y4 zZLSm?iG#-h@el1~2ze%6a`tz*?eATgjlfR%s7x|0%hgz~~KOnmmWw#GV z%0!q*|BWHgM*b~^vKn(rC<4yTA~}M*>|y*QcL;(rw{V*A$aqOMyXbk!vA<^xPg{Jp zi0m%L+~wSyS$%7k`;8x`xB)Xd~v> z^gv3M8LknU#w;){(#C-5bgsLkYb;;xH02%T+27*N=#&o04v{e3B`_8@=KNA zKTG$JXQUyo{2TsStAuIjSL$l7vI{A{Q?@WeCzDH7A2Ch_YSLfUG2Wk%*?>m{)k%Sh1 zPCs*xRuQx45Ps|Szd~B_uyMB2d{SOK6}bEfQ&nsdSrV-?m^>!rmALXd0Qnv z=hw>@9f}d?8YT$L00$^*=GZcSVsexEfMT#Wm`c}UVWY%?{v-+tUk7=ui=x&B48K}#!lgbKiem*%e z1~UfJ=TX3R7o1*5^{oS#4G>L0ZVFRXu}T}8k!=~W_ZkDMRjc^=fkf~jSfHuayNb2@ zO8SA>cT~{-76*yFu)8Cnf3;u74!L)ErnQ9OrU=DdbfbQRURVnl(z|37hq{7e1x|jn z7aWD$Zaq=ol`k$#T{o1hF)I6Q9G7O;e=W|j%A5i<=oSf0>Ru>NWp$wJapNWwz z{;yyv!0vP)f1b~lYsq7bbxx?88NNa5R<37N*8Vqr+;IC8$k>zx`N69Z~9il#$a8FvI@n6VtG?~ ztg<*BJ#`G4xIi`S`zpCk!7IGzlN?L^oj!p1`fGXRYttc`F?_8as(-znYctZzQrwV*$TS>R^T`>GnAzWKja8LeR8BnEySG;+j zcuIXxe-;sRja1N0*}#pG@3jzK`zcyJD%Sv4cb$}!|o4AHyg(-YHL>}5Jaw8<0_k*c?!IOkuI<5gGED4Y)(<0%ln0$BdJt1r793< z=KR@L<}k>-BLn|7=%|zhZZ~fmar$Xx?b&@CE?1ssV6zndsO{7s2964svS8uJGB@-LBPQlc~E(A%u+@)fu#O#O5&jI6sJ+(iXr;!@E{0_4D#>!vS zxhOk_%AegKyN^GAy|Dr18%~?4APWUJRN7X(+}K4B%im*oBO!ORy83@DU1wMmUDIBA z4^2@*C{cUAOS?A2vVdI%0mF@C4i_j zY3i5we*gB`y>`y*%sq3?&hDA}JW}jJ#;Its&u`pF|K~yfAEAK)7c6yl%g#9$SzRoa zExvbULG!rd_uI;NY+5`GwPdB4J=joh&DA6OlsJ zW9!c3rkty9pSg0oGLLtm#46}aj|xdbi?&7BvX8$ir;zu>G;S^GsOBv;Ifs<8+(l=B_MyND zARCfT*>W)1e;$*~v5La}5Z8vQb9-?{fic;_dy(M|oM16WodtL!x5ApL@8O;rIKk8P zljqffnb`xrL+%re14A7s{d|r7W4Okb@&lTz)w#XaA)2*&k^;d04{knwq9$%RyEpV5 zzRu;FyKu4UiHA^b5z8?64*iT__&I6SYZeiz28AOcFGrB7Vfokr;mZX-*9#2=47|?1 z;rRsP6%}!3$_9{+Z%H&}-Y|qoZKa&7Vi`WcPS1LEjEKd`(6kk7ODTohs~TkYAMWcYHr z|BQ|KQ%HW+?KO=LA&vrshMOrM3|W8E7+Jdw1lNe}8!plcuDJyI<)B0ZBk z9sz9s5SJ2p5&pf?LNtCv2R1(rL{r9q_s9Fam;IFts-gwMC1jul}y3qq_jP12iK)vP2Ts zGX+Bh_q(+;ynE8Xk38{V0+nl)PBDPF2#n*Opx+Kh7=rvg*`Pf zb(uZS%76w;6FtargH~??p03l>*b@KY(AV$~Q+l0Q17*PU76Uz$oBXN?Nm(9FkoerG zm4bLeVWHb|&s`3USQb;F65L?|MB7}YzPCNF3;QIe%x%J)G7lb7c)Mr52b!Y4G?w6| zRbr1^cFSl`6aFYsLlBo?rS&n@{FClq2d3R3PW50`xU zdIo*$n#sY^*S_<>yihBi$?QLe`gGDcT}HN1A^JmCCu`}m525l8C!`CwV(DLDg*V#y zzxZ(-4CmyU%T|5Poa#K54097h>iEMFRw(%Rb%sKtcbk75&+-12q-dKhqsOK0Ost** zpQe~Q_XZ=m0-|ccD zC_K@EJnyXF2OV&N73QhdcrW#~o$SxPLCEyhjgqsEseEeS-I1;++orNqY38!^vXQ<1 z<$=f*30YZ#*V#J5>^&1nUsyOC?@H*y$C0ULu04uFj!W%@m1=ADGc%g&5ZyK3>-|si z)RjNU&CHp_nlf)0guF>Er^Dul9NaJ6X>xD0CMHCIg_>EC4g+B+RYcv zb-Ns~kBB0Y26vjr{>`|JSq`eYAC<2+*sE*vfjqVhCz0kwOS2v zh#&O&o0k%_mmRU)-l1dh7Mrdu&&uggN~V*PUuoy!{~&1kpij3xr-L0~iHp(Hxi#q_ zONDd3+1iV92!n<@R|i-W)hZ!^soC6|G@L4~l}Q4%-Z~jDQZ?A(6<3w-Wm?{7E7i8}V#0!xMkdLF0t`Gac~p$t$t*YQ?}>K`)9= zl8`W`LdCAJf*{)N`J9$nJV}@M)i~0PLa(ccCF|gs?KQFbX*m3;uv5Dq0`J~9eSw8d z@I#`biL}lmCxYmjPKJc2ZPCsN!+i3zxM)O5(2or2gR3J99(8vwF%Y$$;@jrsvwuV` zf#siyZ_~zZ%zs$w7aWt=;dw^jGU+~F;U+inV!;^7&+>VG$yr5d?5i9~;|4!9 zhvUC=V8=!rS=v)ImmrfxFc*5+M{y(T=Ar>zCWS!aNaXr3Y!qmo!rzc#5A%4FxJ0L& zTARikGc3`gyNJ_KT#ot8ILwp(C-*93gAKpFaP=SZtGt4}W*GgK4`|WH_+O>$Bl1}u zK`sVtLz+*-P1w{jwt~>327PbD`bJu4Iu(!kY_&FTDdrUU3#1E|`oqSor0KPnZ)Vj2 z`GL+qES=-1pYsWF6?E1_=W=^uHLX_cWmfNH%^w^;xiwpe6$`l}o9!~QMNyN#pJ6!O z&+oXM-7l);g2)fGqBAx|;bF;p4G_jM@JZ zo>wxt8AoZiNDL0P8e^z%=kk?9vTe_cZ16ao6#(&-n?T_Ps((k5o)_lWF?ISP`X>`C z0o~ym@Mo=GAa{=_v(Ay;u)&sAqBO*T!tO}@xj?zDS>LqYkJ42MG=AATm!Qi}qUBL` z8RH9r9pAiWq9b0Zl{k99T~J4}37lzNb+f_vyvsj7HQ)Izov|zd7@rEXv7pQ9_&0|< z)LFqHm`)JJ`(VrJGz%~)GY&2|R-4#A&AdNCEKdD&u{9QI!VL`Jxk|l4Gh6hz^aVh% zhKicW{{fYwC$Xc(RVKC|1!`uf9+0Qdnl7V|!f^UXTIqz;UGzMEu9Bj!4x=WvZ5`xJ z=Pvz}O-pD#5ALB6Em&0wN^?_;H9e^@Th#Df769?wiX@6l#q(3vF6SosvIiSyl_A%8 zE3j2#c-n!!^StXmQLXf%`@9X05eHZ$FQ}#=Qa_~YQaELkFBAVlr#_;x-4EzlEpl>z z_1NeAPmFc;Ag-p}Zxk7$0q)XLF6zt{p|tME<}&&0sdz-(6A*F4vOQBO=(O(lJ7w=H z;UQ;(LC7acIe>ZxH!*i5bpJ4{jS4NnVGDJ^#j9EJg3Nz9HYtO&TRr0Bl7y(MJ{xJZ&AwoB5E z6OaB*UyGQ4RbP7Afq*|@W$Rb;b9{HDX8uBBa2bm?Z-X~|)Pw77W#{+cr%`pge`X$U zPb<|3PGwoQ77e%(YI)$%>iL1+ui>o227f-qF!CA>V9IcxpU?~?gY0|mTJ3PGHh+?` zP~sC8885<$J}R{0H++*j=x6B<6S{i)Z!HW0L>3`($gzqm-vr;o1V5N4bW5t-k%S?~ z>=fb3ygbjG2UPcsZoCq;4seFjhgn21@$^WW!HqWiCU;s1s`+Anlzd?T(Aq^t%ntOV zoD{fm#3I+B6Nz0M^&&S)EDVwYNiWJ2KGIqHEd~1Z_av9R7wMXdwNVm2-2>rdIOZuV z-{Aye%^UL4$zHwuy}bplFR#8~On*Jb2;UJz?yC5;<5He_PmkDqaK-W~-`mmrp!|vf z{!$ttF)lVF*#qicLCeK=3_*bTb4jKVE!KK&+ZkmsSpG%-ytV$X=vn)hSH}N{R+aE} z*V0lNCb@^19?sb9mJlyZ4_6o;5p7XBN|UP;PEr6+qn)_!T|oplNU4&x+;iw06~1-O z#ikd?Jk<<%?L%OY(A9~5sB}52b_yq!C-S7Oo*>H6eAkqHaEGs*1_+WWt)p)s^02&W zg)2rlC%ThBs)6CSswR$FWv)-<4J{B~xTA_4=cHW(CV=md(#9&;RNU-NkQ+e-s+d6VJT9v|PwklJYO! zUFJ}qs!l!OztECmSO4m-Yro?g&#FTyK73|^o+03|=NdTzqES?ZSv z>wa;v_eX!Wm>ZR8pr^+kWM$m-(*M5gDTCuoKJZeyhw(P6zo^7w@p?`T#01RyCSl%i z+sL%9qVXqP+gqJKG0PE613Bt%yu5GgeC|B_2q{`Qv}^|-jBgbWU?xd+d$m%(?G&lE zCc+BJ1-2l163TPzz6R1Wy)|V~!OXo6m42^Yoy&cLbTl0m9U|I6E)TIp%&(*DyZF!C z@c;lb6ZFA0#P5Jq-2Sj*MgZcg664BexI-#wDqdbGzy{79*4thAi#QO0j=r{D^NgxTD(Yz2)G#!BAHpQ8kYzKxJV-A)KgYX>wTU%9sYVerXUmJ{s#IGLj?5^|EwGgcB zn?mLSWjw{%sgZJA>a5|EvlZl(U`roE$|qGXU3)nD$Ik9SwnBZ$AX0$#8y0`#JFcj4 zMM~)};q8brGgY&5g3}DUkbIPxK?e(?@IvJPOH4t!hQkieCaF2Et?T(@9{|w*XQZoT z#i&uD=H?H}P!9JiV+2qZrFHieTRm-^2<`2xGyOyTmZ?i-dAzmHBkeMlaz-b*RzJ`^ zy6z=QrWx$C{$Itv4vx=6|pIWtw zcMcvoDTPzjdyt4}g7~WX&(Vf(;dp)4AfBfgZ)nlaSumM%vF6beCeqQ^IcBQKUYd4) zUq>tyVpc*nT-%2kc*YzDt9;6zSSj7lsV?kZWUBvRdM>|L1$+G>MUxlZn@xtpvmcwM z_pi7w`a9u}avFEI37+Lg9-7z8jUV_et>Q#E5b2)8d_F3!cl5d~ulvvAQv5yfyw!{B zI+u6^<1)K$WsRV37k35Q^=l?dz?M*$xwdJQQv?9W*rS_}btm^8cBW04PP^1q5vEF6 zMkOU&13HyMxThtkD1{a%mkpY&_#0Xg?g%_wnbIQYU}Q(NQJ1r9gR( z7lE+;0ta$CO75VzSiH0@KfB;VL51P8^Et_T_ASp5W^e<6D$GDFYEby4Nnk%EWfkTT zr}7pvc^Yz?11fmOu6xS3?P=$eoJ5R0_`Hbl{L}jnWbv_PA`W9TEI*r1E7U&HPl z)$z%E@*qFR($Ku~!M!Dpf>WoYdNO9r1`Gf}7*jWRjp{Gqyz-h&Sj*tVD;*|dVH@dM z|8H4i*8VVK6lL{985z6Y+%)o$@QQtkoR9F?8Z|w7_ddT~?4yT(>HD|4P&U)=e$>!g z>)jVul@RkbR=3Y!j?TWQ-oNd4yh=FUx&%x5uG4VOlNvJ$6ZvYy5$1d+bp4VNr^qmb zoGuymE}5W6Azw&>J9FnNi+IQ|QS;o)OHV*78_=nP}U(#Pr!O7sdf}7@J z#XRYm0HFF&g)A#>05W48~i=a zYZ<3|uX)%f>@NJ44@RIfgs4JPN2cO`6KV||cwW{DmDjQJ0HC=C|BdJ_oQW7i4o$E&9WQEL zrX7f0x_?))f;!=&>;o1La%VvwTm5i1B_B1*;`;sXqM{wB;(zGXu5S@;;P%L&5Yby9 z!?u_zy*xvLtO3RH^R0Sr8*!?S9)EMFDO~jPo@STGy-3x$Wt1%S`$Aimp*bB(ZQtcU zzeV34{2|TZ+!dD>R$l> z2z^T=2hu6yc2D9-hrQ|)5kZC{Q@<`2tjvyCvs$50)W>SolTe&<8FvqHwxe38O((%L zf30yQ^M(plywC)>b64rnKPRc3mv#DrZ-V?gPa-!HjbY-~sNOpTM#!@9GJO)%E8+CA zPl<9bVkiLsyvwqd8RU6HZ|7x>pl^}lADgo>|VepM(KlbpdRWhs0e>FXG)orYQ?aTdVqqGNM z!g1HGd#qX`w0*}8Aq}N$53Bqht-{qiruJxPyw^ZpUL*K*^x1Cp=yyS+s;61>wm( zGQac3w*90Qdw%2utzsmsdVx})-(Nusm68tf5BdaW!_NlQ>3#a7q}_8NzU~ffEr0G>ectAu z?^^nyiGqLtQXyaa#ENwUa*h66@8`nl>(=4Zi+c|&-wXI^Va4XwUHL@@75w^A_KJPT zphg8(eDU96WA%?k7P;(5wKTu-o|7-^i`-n@rvKPw>7=#uNlj5$KdUKft&}dIfXE#W z@M^czaZT`}u7ikkGWl9P+;zO596GXk^tJkV{y8D5Xc6dd%1PJiD;?s>k6c?7rMTlI zC8*GrVlYL@nXMi#cZSb)d+t*HSY2Q^*GE|VYG&;8t^61_t6mWm(~HcvhS>9FjS%JY zu}+AeQ5Yd13cbsagiGT>2HfO=HUz-G;2K+oQlL@yaqNt3cL9)oO9@_nf7_ z&&bK33e_+iIq)LQty^@H&5xvhc8S=ScMKeJw;)(qbdTv)=){cz7JGGReBNBLg3ltIwBKe!-r+*PqSkVD&SFv=i4)RXL$21kx4#oQ>o;Lxq&ct2`z$? zs6X&MMpo;)TI75)q8eJhSuNuG-N`N@ugvAj$D>|TWF0lCf3;ubOhJIF)NFBdB6hC7 zBH!V~A2a0;50l?)($5cPInyqM7lzZ7bm)Dav4%~a(wy%1id5K}p45&zOAP(hWU%8X zbSXU2g_8785o4axO0iep$|9P=XM2#zXbL>Hk7+cgsE~f84Ifn5bhgmOjW?N`oLoER zCD4@IrEssEWTe8<#kB_v z4O$N=4hMy(C!6q@^CV=Gp!AP=oF=nEZ;Btu=g@Tc7+Y<#+^|9Vv3@lEJ6G6o}52AlAAfOcIqw=T_q?LQ`8ZH_>7 zW`^_!b(J)$Rwvy2=+0m0k|R8Gv@3LRoWQcfl6Tb%u7R;O;8|CG|Dg_qI>*Um5I@SW z$3VhfU2n6NVxY;nw${KSXHew0PiMYj1rVVoXWBw%U>da#VRtH&N*%DXD{wly?Q6-f zM%&HjLT?A2_zi})rwyFR;4d;;!mm{H2P;KOg%OjqA+@YT(l*-XO(7{|JdFlP+ifRf4QIOpr_yLOk|BMU36f+~A?L;U z4S-E4$G|1p z;)QU1RfOB2>2J}-HHx-PDUMX0nFpr=`|Z`*WRhqkvr>vS0HTiueansK zl1cK6uzNw?V!E*BDQpWwW5`ifnp^a^!Ro>}{Y*^b$8cJuWO?nPVL&R`8O54xw2mk- z_-eX2b>`z{?AIe?Dv}jv<~d;&I{>ZI$zTq06^>Kd^qgzz3OPD`;&a zPESk5jA3Kt!T3zU`HDzR1TTKdHuV(?c=ndXT{(4VBLOmVZPv&M8gJ_EZhO zGYP3|cI^$nLJ68oZ#LjLC3h6*xG-o_fscWPn}M;0PxlyXGw`jPN@u%FiX9BvsvCWK zULUeKB%rxRCH~$4WhVUt?*w*8f_4Cirz?^-4x_a0MAwd32IvuZcik7i zFmg}#Ds$B)%vX(LC4*bFCmG$O*NpLMk#Njd`CP6IWV;-V(Q#%d>A9B;z8g4 z3BW9ttFGO9<5a7On&n2Pk#7F-aH-L zjgYBK8h0YZPuq|{$*RX)OV3J|i~YtpJ)qqT40QM6`-`qZ6zxl$`yiWXDj<*>VG3DN z*8bu;L8QQ0w-T7|{CGg5J}dWB2Ds>nH9}AQ1{WujiG7PkUapf#)SB^fa^RQS3P}?E zUys3_GjvqLq=U%PlXkrvU}j(e&-@7e13|)TD3IcT1(cBQ-nBBE>99*9lg2IF7i^*k ziAjk|2Ez!Po&VR_yAf%AsmaU>jk387(vgeTE0WpA5jh&oSrwHG8Ygn6TtN6Z-?Gtk z&F-BGx5%gnx{|x%Tvb;sLYq4Xd@{+T? za#@TQRMIm>K^5*%-^J|v2%~sf^B5NsZweSZ!TlH;(Ge~m@SOWbn%DZQ2FJyMx5EjA z;uJeyJK!m-idqfm;Rk%No9U3GR7!4=gT z`(636WkpxtDK#~_^CodE8#myWOfVoU2RFkZ3hKG9j+l(kOaQJ88j*ODe3Mc&{Jn30 z9Y0Y)iy%Aug$W|~vs57pX^}B!PPjLD+z%0HORQRlKT@5%V~Kd10P(th5)YY)Juy&~ zDyQ~%9te<&HZ6SWVFixXRzvplhfP)H8qgI95$_-K9vP#`=ksF2%lS`C+2Kt6X5c+c zJg`ioF*2FLW62I8OH4(C+IDyqxEAW4E^R3ZFR|Y0?tmfVP+1AB??P=ZXA(aLB&v`ye+t(AhzzFDa z4N)P2%`i3^qsNDV!(JIL%TBeEth`puLYbp8hGKoFam9sN3AvM_sEXS7Ao<2w;$9a6JE)~J!a5cP{BKJv} zV>$4B<8}%7Rnn6Ln^PTM8|=ihah-I?b!o2SOz8V?2YQ-(Tv<+X#-HQZft#ErT{|F` z!YemDICZ9*_1tadnWM3njd5DqYRJEyik#X@UCg-14)F?`dss2dI89r)8o*7fuheb0 zT>!bgdq520?Hd#Xj%c!00C39FynNEUszdVW|$OZ-1*8>N02kpSk1nT% zF~^Mixa&`~V7#pn%2P0npvLBuN!QlJ2xem8l_zl(9SpA{T9S-NX7wZ7_i(VN84i1Lu%Ouw zIA?Jsn-<(IAwpqdj>I>qEyKu@+j0mIQo!njPj&mfWii_dM(3Q+4J$cdgmj8|ii|fgOMlzFH_3+r#jy#)zCw zGPq;#^?p5M_8XleS#ecforeewQz{}kxRJ$$F5*DK6IGFMwBZ+n{MyBIDBFB#S zwzU}Z7bo+qvCl9kb!d)@AQI^osv!jru-xV@N!{oNnvmJo@-zx2(Uf)trj%AO$>7A| zyvT7qjo}TN0b}G4-6E+_x@1q z2HLQ^j-m*@mdJ6OORvXerrmZ#oQ28ab=nZ}TCx3z_lIDmB1DXAfUA|!{4nE*#ZJho z$f!R9`GaREGr(On@u*!7lmQ#WYI3p9ogfAQUGiNFgz80>3BN#J~G$XqV8# z9)TcX(dext2T}+>zq?ldtH?UM*e93u7Jq-YDyk72N+Gu(A>kj-{o5TZQ3AYp#nJxU zDagPifFqnHKPg^X_pcYHNCL?Y>^)%)(e>wID`@a@vH#sh^U;F_lfy&JNNe6v_$IsUE+Wop>m2Zzr4nZre5~~I`sjq{a<|C7a^mRM>?WlcUMOo) zy0pv4>ysO2>3jbDwFY_leZdW#ba%|~K6+YiW?v|`u!81AvzBY{=EM}tSEqaWL}V7m z_Ma|P0{^8xW3j$GcCR?564`|%vc|0^UnFK2otUql;J5}vcGSWBy9!P>(}HNy72|4* z6x3Wnp>r_pQrcv<>+EiCNu#f$FDOw{m)(v3kmNnj6y4jWCU3&0R2k_u_;KPRzQsE6 z3I)$~QQ0MIiS23=Sy#auM}G_GEC2J2v6@e>_^M32&>AH_H8(Clrow-@(aFp(SYf_< zo2~-u*huMK=j;rLs@-ULlvH`kkz0t`c{>MYJ*J69QPKJFP2$$hKQ>&eYQMbUX11Gy z*g?==+wxYt8TS9wfb|dW5W&L6!S(E>{=F=sgYj z)_giE$*ikwv4C*KBTM8%NNQ1Td@(mF7qW^%208$^ZwrfG^Mk0@yUCQTnND-dK(NJoavk7QC(KEfG~TE3-|8(B&x zPW}{lAo)=bg(lM}&JkbIVVRBWD^gRf$nxG}tok0laLH-f^^RwUmSTXvZY_BJg_y%d zsqMNAg^D|tRL-AjXtlr)Pzf>iVFxz;<5BP-={`t2`li|}rO1A+s_q6<&DFB#wq;k( z#G?nwLFOo)y}6u(LvpQ{K^Jft2$yOQL~etHiTBU-mTq&FSk!NfSDgWQ;PF&zxHRlmy@Hj2#_O!JHBMNejemMveBr{DDRgi4wNs%UEYo7w11zFLto1cy?C!GmMl>TWY ze!ehEY;_bt%uZs(q9CmM%f$S}wkRuLC#)R&Rw#cVz0G)_QoWNVoBTo^TP+$VvM>OoN$Hya+aLD3w#I_ zm4b}rRB|{E*nIodc+7IiX$K`QD+`O~3d`A?*$L3a`DbZ6zQ7BijUa zBhgGs^Z7;KV?^G*dufFX$`l(x!~iB^$69IK=Wafm9cqn6y)%~|KnBR<2J#IcmO2S5 zMZFD(y19=Aefiz2zX>)h)^_U73c)i6?x#Y*yM*NBL=c0BaQuj({Bk15TLM`x-D&H# zg0Q~>!tUGnBxU)&QVs#awmF@|Ea$HJKESM-hZ4@OU{)KX3Y20EE+jRka%VFS$*$P) zs;D)P)E7F0&6ix`&My_@{ub&Kd!Um{mkWf+|A|f#`sp+OT;cz^vixZc+MK{um|k&^ zKd-`H+`oHyeD(9(YiD;Xr>BX>Bh0D6j*yi^D>{1and28m1JzuMLffS%pr(2!Ja#aVIdRGN_0Oe1|mwN!$Ok_dvWZiO+`7iFO za4?7h^`0X7bi1`0R9UZtinLmVm+zNA71p6xfhE^z^*j2e5PMu*7{ogc@VJQmGjmIC0Ly(P!TS|U;T2MFdO+q$u)1-Si-OLbY<_SLc2l? z*(V94ey`RhUVfxsH+X$RlZXQTRAK0+=h{KXTP@PJ>8+vs_AG|ad~b-#2%l`EgLE6Z zC#cIcji)&T0kAfcB;&$ zOB?npGcz)xG2cB&sC>MfS}5{IdVtE>BP@!*i70pQ`-C+gk6H!X#bu6GGvsLPbOs)w z2Wicv!Ti|N*$l*K>a;jYh5qe#ELr(9Y)Ez#k)6py0H5j);nR&3N9$u&dcdD#P zz3iO7MHUs)nX$n!>_zXTeVkcwU>!xbExGA43LvB5=HW1Sa*f#A$#tVolHHvAufCC> zfK*e!jQ(wmfjTYG0F+RgA+D8xlP0lTn0oiErKAlwV}vyEcG4lgm!EHu?~RldVaH3( zzq{jjD=16{B%ISg0t=~1D3~Xe6$TZQfU^H)t(G}$C{-ous>bo>?4^)y$=BqliqIS< zbuWxQ3@mdEt>uB5sy6j*03yY z6Y2)3`P2qHfuA6Y{i9+pqvRy93E766BEqN{5vTW#GLK;&mzVo3_}8)0o=|?|O1)^* zwEz7!M#>`AvrgJ2bNlWyv6+j*3YJ(-a>o!tr@Dt^%yhWzW+w#Pj=3UFT&BSK)M>m#;P=Mjx(9jB*qHDt<=Zx1;sp zE8o4-i277hL?>BBLy(i7_6im7HJ{p?r6>5~=50|IG2v|&w|&se!Ur^lia3gY&55{i z_)JscmQHz8jwDnOIUzhE-rC6~AgFm}qlpc{ROPY=k=^1Sx?~=_x;z`d8rwvz#s@Yj zTDoo%B1DM7>aF$?(uErL+`07NL#U$yKjQ)JRH9$*n0Pm`Q!mou_uE0es$R#PA6s5h zPcO2XCqa!h?=|)*o%E`ht9p#Z;#VbRB}82m?yDvEiTlbw^+JWm zr}bTs-!5l@c#wge+q|DOyYS}X>~~O>`9u8VETw}Sy#R#14);iW`uI3hFwD{xq~DC? z^*rArELM2QBc@m`=B4s1 zjjdg$Xk4y=PI%yu0v73D(h|`rhhiXpjp-TCJNukBD>dxe+{@n`(W~BYnO98&xr`LO z#~Vk<8K5o6FGuA|yv_-vIXnzWN5kYAEO$nsyHAg?0aX(LRnN4|9=TTEEdr=2@~gN5 z;#CV5`viVcCD4CV#xZVo>r>yIafZ5uK6jAo1b! zx`%0>fD2b`aY#-Bic<5+;x&e~&@%!`~`PCW3N`hX(ML-kmDl z2vod{2XwxD!q~NHFmDkP^u`6v1EehD)#aPIePmeJUrSzht`0!h!t^zL9q-lm%yP2) zkm)u=<=RKJo!Lnhl*P9*DV{Onc4Wr)_oFn3Psa`!MD*#$XGGw{`$(y| z>^U`DK@sh9p%oh55uu9O#JbP3x>j!kTm=g`KVx9V(@m)LaGGqH$lY2(LRnl;lI*#Q zty$r%S?YqH^3xia3(0%x7myB&!>;%09g#MZu2u7|tq|Ke$g67;pVu9__`sg;9K=#S zk2uVczCYd{Tr(PC8s@&|(8c#<<>m-FW5WrNnJIGb*<@4NJByx6r`Q`G*Q#wC&HSFh zu73)nE27yUhnWi}sr8PmRz}#X9{Y{>%jQp0m9}rv|G?aUFDvA#F`rTM_mzXn4b$Z<*SUQZVG`}RH-r{;sS4eCQB0S*sN9q#UQPeDm$G0;yjd46 zT`+EKqkL?Tq^%j2;L#o&9N;jRuXe^;|GAF6VJOmlEtXg+{JSabv!oU(W++4#HkFht zPnSDc8yi{<|DAPNdyv3jz>Db!G6!{rlt|AzLk+8EG$`2Plp6 zM`CJ7vat$`7tOq=aoxHn<#nqR2>5x513&wz_<=5(sAT7dY!V9LJhMg#v#3t6;szYH z{ATerFQ8@bPF)twHku?q!#DC29`Q~#CB}EVSD2d0utdWw#-9S+BaLglcxl zwlfH0;m5XqHchMys*5-!9klm~*rPd>GA^N2Ykv+|7;9V+nHjW`z`x%zq9$^+r^_V@ z7Te6=B-R#wdd4TWW!F5>Mqre6xaA=`g9_O>otZ}F{h@-n6&;)O+kXHl7?S^)%N||I zWs^-XP&-=G9$nVv{^)&zi=v{e&BaWbro=-Wo~MJM?8=&~4C3yk2xTsCuzr!z1a12H z@MsvdX;Ay~K`HTT3Re*(QrS13iw;tGqz2#vbBYLYGZlN*Hz5OP7de`b2Rv1|`n0nrBcG|g&5KoH=9qx3l?E9l^OCbV`L~8Dd!I%y zOL(_@xPHyPI_LZg>nnE?--vgWQnP5E$1=~ggo?b%L%V%RFiO$uN|VOXCpO~qfR@0w z-A%eAmU3z-R!?@%>ax0+z9S7pVE0Y-F3tvCXiYXn3E#o(ZCr&alrEJ9Os!WxCwuNd zE?G2*K(0aMM3xu(s}YnilIl0uLe=5&YNB~JCbh{G4uBvhDq++VQ~v@pVZNgM;j;pm zw9NMo#|KHgp$A;#7O7aF1kolj(esXxUmjZyl4eWX5G2hFN#k;)93z~e#qN>Jd3>|} zYWaYjmg-NbjmW9$M_jejPRaE+u7VJQ6Fx%d321WR5{OmzG~eJ__SZ0<91_tI$ry>B z5k6V&>>kt3*T)A%ili%KTs<#VD9m*mm8l+68^`H=^891&dZR81X+0-fEvguaDlx&qz ze+V4Vv0v>@J`yH!GFJ1A03R zs5F0-KMX)owFZ3rZuwL|4C)R?4Jqn@oQe&|sU(q~*??fs8e|Btqtv-lkRERz5bVfY z6?GXZR2Ljgh+dJ00i^;L`HgvdmIu|lb-=ItoPGuO+%24 zOMj-z4sxE=&hD+KIFFD{>!!pt6u`Vet%Tx4+-={v=4K5QI-lF8gks@-A@T%F@T7|79=z zYJe()k3V*_Q>y5{T-lwsV$bVHvVYZ7HaITd_EK-J0Q3CaUa93rTz3dG8^kP6m#r4~ zSD6<9CDGJ&tJEiDfz-VtD{?#a+o4qPU&XVXL!fwOz54mV<;mu2AdQw)pT}O#B&aP$ zAa~Qsshoe6!~Q!{J6EK1?e}6k@~;>5`p~Qno?khd11htBrNi#opG~;6{Gtja-2g7U zq|@oW%P*z+Eub)VYv1{0IVnBhP$~D(j!)3^$Uh|C^8lz1pUYmEoBXeTX(_0dg7SeK zwri|{ANZ80x01VCmg>t<=y$KyQVzZbLgBOh?<0Y;r3iorOry~2^`ckEiia!E2tgmG zR^FEsTTpR;FDKxCO~oN=>d!3Nj&P7g3$fX{vIZOV9m+qsyqKNzs(JRup?`1?`tbiE z8~*cn|I7?HP@n%F^7eo4G%IM(C20CIVYC{`5+C8N6kVZP%T$Bi)=sHnr|gwtvZOoK z<852vXC5vWdKM^z72eHgS*b?wKxI&to3Vc#{g}R%qLrI|$O1zz*SA?-KmMzEU`Z<0 zhp#-P(EpwK=0B?p3sk^TGeIM$p5S-NuB`8$S=Lgq^BZIpv|ctr{g6M|?BN8}S=Ug! zNA|5O<*oq^)P|c=8Y}gMJJ0|}ehS{w)%sVdIYLSSbfzH`foX6bU2*Hx*Zi~#C!=Cl z=(&Gp1H?bAPXjm!O|qMDXG^s>?vv6CYX=TTOH?WtF%TgwnD+G_jz*dNOA9%OCV*$*Yf?mqb^Gz#SAw_^osqpyG z_7xo*@lasd#~lh#Gv>C7!&Dm#rp3MH3d(VZ6#h*$e5+85A#*yg*}4YJ5UX~b(xZ1r z8$SQE(~0L?>VdKtrpsM;j-C?Q5`45qmxAg$E#>BH`(r4>13yqd* zq^g^x=*3v6wr84vC=V5+-D37C`1W6utO-tggNCOaTI9j{erVUysYsdKN)%U3tbk ze9`W^+jQ-vFds-$HRy3)P~kND@-=cpTevhOjj`{n5_=VX3X z?W}hlni>pR2_uJATkpvuRE)&d?sN?R-SU~C_u6OoI!{S^fksPgl~J%+Wub04Bj9;q z(cSon{yk-ju5+L{)3~w0E_C4lon6HaspX#LFkZU;*^UV{dUkuhPNa@G)V-j^_a6Hl z-sQ}!$1$%4eEX~;s`BBy;PgZ>>jt{7+<0Uy|0$iVw|w0 zR?|yABCF2WpDJC!>U`QTv0vI*Ah*6U!MgT-sPFwy|F7ps@Fwa-=BOo0QWyPDZ!FnZ z6+@|*3(@0*bguys;+6B2j_3MR^RqXNRvYP74@4wm-Itm)bH=-udNxhJzg+YBbU;Fk z6VIIJf8U9BdTnC%?4NW^0<+HR@i#ao5lA!;XYmog()2Zy;D-%P%LPG3-A{mJ@CNSZ zF}nP!tQHstw<_4G6PjT9hxA2l1{m<)gKTjK8bHLt=?S(wt8g!PeGp#5Bp8&c>w_kqXkc0&kvOx~_=jmFz|-hj zr1l^)UCVnfJ%_Uaq6sSfKfJ`fsbKI(SoKDK|hQ@bt-EJAXz=-_SW{v3gp;ON zC>TctON^M4vooCiE4`+^GG(RbKTQ6n7XGM@9Wj@7_6b1QsH9s4gxXe4w^=kx41Bva z2}aUN7iTMoehAyl+0xuZCg_tPF9dO*PNDg>qfUPA&K;#gI1f`#N5GWrn@N^CKNMjMab^j+q69#NB*a_kH9y{|sfG|a{b?-)j)a^(x@w4bIaQwk5Ecf?7XhS!GMEDm zYnlQ4gku+!;FkvPA*G7AfY~;i^uA{0;F;+mZr_g=phcGv2rUBWbMkl}7*K15CK*c_ zq{0sI&5v8OHWBHO?hwMsr)OuE<`zNQmMLb`Hq&VW^rIv}gMoB-3&v_{?`xY#b*09OL^X}ctKeNdzj$;=;b6_TJ~ zNcxYVSTzXiBy})sqLP^ea0+r*0W7dz zW5rzFg~-_MP*M-?3ekn2Op+EA)R>j8Hu|@2FTM4a~ZkF#Rky9fcEAaf%QX z>L(&^xRn9^NroulMQ=*<8oICJf7nxC2tq_b%xV%caA!}Zmk)%p*o`44ZN~ivhKv_y}|W#L!bp@i(7$WGM{ztid!LfExU${ zZO}>WS5ICA!;E2qNQA7|A;N|CYJ_l1&9qh#hFouQR=Uixz8UGWyBEyDr{X>u{82rU zlSUDuWCC0h@=z&S1q_w4nJ^B(2!Ms9(!l_#Vi$m&L0&&Uu&_|e#ukaZ4XGL0n|2D% zPj`GBHZYYzMsCy70gzLS$VdQ#b1;lu8zSbU_Hyt#gYZTw&-G5dc$&d8mt9fqjmw6f zqGqIYqiYX6)j=U<*?YQP9XV2-|5=!ZcSG|73@t|wM+^l2b~fhm};fZ8PGXki5~ zJjBlC8&cCUQSI>MTYn^Aq5Y=EYmjs|a?-GY@*41qP!XN;Yh0GtT3g9bRY^IOJdNCaOcRfM3GM-Z=fOB)Rz4y z`KyRLHIb$bzu61`)PY>`J?1S5e_f@%98rUFGJtjQ6qF9%A4v};aB$t$JS?r#m>_J zP*Fo_Yr?J#a;rMozpEY_%#TtxR0z0Fju-%7NIGhpo8nAxnE{P)lk|-xm?__Z1DwIN z#xF76r;UFjbyyJ@Y-ZjMa>hD^!f1D0EuCd$>88H8aAK}=u*qpgMSBI9HR-t)i0p|5s4e7r#IO=6fM-;O{ zRRR2}&Vwj~KIY~OxM=}|MhI?(4i-HN@DsvyCX3%}@`KeWodCC>EXEcO+ zCOyFSbk_9foYPhFZlYdc{erR@haZ0Tw+FB60Hp>8<5aRYBZ4&pNMz5K7)NV?l4X|% z6n{aPc96OeA^cXPQ)oEq{ zf6ki!6{V*LgIxX|C&#^iuMd7G1!DP`YyQd01ONYd^8bWNAmRh9mjQ;`TU3`*+Qg$z z2*OXXJGxERS;KK<>JN;f=c%m-?EY1T!v4EQC7!!fCqh@navsvMPzQKYMcqsR9ehP|NSePXW_4f*>J0L*7(`AoxPWxBuZ^5$Or1jRRjxjtTTIwTOVdABdmJ zVDe_%`DNjt7Z$JB1u54+fWlGT2V7j0wNh6-Ktr`(DsiKJi}K_1u^5tP69n}(+0zmc zJlGJ;t>qs9rp%R4%b(BWD?*;-j&dCLLYg}dkCX1FrDR+I|el3ks^Yt%iZX7BzSMv1kk&VmB0@?0|q2~5};MR z-fYyV5%8lh^BSfA-qU1Ba&7*6SPZRn4j@2O1zoxmD)qJh0|Y>VkLHilcm)OkwNTBz zsx2|qSUUXMD>BBva49x0r;0lJ2gau*v|Afv2R_9ZEqo2kmgs-lHzYN8z`nZoQxgEw z8Hr;JLnw$C_Apb^7eZT)NBS*v%Yza;f=e>yWGPs&x5%V$AKU3 zb+pe-fjN_4m@ezfAI8e3HgUot6-Xv9x;0n0|M&-@bWq1>uetsZX*f#tU0D|2#b{cF z6RD(pw5K=8t8QjzTeQ3iO7%ibAi%!TGKHP{++l0&svQN}r`C0kC*cPH{)jp8cyq*L zhz03Fltd+a?Q?~yB9@Q@G()k+BnSqtFoY2sFGART7EM%QAJ~^_SM5YlbTD6tutBY+ z*ilV~F1AIC5*jc`V`x`+&wiB9g=Odt-Gd>@`5n1NW&3LofjO!#p6T#-93sCOPNchp z08~X{%_3bb^K5yC!c21LL4q{*1MDqf zjgSgWSjrZ4MGNAi`pTCoI!|L&-%Dw>z64H)U0}#n7eS=IF#Y_GJN7l_FD9;`@GTDc zM-li2I$hU{bW$`odMUrTeh8GwbQpv>!o@ku$>W=@_wQq5+_6_(LyLQ|KsVi2l z-Fq>cA@9YG^Hl4KX1TIM>EM#tD@36SacvN06CIt&ahW=EgtA!+#hVBrI+vRN2IiOw z`lfSq{K^e4{_$7`HS2yH4O6z>D))4=lN5lN(|V{2C@q@toVv|mywBuScZr=yd196ef=dtsN8~1L>f3toAJRtwg zMEDiZiwZbiqxP{p;Y}t@B;wy)sS`i&LV%nY;R%2%yS)u+hzt|wvuHl!^X?( z(I&$&788eS0a};Orq{{P?)nBNMjb^N> znyY2I27YNA+T_TiyYrs(AdJ!)TA|Pvc-M4mcuA~_GC-^RB=p-|)vBkJ=;Rr63EA~g zpWFg~qjT|(IT15~B@-cXf!L^y>8J)ct_)> z!S{5LjD{&^%Rh#x7djFc>u*6wmT7v!o7@nGZIeh22BW8A4+22F=SxFjIaZi^Pv#yz z2yG+v=lja;sw_2=>L+`uSHhC@BOx%=<~IO0HRpq0`4kB89@PxXsd-B|Q$&`+EtU=fkRjRwWqxFoe@L5B&Sq1dZ5~;qUlTbE$a}v!rO@ zxV5ra(&XIk3*T^jcQTr=PshN9**AQgV%{JuxD?z0;;|8(fc* z^9up-X%&2)-w?TIHkERsubucMgBJ=|5R$`#=jGN4tK2=?V4#-~W$Ax>_;hxH(yk(s zDE)h?L2ycB^KVKPh!{-{KNFZ6ScsqPdnmdfn<$Q_4E@4AXd%3P#M&CuWV`3CWVMKD zrA+70p^&Qf%NckQ=!_st@9?5(Ka2jFF0Mo5~x)vXR#xu9} zOjqLVp)8O#KhJ_PF7gnr-QLhv4lLnFLcv^06Z{vu`Acu1>+}$$5z4YM6pk6*x;2x@ zi#jWuEYeW9I<;X`Q!LK&09UE&Zq;;>N`v=kCYlR!js22Daf9~?Se52tUd4k2xnU?H z=}&PU$)4xKd4YbB5Y`}5dA=BpO{>R+BJ32b-G<*Ej)~^Z(TMQ53yo#_UMc9rh9xJc zU{whNZz!^Ul&#{~9ZzEHdtKOpds~8LfKGIJ&hm{Ml(d^o7y+&d5*=gyqgf*ef>rfS z#)tLdkt~cZcVhMCt0uOc3q9dRT`~CB$&|01&H?={98EiOVzZdoj9y$2dccZEnb-9! zRF%q0S3=3(qf0(~aTGBjuZZFSYvoP30j~>8Z<sN!hgE{Js*-AO6uCSC@3zj&i!PvkUFi*<2>u;J{FdWkpLwx9}9HS*UO@EIW-zB}+bCH>8n zK5&iSNj{ygsCtY>*3Umt!{*KBURe+=7BdPoL82bs(0H{kHfsOaaF)gVWPpfdWfrm? zr*ADHj1m3ivusN{bL(%)^K5)R>}k_)h89NgV(3kbh5qY{VWUaoOk;87^pF9JrFh^2 zgnD9>8T(brYJcK6VJ;lr55|%%3L`4R62+;aHwiS|a*;b4BpD;las3?s8A|AD&xx;P zJyxoAdG@`keh*9bpF(a)VBe>6E>t?aRrE_Y#YkB;zEk%4u&qV(;c{4UU;V%GBG(P%CqGuSIRJ6#PKK@#lf%MUxsu{FZ-=3@qV26xY|=nIuI_WV34HWVj45y8FU@xsxBQi{_ z{X2$VlF&* zNVK_CiaW$U;+4>yaIc&xiSXdSH(3KRmc~Bq{GB#Lr&*ydWBLu}@1Zv}zQCoe<<9t^ z3j@S-(Ki&k_M!T@lvPztySTi2*Q7%e(l7kL3j22HFPecD&SjHVn zJl9n{-6Cl$zIk||m!U_M){Rayy%?wLV)6AOI}}V6C6oPRqP*!=jBarSAe+OQGSE|ALjxAnB@x zj>xtSw4j`hO`B>h;ZdIT`%fb*I5Gzdt7}|vytRhn;#@Lum{$A1bNhDWkDt8&>S8dA zro4_+;CM@UpdYEykXd?LiZrr}-A&abg?nd#i+*Ger{{AWX>F~`| zv!j7F&93Qsf_B8+8Ky3(4@AP?4@!n*NP9nwWrsBG?QwZ(OT7728Gf7jYkUhpp}W}_ z@kVb87L1bvujqr&Bgqc*q!@Ouek^W>j6Q-imt+U%+oLPZGU@{==ejn}1vId>FPv z^#)f|&nC&`xQ_%=2)EiKsqYcR@`e*Tf;Ro`X79}my=|9B1^vQ-u+9 z+mffE6WVsHGB4i9E%tss=N{4^8%HK>~8!na2F^K<1<1oDdvQ~wN^4`Y$zH%4@NtT*D}h%flG z%|XK2nHb=(4)kqrJQ@nFtcR>%MfWFOnt1;rzt7Ykjc>^18+7s8vM%jrku*EYS;Vio zMNq7gsU?;vp$yOM7(zNo=S7udFar&kHLl1zp@K*XO}u87a#&#yfl8}SeQ<|F5q zoN%LaTFe1$Zc)Zsvpjc|F!tO~oBYUTk#{3QKQCwdoGno(x9Y+me(0BTIyx{-SOPkL z>+eGGfm^?mhtYwZuACJOTYtXws#o`ns#kOSKDcmT?L~At7*6w}M18l02fF3Mti=O{ zYZ8jnFSmpJI-dyZEMY3#AuFPQc ziZ|;OT4LL@^Q;kUwCJ#lL&M%T0?3#fV+uM2J4-H%#ZN`--Nn!)y-4Cy;(VOn>(#nr zK5S%7H{gd@aW72YC&C**oa24_376C@Ofhh>U%Ook@8uD{rBfS)c#!z&f3^3WQB8Kw zzS2Py2`ELXbOosbp`%0)fq>adfzYi(_Qzjbx%G%nLT^Y?BC3u*;UI_JSq;ON`t-dP~12^A(;HV4ARbG`Vi$G ztjqIc-YRLd3k60G7``S=7ux1Ry`DIXz@Z*_K7-LFc-W{)l3)((N)Mjckt=Nfnr3xo z{<$dZEiC0XFD=1d6Psk0C1Z$peSF7lJ>D=^)^j*m6gV5?nIg@&}1jr?hv z5`JjHJf)+)-O%xfnUk3N>7Q>hyJJu6k@C}c_N`) zY{?nclxVHP0$e>CW!REBq}Jk@qO_J?YnoD~D{ORKKluWUr|vr(4SrEs*vEUZc3R#g z(XcAK4GVl#fP|X1WItl4^56^^QzGF&3n!C)KsWV)AfhN6Q4Ady7xHo%6!*LW+ZX8S z4CE5sZw4>{&};)V=F_?h8O)ttBl0IH)iPB}^VPP0%b7qT%UCV1r%M78j*vk}>~)2thKVpnlE#{B zi3=jD_583UyEHB}1_d-#)nnE3d2z?D#2ZIX(E>8pZ0e{wTtcnJ1kiQNk9LG>ZWnj? zcoZmwjbDh~cxTz*)Bv+P^?1;&e#1ovhFGcfNU5lO6VOBLAWo|#w~PC-os5EJqW60iv4S@Y$6<;5{lT=7b3J#*y+)|L2>htMtNy!qJ- zBDMC^0#ds8zF|*bVD3DO{dn8u5k<$SD-bv@dVXKOxFQqOrzQ^Wj!7a&Cp*08+~7|f z;Ae6CM98Solv&A5zV1d0BgZ&|P4N;*o&ZLYZmkf@gU7k9C!DX^Py7j}J)l)LF>)Q}r@S{I(tmy!i6Yr3Kd1P34A1>lg3=E&JJ<6DA}F;WK64(c*`b{=MD% zz}>mhMjlgz8g?%|B!sUCpy7=N_sGZm@)VD+w`dcq9If8pmBgGx@>84dQ!1SX{&lk=>PU&tB+y@O}SVf#zO?{Q{&C*+0roc-JjNhl^ zcw}<;3T=Vp&v-pP!SBbA4Y_M^^<&^Ra^Kk%Us-g`1s`;f9TED%S4voYhMEuEqgBqm z(=uPa9-qs$?5EF^DQR2DEkU;-q7m7Y5~POSoV2ue?<%W;bU?4e5VC5#7O&dhEV&bb zx)GtAQL+-z0vh2UT5?k6=d=ws1ZXLV)hV4u@`Km&@8A~~C;iR)YHKI!6kjxU_)iW# zt}97iH#dLmE$edYbdBe#oIews$^8@aH-~#dFD#Q|nfazRdv(b&L1>v7R3&p>q)W{fd8w(J# z5H+6u&~K$|3wKjw;(B}g7B!2c8rc06Ehz*=&INYgb6?zu`?dvzNK_b^g`(eyS9tQd zJ2HLR^p6J7gV*=(c}Zo>va&Jt;h0iWbD+}>)+H1Ygf0-2 zFBd^f*UR|-J>SVfQeu`vS%sh5)%AgZoz3S)JB1^4M2uB1mfM5&)x zC{A^K>Do&og5qQV7m^g61$1kbUBA|iEG_>TqkU&42! zaf@Uye!l{CPM$RVg!#=ObES^JuF!;}OPZ+f{InqJ(ChnVewav(CNl-T`(Iv^#;bE- z9pgZ_MU}8rdyAucf=LfY{VgxS4tDrlDrM{&Am^<`Z&N{x(KC6dt>=5XTSb~Y3DB|T zz9Tj$Uk{Sg>hsIU(8Z`ya!}h|rV^QaFvoWEuM~^(8qKAFM#+UUCd3ZBLA~hE1SDTL zv;IoG!@1=x4HT{2%4UJRSarlX>zC~1wEznn7h{LL1J*15 z`az!~ZGP#jsHgeYC7n^H6s70MG${h0H}Qc6;I>=$gYqA6X>PFm)HOobkn?70@EhdU zXdbV9@01`w2s-3kjjXDPvT6hYhXEtRn1hZC+;Y7L@3)K?FD@Zo>2cV zU6}-Qp5Bxot1C4^jT&H*eeQ|md?VV(g9;Lh}#TfOtTcyLruja{YW#x$@ zmd8DcY8%z(;}ImNQCQ+B&eRMZAIx{fK5VOGBJtEF!LeM&zki4w!G9VOdS6zeLm$RRQTq zq1{$Pa6UO)g?%3u0x!F@O3*(OwQYlW$O1;#A+ubvti3GVchVM|HK{q-tr<~4f51GFc)yHfJT}#!M`_-WfLgG;`LUm5OgL@! zy$g8=Gp2%0VbBADd^`r~*lMP*s>>+9)yH^z=4BK@m|QKH0{)YRh7@{{MD2i6ID$Wa00YHtwW z8VC#RdxBWr_sW-WDG34=bhk&G_LEH*G*rIN4^-Yk4TbP_NX)!4{lXCeZ>n-iq3MN? zUmv0E4Y`=1WED$!E{yRN6_gjsZ;LG+dBrSEh|+Nwbijnm#wGW0nh20Qxb>tjj_b+y z&O$jF2ibDaxOD=Q6eeNL%7-!wXMpl|JT0|82q&>!g}@s^Y*pd)Q=KUKnw)-Z{^l!> zn|*NN8d4zQWeG*EgtA_*KGtZ<*7{Hh?92!h-f&S)N0F5lC8J02n%sqJEzH@+tM8i8 z00rc_OOkA(4V}w#q%-Qqmjnivh-q%r68$H+Q#Bj$ehrpcUrh!bU;7TtJke+9tqfW9 z@zuN{>&5|nv6&5;6=8IbI=nAvRJ%2g48*=dzYcS_O8injZg=r*BE;K0RXuh?^bH3|dh_!Ds^S;s4h2L5^Z2IrR#fjojGvBD|H&mE> z#s4^bjxp&4D8*E{lS*N+J&q+%Fp!TpMM^dOje>>BPM7z?Q+xjb%+XGY&w|D_@Q{R$ zT2=^Kf7?ePjB~L{#@03^?u5`df6e;*o5<1x-=5lKmegBT4bRjmgquwc9yepXLVZ5_ zRtM!JD2A48oSe5N>K%9+;|tzg?nz0E^|}v?3(lL@%hxubV+buillS;7l0B&rWKg1F zg{ji`iX2LFtJm!l9akOeXG8c#&;egF=E(9@5h?$RILRzq%;p}=e$wOPs+BF0BE_iC z)92@`+$_d&N2o&+TE!Al_ay{37Fwj6rQbkBwBUUa799|Q+O|GY{^f_-srF3;jSPFU z(IO+M_ANV=9{j9IrF?7lpl)C8#Oed=JZ=Ti8KD03AzU2X=lA`ajyrQ9(@&5T zqzFF2M9FO9PJq`gK@4Esi>H@~G&+{xdj?-IoME{bg0TLH915bvl#NKukGdVYi%-E< z&~Z=1iZ+DU&^B7~YTtUgq4_A8CKH)cX2Z({>qbKi4c;iLbw(S%^jMIy4T>Pa-Sc?1 zbU}a`XST^X)%lv2X^o3x{&~RM&)LGC?BSQ#9?9NjQbSE+k}=d~%RT3vqPR2dw2b9irSzaNYy^{Wxrf{_Pw(@M^+-tE>%mop8xdCQE z{S2l5n43{XeW4UiprC#>x;{xNt=3ipnR<7T{eXTW8EV>m+w#u4{tD<mgmzQB{a7d4CnNx>Mh!$~q=K`va!b0`tF0o~ zS!QjnWp3!BXEZ@GWgMyg##FeY$dUc6Ph@Y36H2o)I9KydM05IMW^8Qlc~04rfD<4m zOuqKI(N_jw&I9Vljqh3C&E#eFXCe!2I`fMQ=*5i(b9@4i`=AdZ_;)PtAlg`(FZ0>I zuhit~Rkb%RTR2)yfy^Lv9H(-J)Rp?wIeG~tGhsq5-@-0hTLc+C;h%Fx&k%UlA?E$e z%!x{Yf@!=pCTjC&rE!2k zGtU7iKq2(Tmh^tu0Uo0P39*;1-&tZNcT%$Nr4^YONtWL zz&}yM`SXP!To?G&DfFze?l^P$Y=oNKpnI)+Oep{swD7b`HZbaN20frnRuNTcA+W~X zu`8+J;UuDZlyQzCt<)=ZA*^!|EspspPuea7MwapR-Fx&RiKmcfWoP{5!Zn3G8Ox4~ zATKUk$j!~HgR4gqND``hGaOpVnEhBjvz|lRWCvz}7v`MGhGuD}KP+ySNEuSyQzm}P zS?}SQ90fvJA)Pj1i2HGES7C2DLlbx-3Ms7&Wi<2*eby!6#6s_}7@I7AS$p@H_ue}^ z#?D4;g{i@5MP!A~3^Ex5p$E;j!OP;zLq|2^3&>0Tz>Zg{M|$vN=C6JU&q#ku0aQh2 z5JWoC@uloIWBDd4XZg33QS@$-+xyCDaAW;DKe_uSH6KVXqaK$RF2w(L89<*rqOHL9 zFz0jTB7gY&{`Q+?_W#iT#@qi*{Ule<6y6Z%;QeREC=)l)8hjrl+~9N2P5NhFa)!v# z>%fOb50XuZ|I_$0Y`j(u0XmtiLDJzrQ2E=%%EaD$*)xUc?VHvA1*8A`7eY)W0HzLi z>iY+iXQV5d${0h~sJ40(7lr&B773&n*h44jVlX1}P5*)3hw5W&!ELju;EK>Y=3oyh($ zUdfJfUQrJlY&aFDg^f|nPSZuq0RFcN+f}lyF*2u3__=zP?pH0DS>~A&>GV_=p4H2K zq>0Vak_Qi&_zm)AWo8YoAMeJdD)^tfeuyBwf5(C_f}j?OHt_6f=|ih;MNj{tXA2zi ziVR;-r%>J!<+#K92^^wC*xBcebFL{*<~!T=C| zHfRVq)1adUfOg}4V>nrXclHKAoFrXJmiPy=i5Wl{0)u$)a}Z!~5kuh}cK~7rjnqqj zL{oMFKhFVM9+E+z=QWJFKWSul+&z zyPJTNE?RDwE2yE6c7RxK3d^8#CXvtYMjE#sT~P%pWHO=`rUr-&g)9}%hM#g?K+2-! zn_oivWp(@j;`a0r;`@Iv(GCU5_)sJ38h{F^Rh$}ZuL1gt;_ZBKrjiOk%5upXGJUua z#SLwM*pJ>=`AniwK%x%UYn%E^K!uj}T3>{I>#sC?|IBd=Bm+`bZBXs4Ja=k$cR^wYV}AIPXuTdTl$1tvBH*;vsJ{AHZqqQLDu)?yc8A<8B;)Az{Dy zfqbXg+)wsF(i1<8LZ|msu|L0q)L6xyrR=qOaA(h$xC&_9J98}|AwakJv}s{Rc|Xxj z7tav-z;i8X0jGzcZh3n5-n*dPX%4ZcURX2#yWfu2K)_y7tRG&I?lIhlsxo{03W_X5 z@;_n4?+%p(6i!GSXgIu#G9?!LwRRpS94%pU4=WPP{A)G}#BpeV)z!Xv@-y)|2-u~D zJp?#AC5NJ^%brhtm=U^M68YC__WXv4LT=NKB|W%Vc}K7N4vBQL>c`lZY|Y=qB8tj9 zj=r~1%wm~SM2v>UzU8$xJ9(Ttckx6Wa{G}_2WYh=F8#;lxgis2vp`9!X5Coq@~#QJ zMAp+X5fQ;c+F!r4Dq<&x*%((ZnC6OPIGqH!`E(EdI_ePFo!0I47B`;PL?8c)9jA1onOfrlY6l0yiKD&U1qsgohr@2qlC zvl3a6BR=B@%SNt~gJFaxF7nG(U-L2LSnjKrBQBMQ2f18}osnNQ+7bOwCxl6{bX}Eu z_ZN4NUxzgCRA!p1#DviGA!=W%Jw6SIHus-}z?eX9k`_8{6cIhuWc9GIFMv_?NU zUg4fAE82-t>IxLdpE^met;CbzBR<9;04MoHTR9UA*T(ZpPhP8F-#-{Rjo@gR&I*=2 z@y>ObMQHg(zn2h>k;_VBTfJy32yG3Ye;hkGxXWIwG9@aeSkdO=-rhOgoQ3v1-h3A` zmmO2t^}|#bQ`NHw^y>{Jt6%jb+`xAAVN#3WSUeg3?9Wi@tKAt-9kFw?jx3< z7Iqf*F3Hgg?Je9p(@L{@bKLAt1+3;`xDjc9YCyot=Co*`IpFb0#Co8JRnp_D#6D}~ z+&kkUR+v!X^SZglS5T7T6?e}fio^r}6&lqSAn+-PU>{cR4iSc$<(U}%=A3lRX!T*# z6k}W`HO^Wp7-s&+qr|BjkwWEWH~hhH3pNH-Yl@X1dg`+?{VwNYQ)`lb)L|x$b@%yj zZ~7YDI@56kcqSri>v)lIJXrn*ZpwecB}M2fo_db2>CkLfkE|dR-C>k98MM&`GIkvu zDH&}`Vnkh+eQ8m%T0ESoxLSx{G(&(lS`oU?NCT&$rc2Csy!yxy5p<&yzSD@B-B+nf zb#dfeTk(ZKS@1hp+Z6Bkj|Y>vGlf}QH%rePjt$^LOt0E-hHl2cDA>IjsWtq{$?fWN z!1$rn^y;Ysdw|amtI*9(7n&vdoR*{O<02{5xQxAC!j#Ofx8p&Bm5`l!q4uf{*>qbC z#}_THujoY&>KXB72KwD5AgKng2^KRAA9s|xk4@^gbbs!5>o4CWH~x|*)iOW{V@x{D zOW*?ETB=!JBjkLWkw5y0hz;Pedck&;SlkrYH;iTXhY-FxVKe*gLx7uvC_l}$18_DaD7eCvUQcUjk*D8T(j`pWrBhe=tWBlCl_6qa)o^!AKVuks@ zpyXixowg>fguDdCH>W#`rq&xz=jK)=3Yv;G*)9)rdEkFCVnSJ3dV~4j$-M7-CAt!a>^H8Vf zfBI0FI1C6zN8b|dH7}Blv(f41o72?=ZsB+{6=Acte?cm`H%63BVbjyJs4fuBbjVLP z;JD}zOYxZ!uc8HlVhPkYxlnl9Ls^a|i;>`y9gW%D^#jc#V3ka$RBJf#m%ojMqqHH@ zca!VI-CQW8FZkU+3Wm2%Sx-aF# z)TDXhg@f#ALC|pC=^xIo;6G~p=d!bpnsV+yRDdIM2&4pyzhoqw>yEa(dz-J)p)=Mx z*84%~)yWStg>j`fKb)Zy1)!AVQ%8x9yu6))v^34>-18`fn#ojYtZ&7bG&IxiuE|l4 zOB5--5&2GjEC2a4e`k>Y6CcVRA{JNRRwPfOZ+q<>QFp02byfnoZ5zNj_fUF=r;!oMVryEeD*N;*2q7Xq;DSCHjL`s?F?Rn8%)Gy zxTa4xs&8$ZT1)H0h0D@H(NXQOBZvFl==RhM)x+LcRrxWnm|w5=gnP_!2J6x0Ojr~( zF2lz$Aa@hk(@xpyb$rX1OnGY~)tYMr@3%V{qx~U|I_G{GVcg~tf0pU@x`0H_+?cED z#v^)P1s*84K86o9;*uYpg&$TxL_x#^D{#KV2WkiWuV_%xT6ci(xSWh-(Z$&?7S}7j zUBN=H_U6ckK(2*ngv2o*zK%jy9^W%RXn{Q#8vNW{7$9YAb-1*t z-IPa=xX#i3OKw}*?v8w#1>OEUe6Oa!il4rZ&w4ki-T+@gk-Xa;OY8kAQ2ehJ)iN7InJ*h>}b_G#FSfOZ!~^J;C01Zb~1kTQ=Ihh zi}pWHJ-W+~#HwgBIAUE>iS5x;HcJWIm>2Xlsa>kooBn<@kdNpr4Q$vLs=CzTyS{Ha zak@nx*yfscb2URe$iq24a@Y{rBQFsZuu%lv@$-1P2E`tbj$sCe|I&B=KnJQcc7M3wR!80&?SMLEvo9|N-a zp`k4X6O04f|D--T|NGRZr*sAtu*Uprp1OO0A(5@IIer$)2tVi1&t+dO(u=ImB z3g5ox59!V2&e!?~8@*ZncMyAf4JdrHu~rw^!BLfai&>hR&VYf~zeq_D%2bDsS7!|l zz`jip*633d4Dp}^GG@ek-Htd$&$FEEHIVUn34u9+zb}L5^EYQp@%UkeWU>N1DWxRWV!>oJ5*zpghpON1GJr$t- z3Y5X$jbfSO*qIyA)GYO0#4v|_gRNq;Bse`ka0Iq8?~!)ZLs0&D)t{Re79R9mz_igt;)qwp;D z{##~=7x4IIpOgLmHN(}T0vMHojS%|AzounU0Au!VGg^FnmTR5;t$YbE=AGB2oo9pU z-x;S6GcLfOd7Y5@e}zA*SpjenqbkkfAOE)SEG>T;2^dLAp{?1!Ca3;?6ySt|hEB2k U7DeOKIpC*$7YZr9V-fnl0GO4aEC2ui literal 0 HcmV?d00001 diff --git a/media/butttons.png b/media/butttons.png new file mode 100644 index 0000000000000000000000000000000000000000..1915eaf1999cbc56adafb4e39619b0c305a78362 GIT binary patch literal 1456 zcmV;h1yA~kP)4t={0;sCg^4XuH?cJlUy_m_v=CAy39*Gxs-Rm)t3pvM_(83x?P6%ErMtC= z5~$5?l5RHpIy+}J$?WZiZD!w_-SaYM&hB%={UK~-_MT_Xb8+VE%#65|1CYsNa+o}# zI{=wXCbycvL?)9%X95$MOb(q#Kq8SyAyY>%ZEkKF<3Y-9dVbw`hPw7IzhsPiQCBc! zv)RzQTXX2n#hcyq{3d5NJ-=?)7zrlJvV2cXO&Ql5mSq{$9F6tv#bK*`E|-JjIB;Fp zH)9O>d_MHG55fc{Nj4cwq7AI0Ii{zlmBUFz?Tf`?6O6jqah%ZBJ_r+-B-vCj$(mh+ zxjANLWoTNjXC8|w(2@}tEULaF%6DAL!)YH+h{Ew%4=%qtuBqF}nR46j&d+NW2@ z!T#+hY|p+uIAA*IM5$_S0#onD#JjzW+8^Jil)g4r^V(SRrQ2Q{PV#mgM1OwR^m*y- zgum_n_w#+tng~qo-dkOSS1Q(a=6OK1>hJqt>k0BV*RXx=41p<#=IHkrWbSv^!Q{Fw z3J<>X;lhghZHwBCYf7CKy?v-XpEc>IeXrv^^kBODQGLdA3?|R>_g}44;5@vK%+(ca zO}uJ0n7W-TmCa3H>iw8_x0g}-+GX7NCa|=DDRu&wqNfQ=$JqtJl)ki32UEjrsRpPc z|Iee`K5}1uVLq6GZf=va^X4}dOu0Ls)n`o1=^soqW2$Et1=GrW=NVJOtjQ}C;XJs9 z)Xc|9!pr_JG@$>)T#`i@+oZ zrf16+aFope-Vv&m7ahX;V?p~@V%kK@Q(S;p4cQ8U()X$xbqL)!(*&~`&=?qFT58{ItQZHT#q&6Pwu7q6 z;MpZqU4|-iPSDv&% zDS8U*`OTFCCJA6#n8iWzKOAND;QXLNQ7}ns4$j6Ffl{GRkdj>_|FL^{ zkXQ5p-mbM5gvIvkStQ?mT`7>Xfk~EwYz`f{WjBXqS%}BueIK**<`8IX9w_m?(UP8( z)9YSDU>XoG_3NdjCHc)E*w~G0MzSy8RMlRG2}}kyx5?Q>nxmhb(P&gnb4Y4z+qOHx zNc5Gus%js!2}~h(5ce?!ncejKCTBN2zi!wB1}0NHNZC!#uRG6B*FFTmQ4S^&iA2&V z0uzZu3Y`c{BoZlfA~2Ciq|k}LL?V$wCjt|RL<*e zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQp`b|X2iMgKX99zyU5ayWdh)ib!m?+r#smSoA5 zzS%!*l^x1ZkOXiJfCH78|M%}@{>4u?LNXyrP9>#-pHM<^l{fh~f6D%AkFfvlA0MyJ z?DKu&{Plt3mcGCKE%kc7azB18xSe6!^L>-APh7q>viFTo3-n}tKOT+bzB}*RaBWoP z`6iVtkEXV3qkcWOO}T!<-K_JX|29uIgeZ;3LEgFPtv~kPd|Kf3*ZI1ymHUO~tWUg; zUJMuK<=TvZJh^wf9>-&Vo`QUPXI`UU%lqKFdOhJ^VwtWO@#gIZHon~V_w(Ho9qtyn z=MRb;^P4-@?^+|THBawqNJKPUjM~Arw{3W^5putmC0@dBa zfGU1T->4Nvk8FAU^*{l(}pLNkCr?;t101?S10h{70V1*FjkAw_|YV_SQRA)=xou&!oJ7S8#9Xi-E{Xtzc8b}N zZ3s@0Q_POyNQ&q%GAcG^SVas7!?Z3gd&lkzxj(|q#QaCNxqm{=D0Ke~CI06AG^$B!2ZTAQ$OzXJG;!~W+5YTObduzv2**=|*@vP?Woy|lS|JBTr5?KciF@XWTtU7qBs-8P z=gQC5p3D%5qwVaOZ3RM*1~Ff`jsa+SRKkL%sc_Q~J~GSZnQD{V8&s(4m@^~&K&=Kj zTF>}IsfF|*cbb(SIZw$p5{ueqg<%c&!>BoS!iy4Yjkd_cNA-rT#?~N{6^vHt9IKYu z%A^3KJo=9CoHPUt0+!@HiL``c(L_rN8{T0&Q`YKHYNf-CgdmXIR?LmQ(sD$xq!2m- znRJRx&OKZBA)Y1e7_=}?lB~AO>>`D>;~P|Oy_857qQoQ+$P}%HcXhNy*CDV=x)N^81x^T!c%LaFs!KwjJ4DqgppvYLgFLxt9{$GrV<{F3$=j@e74@COKJ2o89z6 z;+zD7mo)BOlIhgZ$Qqq|=&VU~oYvSkj8<9lwd}qMNpd=2-gWfm7>9>AFbfv))c^`)GMGa^Zb=Bpjc~L!7@#^GfhOU6 zLqr$!Jj3y^a*{PsSM)NgG^84lkv+^zl-hI$AJ&92qNWV}O=AWrV^T&TLQe^bVv(QA z`dJfYRtrI{E228{%E&TDVd`!nxR6sknMMzk4)81$_IJXZJ)rX_)O|DqDe(5J@{5sODs8alIe0l_TY}g1h@+rHb$W>8C27gX zL4~AX{*2n@qE1WCYy|pmeAKe0j6`S4{^uhrzm?W6UOsW_&Pj-1;t!1c#^xI<-*D1= z%CuK*V!frF)A3+Uq8u!ZQe9qy3dDv3RjA-8;%4mAU6ew4AJRaJaz5cAr5IUL71o}p z3J%e%idL=8*e|>I50yg-gGy@Q`=?9wMxe=cVEWLkQb}Wb5s1}S-XVVCt>1#|ih06qZc&MmakC-a z4zh$Xtu&lQ%TPoRv=kgkh!8S+j^R|N3|jEEoC+FuuFXBUB5{4xFNh*;R`dV|u7Kcf z#PAG^4Mi9YH7q&@_9asTO36b>n6sAgpMLwL0_iS~6xg}pMh-3Nqvx4s-!LkM7R*;? zx;3UPQ|go-U}g{_9r13E!6@mHtosGJ+jeiYv5q=JfY8q{f>9auNBx9aRX0+&3tFGu10 zvf&R9%I~UlII^#6_^j_VFDuw*(Jom~KXllRq|uy&X1#Z8YiW9`9BzhwR)`DLVpUx3 zYn(F~gZe&k<-AjZHkawPMC$0*6WKb7I&&L|9Lz_@GQspU_JzF4nvQgzB6&>IoJAosQ02QgF#7ol_Jy7td&!uW-FYiz#ze z9~+XrR6FVP!`Io#9|S6GE_PZ{(!8{sy9^wY^jgke2lrcN`k^nGdt>^P9ADk(LvK1| zj(KTMXLo|!$zkxc`afhSs%asu{ouaO?d;1_v_NSjbkkz?HvzU;*?apwH`SU3yXtlm zONebb?Ns-epVK~$`m>9(S0GhrDN9fg`>2P5h>;%kc+z=JJDGJmht-^9iZ<)B!@nHG zoAWR|>weOAr_Phi-#c~sWd7c%(n2yLpC{p;;{+HTz*oF+Yzle}4U6 z*+^x5fvx`meg|?Aw(7%f0004mX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iQ>CI6 zhjx(SkfAzR5WjHLDionYs1;guFuC*#nlvOWE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6 zA|?JWDYS_3;J6>}?mh0_0Yan9G^=Y2(DbUAO2oxXc2x|#LO=+8h+s-)mN6$uNqCO0 zd-(Wz7vovp=l&f1YR+PSPb8jYhFK-vAfDc=8l3lu!>lN)#OK7LCS8#Dk?V@fZ=4Gb z3p_Jyrc?98VPdh+!Ab|SqNx#25=T`{r+gvfvdVdjvsSLL);;+PgE@U=nd>x%kia6A zAVGwJ8cHamiWsdrDHc++ANTM_9KS>^gb=iBQ_SqEP#hpj7+Ge> z3P#pj&H_d=&X6{YW)%fZm^iA|DmqT2`AWk+GolG`|Lq49P(T5tk7DMZ8>z$`?lYCN zUtra6k*QVxZc+WP{U#NHTd1q+rzeEV8(I_!pnwAEKT&U0XE+Pim#`H80000irirs_datatrain_Xtest_Xtrain_Ytest_YLR_MLoutputirirs_datairisClassificationirirs_dataspeciestrain_Xtest_Xtrain_Ytest_YdropNairirs_data0.1speciesLR_MLlroutputLR_MLtest_X \ No newline at end of file diff --git a/sampleLayouts/machine learning/Pycaret/Pycaret_RF_IRIS.xml b/sampleLayouts/machine learning/Pycaret/Pycaret_RF_IRIS.xml new file mode 100644 index 0000000..e9bffae --- /dev/null +++ b/sampleLayouts/machine learning/Pycaret/Pycaret_RF_IRIS.xml @@ -0,0 +1 @@ +irirs_datatrain_Xtest_Xtrain_Ytest_YRandomForest_MLoutputirirs_datairisClassificationirirs_dataspeciestrain_Xtest_Xtrain_Ytest_YdropNairirs_data0.1speciesRandomForest_MLrfoutputRandomForest_MLtest_X \ No newline at end of file diff --git a/sampleLayouts/machine learning/sk learn/blocklyML_RF_IRIS.xml b/sampleLayouts/machine learning/sk learn/blocklyML_RF_IRIS.xml new file mode 100644 index 0000000..8000938 --- /dev/null +++ b/sampleLayouts/machine learning/sk learn/blocklyML_RF_IRIS.xml @@ -0,0 +1 @@ +iris_datatrain_Xtest_Xtrain_Ytest_YRandomForest_MLoutputiris_datairistrain_Xtest_Xtrain_Ytest_YdropNairis_data0.1speciesRandomForest_MLRandomForest_MLtrain_Xtrain_YRandomForest_MLoutputtest_XRandomForest_MLnewLineoutputtest_Y \ No newline at end of file diff --git a/sampleLayouts/machine learning/sk learn/blocklyML_RF_TITANIC.xml b/sampleLayouts/machine learning/sk learn/blocklyML_RF_TITANIC.xml new file mode 100644 index 0000000..8614242 --- /dev/null +++ b/sampleLayouts/machine learning/sk learn/blocklyML_RF_TITANIC.xml @@ -0,0 +1 @@ +titainc_datatrain_Xtest_Xtrain_Ytest_YRandomForest_MLoutputtitainc_datatitanictrain_Xtest_Xtrain_Ytest_YdropNatitainc_data0.1aliveRandomForest_MLRandomForest_MLtrain_Xtrain_YRandomForest_MLoutputtest_XRandomForest_MLnewLineoutputtest_Y diff --git a/static/css/icon.png b/static/css/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..feaa92996a439f2fa07ebe8625adca5554125b68 GIT binary patch literal 3262 zcmZ`*XHXN$8jYcaV5owCh9XUA0+P^+q4$nK1PN6LC3J`&Eg~I6Zj^Q@f&ru?7Z5>; zgbOHLdPfBTrFW13FaCKm@5h@n-=5iX=6pN5GduGonw#oDz`S4p001%2*S4gxE49o) zK?)j z1pr*dFht z+U}aJP1e0Tybg-@Z>Miyku^DXi6hDCUy9Yffi}CPZ@Tz>G}_fUkDJ{HPG)CBMmsF! z+!bR8+Q)o|R4mdEfQE{V2_jWa$?N&PTeWRx8-8s^_5cH}FLc6e!YC0c=HiGH-`xJq z=6sw;aUaCjkZxP=m4lLBSNPoF-tuw>L(cEwgQQxXwNU(DKlm!@o6e>FfuV?p)t8QZ zV4aM;i%mi8hc((kk1%2ga4Xm9%fp`W2ZfreF=X;(+?AUP%IEyDRT7;ZCex48vQ(39 zMu)6=>E+hn}3Dul^H{FIu|;znLM16aiyEO_DG z9O$O_;xjQnw2+z%=ZX2ip6B9@0@_Rb2HL;hz91kmwo`{7G?YVBG!mC=HJ*GdZUp3V zmDpASVX#SKE*e zjx)a~-HyWxGI`6Ud=iR8zu%f{-=fcGQ9-cZ!|X`w#Q5)cg`JfEiz=!O5FkN?v2gKD zJ}IGM7%h5e8(0iLs9d+~8t~ls$er6?rBwd)T20ZtVBu zJK%tqS)*e85B+ayEYw`4FO7ig8RA&wf~C3Z-JzQfvoqXPOvGh|-kZ@w%%_r#9z7`& zi#yne@AfoAcc@PSP{%Jd)0K_%{O`@JRz>Ap+RV|~OyVEd@<@h!cbN@)H9(ow2t+$ym{gcT#P-R}{nD9Or53bO0^W za-7cwo5}~Q5}%4xdUO#&z-!q|rFA^@Ae-RS z~|nf|J!Zu5Uw2)5TTW6VwZcg?d~Yy3r*qi zaPW~%aNqvo#P}=QzapQEbqC>JLo5oBIkc=puUYAWEV&poL4tWN8P{;7mYntWp&vkN z+3lAC>jc5qv#M+4(pbQ^GVUn|Gje%|pT+@;$S%h(m~7|UYZ8V~JZg8$byGgL{gw=8 z{u|o$t;t!}^X=oOk6_eeFo+^ZOT(t`>PJ%(tf**n14Y7HOSH_xG}2oC(muAKS<%Q| zSRv?G8Lxi8!bWE-l-D=2M#C>{Hr@K*fJia9qL{FF9JI{u`MWnT0r=O3f^D0d|Ez<< zvrMclyDdBZa=}uob6}dk+*bY6`aM4}b}kiN0^v;wfk3FC(TRVKYm@3t+BUqd!U;p> z@E{*T{vJ|UQVsXT1j54J??U0v@tv0+!Mv)f;bJzXT&b8wcZvwDhzt2@KMP;6rom|H zeu|4dEG#>X8!=vP^p@Vj>x{u$xRUIZ5wfp#cp(dUY2?1w8+)KiJL3@hZp=oa(Bq`u zNNTOiBL`0ysknQ8%n#OOn@X}da@0b>!j88ezN|+Hkb4MHIgz>JbnKdPOvTcj6G@%Agl9GHotCFV&PWheSN-|+CX@dsv3+A@ycengB^janfdvzPC5egGyPe9 zg#RgCcRSXwoPQ$Pve$C%IC<7pz0r%k2*y^ieqs8_QlBb|Sgl z2Yt&aSRZz(RNn^Twqr7xZlIJ>2em+glhy46;<61$kalg5uJWVbm-TPm0%{zZpov?7 z3Z=mLtm>AF_2H$wD}@fD_Af1--o!je674i2`HVRw&)-eBFs3<%tI36veC^jxSSy#; zXE_E-Y~rMzTOmi~U9%0+pP{(p^RHQW#K6pWk+Q^B^CsnATdU|ry|sJd(X(;n1-`nUvCBvY_#()z2@$7YD=?GJsFfLt4#J}a@7|(e~ zX_T&fB(E3zrX7SN`6tBM3~dSpIPK7PGKUm2?v}bDZ4XA8hk2h{DNhu<0JomxNUg4q z*$H?#FAV2dJ{k7$y`Gf!<+ZQhBtx>S6s`ROS;wBK!z;8iaaEFQsqYn>?51ck#}ww< zZ*y>d=Ovb^DOU~^#bknLzDc2zyJjE9`%Y$o!#rv_TAE*PH#Nz2x!0n)c`;FkZ0dwj zUPZoTg&#l=%01?sBlnC0t*5hjAA|xI+95v87V^0Gj4iTO)^ybIxTKghHnYtgI6k34 zl+7;q)`#q(jY`s4jwL;N7WxIfH9f}!HuM=Ir!_+(Tf=ab(DyXCW^FB1ysDND^$OsN zX_|QNPyhVB|Lz7@psvV6mCO*f;X^5A7VMj}ZzGoZG}JQPaWi1dO&?jVAO=G!H44vj zXRdwwLQeK2?d^uf&sERb`=zRucGtw$JABs=zs+bU)M1LC93!(b{z@l*ERNKwjDCvZ zwopl5g}N>_=cfkO`W2d=U;X*mPY6mtVr$Bo71DmhQ8->3Ad5vtmgJ3-q70DE*4;H1 zQxpu+G1som#l;6)W^}RRpQ?j(_mu3k+?=9JCBB7X@0%T^8P18HYBUVhDIpJZSC;a% z$pOQ9mYQ=->-e4|d|qn3P5$EW69Y|BRxrHagYF(vkGnzndaiL!U2c0RI`xAGicJ@ zL^mmWlP60$xIE+etw>o>@Tg`nmZJ5*#o2#9sw4n2<70x$Iykr@H&~gWGdbl2vjCCKzpCWyhum)h!GnS*Ih&P&i-mK$3 zS_5p2>S$_cz(3Fzc@_Q+EpctYQ0ZHDI3YIYYf2;K$eBZfZqJE>!ASql(?ofdeej!{ zK4dS}v~zQlrOWt5)Wf^H8{10CX};!z!|gi75tmJN?&C9@Z=HHSiBi+7d3XbtkxO8$ z57D$WEG~5qMf~I19y=W#z)@y&$qNEUd6Sn1kw4YZ<<2}8QxW#PM{GUtLx(qLeh#RQ zfBuivb`9H+xs|-MofC1=|qlH_({VEObqgwhtFc`eA6lvR^0P8J%j z)Y`(b7a0jZ@(T;)G$N_bFB*8`y~*(5P%F{{x{8iDE6IC_+O;_w;L3E%~)oI{yL@W$Lo*Lo|sXHnh0}cV#)EyCVYfIFm zdO>~XPkdGv)Qjq#q5QU#CiDi_6u@kzGuzi!D(ST#e@=bluXwHARF904e6Pl?$n=UD zyMkOpHg3@D1S=wHP!!`dN(!2na$YkPpT{GM|Cx=YwAPws=9BS zqi)o5{)GBWeXkbkbM;2sF*nKojWPw{L#pdJU_K%qZ3XfZz*AruxE>Mr|Ay0|MamZ& kAngyUd%K_S4jo$K2W{TAF0SjyH~;_u07*qoM6N<$g7F>h%>V!Z literal 0 HcmV?d00001 diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..53e35a9 --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,526 @@ +html, +body { + height: 100%; +} + +body { + background-color: #f8f9fa; + font-family: sans-serif; + margin: 0; + overflow: hidden; +} + +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; + white-space: nowrap; +} + +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; +} + +code.content { + border: 1px solid #ccc; + overflow: scroll; +} + +#content_blocks { + padding: 0; +} + +.blocklySvg { + border-top: none !important; + background-color: #888; +} + +#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); +} + +.icon { + height: 21px; + width: 21px; +} + +.upload-btn-wrapper { + position: relative; + display: inline-block; +} + +.upload-btn-wrapper input[type=file] { + border: none; + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + opacity: 0; +} + +.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; + } +} + + +/* Privacy link */ + +.privacyLink { + font-family: Roboto, Arial, Helvetica, sans-serif; + font-size: small; + text-decoration: none; +} + + +/**/ + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu a::after { + transform: rotate(-90deg); + position: absolute; + right: 6px; + top: .8em; +} + +.dropdown-submenu .dropdown-menu { + top: 0; + left: 100%; + margin-left: .1rem; + margin-right: .1rem; +} + +* { + box-sizing: border-box; +} + + +/* The popup form - hidden by default */ + +.form-popup { + display: none; + position: fixed; + bottom: 25%; + right: 20%; + height: 50%; + width: 50%; + z-index: 100000; + /* big value for bootstrap3 compatibility */ + text-align: left; + box-shadow: 0 0 0 1600px rgba(0, 0, 0, 0.65); + /* dark around it */ +} + +.form-popup h1 { + color: black; + font-weight: normal; + text-align: center; +} + +.form-popup hr { + border-top: 2px solid green; +} + +.form-container label { + color: black; + font-weight: normal; + width: 150px; + text-align: center; +} + + +/* Add styles to the form container */ + +.form-container { + padding: 10px; + background-color: white; +} + + +/* Full-width input fields */ + +.form-container input[type=text], +.form-container input[type=password] { + width: 100%; + padding: 15px; + margin: 5px 0 22px 0; + border: none; + background: #f1f1f1; +} + + +/* When the inputs get focus, do something */ + +.form-container input[type=text]:focus, +.form-container input[type=password]:focus { + background-color: #ddd; + outline: none; +} + + +/* Set a style for the submit/login button */ + +.form-container .btn { + background-color: #04AA6D; + color: white; + padding: 16px 20px; + border: none; + cursor: pointer; + width: 20%; + margin-bottom: 10px; + opacity: 0.8; +} + + +/* Add a red background color to the cancel button */ + +.form-container .cancel { + background-color: red; +} + + +/* Add some hover effects to buttons */ + +.form-container .btn:hover, +.open-button:hover { + opacity: 1; +} + +.drop-zone { + max-width: 100%; + height: 300px; + padding: 25px; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + font-family: "Quicksand", sans-serif; + font-weight: 500; + font-size: 20px; + cursor: pointer; + color: #cccccc; + border: 4px dashed #009578; + border-radius: 10px; +} + +.drop-zone--over { + border-style: solid; +} + +.drop-zone__input { + display: none; +} + +.drop-zone__thumb { + width: 100%; + height: 100%; + border-radius: 10px; + overflow: hidden; + background-color: #cccccc; + background-size: cover; + position: relative; +} + +.tool-tip-popup { + position: fixed; + top: 10%; + bottom: 10%; + right: 25%; + overflow-y: scroll; + z-index: 100000; + /* big value for bootstrap3 compatibility */ + text-align: left; + box-shadow: 0 0 0 1600px rgba(0, 0, 0, 0.65); + /* dark around it */ + background-color: #2f0743; /* For browsers that do not support gradients */ + background-image: linear-gradient(to right, #41295a, #2f0743); +} + + +.tool-tip-popup h2 { + color: white; + font-weight: normal; + text-align: center; +} + + +.tool-tip-popup h4 { + color: white; +} + + +.tool-tip-close { + display: block; + box-sizing: border-box; + width: 20px; + height: 20px; + border-width: 3px; + border-style: solid; + border-color: red; + border-radius: 100%; + background: -webkit-linear-gradient(-45deg, transparent 0%, transparent 46%, white 46%, white 56%, transparent 56%, transparent 100%), -webkit-linear-gradient(45deg, transparent 0%, transparent 46%, white 46%, white 56%, transparent 56%, transparent 100%); + background-color: red; + box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.5); + transition: all 0.3s ease; + float: right; +} + +.tool-tip-upload-page { + + margin-left: auto; + margin-right: auto; + display: block; + height: 55%; + width: 55%; +} + +.tool-tip-popup P { + + color: white; + font-weight: normal; + font-size: 18px; +} + +.tool-tip-github-button { + float: right; + bottom: 15%; + right: 20%; + height: 10%; + width: 30%; +} + +.download-code-popup{ + display: none; + position: fixed; + top: 30%; + bottom: 40%; + right: 35%; + left:35%; + overflow-y: scroll; + z-index: 100000; + /* big value for bootstrap3 compatibility */ + text-align: left; + box-shadow: 0 0 0 1600px rgba(0, 0, 0, 0.65); + /* dark around it */ + background-color: #2f0743; /* For browsers that do not support gradients */ + background-image: linear-gradient(to right, #41295a, #2f0743); +} + + +.download-code-close{ + display: block; + box-sizing: border-box; + width: 20px; + height: 20px; + border-width: 3px; + border-style: solid; + border-color: red; + border-radius: 100%; + background: -webkit-linear-gradient(-45deg, transparent 0%, transparent 46%, white 46%, white 56%, transparent 56%, transparent 100%), -webkit-linear-gradient(45deg, transparent 0%, transparent 46%, white 46%, white 56%, transparent 56%, transparent 100%); + background-color: red; + box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.5); + transition: all 0.3s ease; + float: right; +} +.download-code-popup h2 { + color: white; + font-weight: normal; + text-align: center; +} + +.download-code-button{ + text-align: center; +} +.download-code-form{ + text-align: center; +} + +.download-code-popup h4 { + color: white; +} +.download-code-popup .btn { + margin: auto; + background-color: #04AA6D; + color: white; + padding: 16px 20px; + border: none; + cursor: pointer; + opacity: 0.8; +} + + + +/* Add some hover effects to buttons */ + +.download-code-popup .btn:hover, +.open-button:hover { + opacity: 1; +} \ No newline at end of file diff --git a/static/images/blocklyML_logo.png b/static/images/blocklyML_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9203c32a5f004b1a9c160526d80763b1c3fea4bc GIT binary patch literal 39175 zcmXt81yqyY`v;YjkWdtcAR#3!$mo8; z=j`m<``-J+=c#+2cOi-(NnC7FY!nm}TxltBWfT;2FbWFlAm-D@nZal0XecOzCT^;l zj>=!ZQ`&)TP0X!~DIHzyj46#>%uP^GT;|JC%wuR8%lscsh8v?G39Q{6O&5Ru8_6cqj8#PB}vm>s1i_ z#Np7DZ8_DuEl)&Q8;VzZ+c<^SlUItgerExVHNv4MoIRympR5px$RVfrwE}Yyeu%3vEp)uzjuM#+h0_2Q356Lv%) zg^k9vpQyfB4p+(*(=>td7AzLmv);la@r66?z|k8H)dBy&fPTQus+JKe^+4&2@AXff?Kk?jm5RpgV1|r@_f^m&zbCU9MTI{T16Ff1L5TQSw{8%`jHiYys8C+AR@!2MMKl-ba9i!9YQy>&3!7uN*r2mCCWALJYobS17CfIt(gUhmYdV!NeAg-GJq@sj%EF{M?$$2 zo@(YrO2dhpgXOeH(aUT2i1E3K4Kj7e&DAPZFMP347Nb{R^9*ZQgjatyLLGh&GA4e( zXM^Qj=qwQ0l#ipJ#$!&nQLHls&Rwk5YVQGGIvOYoR@onwI_G>z1xwj%&cz&}pbuZM z(0$LY#y3Qjs1(j7p5U&pTBnyy70^SrFGAoyqJOQ8D)vzGQ%>?u&l4Lx*-7R6?rU(r z2}*FTQa>EhZ53`x<^Y>C2ON5zdvw#dl2GMSXO)r+3Z!J-)l%mfL2GUGFK8ko_hqso z{jueQ-+bBY;tV0KL*IXuX+cZ4<@O;BL*5i^fG(y=enX_sSfA-H&1#H6@6m^q~kgi{d;(`{P zu`Qf`J_v_}YKp{lo2di~(I=msgZHA;*zCtzKBL32aKDx67Gb|lsNz0zWOiJ##5G#n z6&9Lw`0|T1K;Uz7p-zgK^=XVAS)Y{32^ARHFZI50cGWnQzBpWP|Azz%07{23s((r3 z+&_tuS4pg=%!oIN_N?)3?s63N>|`2`I!}JWjM6pbByLCNY?LP*Cc``5Pgoq-jPLvd zVpPO2b5HA10emiWB3b+ zOeLT$eZF{KT*Bt@3h5xyi3LMt&HI>}`&Is$Ant* zyI=N%IZY@MWok1Mt_tCXKexOvA9$%Mv-3AP2?gnA zlxR;v{FOsk%8D@l3@{SYiBNk-04m04zc=>EZE(&!XAf=i#$ZJwVCd~rmf19x5j`t^ z`Tm&hd7Ys;!AK|esg&<~1vkc_4pk9rOs(=62&hQ z_(-Od*)7;Cik^h%rVwZQG9G&~daq*BNKY?3!Lom=#jNO_oNVymU@3bTi2a1yL177( zxSlU4I%F7|(mO=C`McCU2$Vd%uw?TY&6(jT(3e8Du61W{IFcqUf{mM!P0H)j?;+7K z>uYXI?Ws4IpsZ%gz;7oXne4B`=(Y^=7SW1xhpw{Nu zx2d&lNZn;bIl_m&eOuNn+T)ta8@?8K=%}dO>zMN;wkz1UgQ--N(AoOKH6~&3?JA}n zz9}5*_X$$FUy;at*ZZX~e|EFIlOAs(zxSaJg}+_norHa*v(t?I#^F$n+@_bL1;If; z*>irP+;P2ay#%PRqFt`b#Iw7?iK9mEl=5e{lN`WgoC6(_y4bW(e!f#naq6r2kPqv) z6HT_SDQY-t27>h10!HySMgsESG06!w{rL4{??&~Ws)$p{T9JvhvCAV2P3V}bn-ORv z48QL3o8F-~w*8s86P@f|3M?xaXnj^#^Kys4+ima3E1Zu}F7v&-OGB}*B*J=rzsaMb zr?EMzU9XEo8I8x7S${_VY8a^IhbW8#g2_E#L{AvgIux6EgaLRP-$m~yv4}AcQ~0PC zhpPMoMt?L?;>g1^kA4%3Wn}uQn{X&CuFR1u_nczmPP6x|I`N^Lpxw@@;|vxURxY;@ zgc#|^Q^kCYN(d!tzXwVedA6^T9(1-QrM`T>v3~GDfvLtooL7;ixQl1h=9uOk>`xt! zsgf%XF*fF*VMf%#&+Y7cvSaudYHF6*OyDk43f9j0vU7Ap;)VPxIKqOc{qv`~DakQ0 ziqJ2!w*v1&c`j=W9BFFbVW=)=M=g{s|1#`0b2k5uzK<>4=`RjlqWV13jB;R!ZXxG; zSZ73FwYlqKGgLnvXzv;3r{2~3;#Miw!kScVk$kKxQMqXJLx8ZCxXfYzI{hGRAB2G< zmN`5^Gt49%FF-F;CN3P4yfm#%aDodlA1C#!1Y^NR>dNNrcBFtQ?sH;F z?k!zlHb#72^eY8L$wNBErA}4;QQ}WI1RrZ(uk-$Nc!x@?&Ano!i6M?MGO|d#r$GyB zXh1rS()Up=JFMb_*+hL^{cQMEo&VEf&_2U6;g#UEzGgm2xL|k;X z?4vn17b0y=0PQbtakr&zRBPUrR%V~~TdP~&k_m8udK00AR5Mr>-S*?tC6ZK7%I&@j z!78662PWcFm#^6oIZCfS%5p!6q6RwAF4E=swUXLpduM!%%J+9tI<0a{pmQy5{39Vhv3imB> z4OYc;OqriF&+`vm(z6J))Q>XHn~ZSY^|XO;h@DbAx&7fI&Pck_Y!GwPv>5ilKMwo&w&&G8lbx>Ka?i5|o4gxA z$zJ>}d2bXYUQBGZoKN2wI_09)apuPDUX=s!5OxL_a@H_pCW%|(O=^f*Z9WiW@l0_Rp*DN3&b)CQL zmGDP?sq|EZx_YzLb=}U7106B5NnFTQJ#&1xpYb+d;BKAZ$J>MV!Nh;eUppHB*%_y# zynZitX8T$A)yK>>t>Ox#$Ha(#4*g!^_~+TBLD8ncQdh*BZwEFTQk1#)>kUD%R5Tp% zC7YdrKJEKZ>D2c>I&KUpK0w}M_-A(_Zn8ZuZXX8MfKKPgj78@CV0*ua%S+0VbnC3I znsb8?sFCiiJilU0fIz-q>iwCzm@HRC`eNkNu4g=e*>0h)?unFn_*ObLOR_(WOGG&l zysHu(!PW6i7=K1&Pk%Rp@S7Ed$qKs%EuLd+w#w3$o$cF~&*wWB9fQT1_Un2BYNp(u zc3C@~@8z_8I;0X3J$_XZz{%}N#m6(=1)_ZN?8xm0#DfI2=;=-;zhv9+Yox(5vs2Yi zK5U`lY{0kag`ukKBypvqmSgWUAYHvJ%{oNrSW(J@bt-4EplOxuyg#it9!fiHdrgR8 zW1~PulX5sqtBPnWLmvo#-NP>PO1D6PE*3BE@}7t*`06)Sr5h>140Wlq30_64nci5j zunTkAKz({gfGoG}wn~%;hTl=)MsF)(t*Bv zX3W4jP=qXU|B_K>`Y<=8Px`XeJ)KT5oWk$iHoem<~wE0_K)rb z=7MTY38w@e3v6v<9>|cP0&gv`I0AKQJftMePp_#3p*;-8^XPXULI+2$cafJY)F!H^ zoQ0Uae?ani^4KQ^fIu=U&eXu>g9^HAZ%uC#+v%z*Ybz4xo*yy8`(%DNaV@CxrAA$O zs-F3-LT$2z6I`Y*6XY}St|;BjQPF1AH=`2a@G36p+Y%Td3oZ+9ze5026fd?SoF(XE z-;7Nr2ai#Txg!BGQ}aD(bZhI~0?#vBqk@1T@hwQ;=+=|jn8ozYUmt6|SL%;mF-T0f ziQTei^Lw`me%iu4Y6RAz;X2&oqGI-AG-0(UInBAnrDgoWT%ZwJ-GTQ7t79LaJhw<3ggV9Ppr{gI3z-htQ%FG zeRAnLp<*N6t4))7QXmIuQL?av>WYoA@RPkH@9OFkY3!3W+mu$WGs)#E;;?cUT;NEf z^*r1g2Z93=ZVkj#I4%i!GmpYBj&2lLKUiZMft$6$8TI)>4#4&ykyc}Jc%7Uq_zt9e^Ou)p7V`yg;c`w-dJPKFuODtSrr62pX~ zm?@UzvHcWaE+(cZEhhHAj?-hG3E~mWC)KS;9Qcs`ljN+1XD|b*jC1MnM??0{vuBUTu`lk_f|KxmasQJ~UqF z2p1+Mn>d9%O|eNW64x2}rt!O6;~9alkYQ3(vhk3#GGW`9lR~TNccpa1%7y7!F)$Pr zHQFWNO}>1K2w>a zeIB=B<@!{KqUD6Ifv*&O(C5zl9y$-^w6BV!Ss92ic=Z8Dqi37*Xrx?ySAx!vUaS}H z=;fyg?aCM?g3=XrwfzL6^|(4Z^&gG#8x~Q~GjQhObQz>%`;k5uoY(mu*zBI4mbyAv zrmvl%N==l;eCp_Y$EKaR>y+{Rd;Q4XO8UmFCrUOtxM?Zw((BP68;WwO5|16h$IrvV zgL9SY@bK{7-k#3DFb}UF<_Eyz{K?qZnV-eg)s>u_oO*Yavs(Zj9$sBt-C4NvS&-cl zi}?A)`Q6=}n26Zv@Q|Fe^q-Nj!QqjU&eqfB+Ox{M1($DX>KZvYIa?!Re1c*R7i%Xc z$7k~kA6VF?rly>ooSl_H*ld(0Ao~%^DgB_w~Qn+hTDx-rC+K7GQ?MSI(o{-|5KC_VpX~4<%(l652dU zN=iS-@Ouml+Yb!Ce*OA9BTB9!-B(wu$H^=)AptfvTHV%IV5EVLjt+vPN`BR}wgc~m zICKq!zXmuKB-v@iadxOv$e(w($P0?`-AT+uoU-w*I@9FbZMo#(Q>SlVhck|JlsE*1Y6%^r(*~ca?3aX*3q&P}28oAWt0LxBF%K-)DZP(u~ zs?DgA;Nv8QqqMvP#>P|B7r-|GfB|n56iO6naS>IQ`Q27sOTa<`bCQLGL4zh`=ecuo zA*0o~{eWkKjChI2$KVDFJkZNRid~0TXRbt1^sVF6%Lt`UBpKHKBgLe~)9CkSb$9{U`D4dK=|5?H+V!qIsnJ<% z@eq_`*b4stomj}<4!Hlnf*S5W;$!dc_)pQ#0Vj)r^1N5Ol2ZS~TlRNQEw+OyD)RoP z-Qjyc^`TaQ9aIWK2=w0)n*f#B(^6%gJQ<8vp9B7p`J>1qnE)+P;o;soj3oKTQ>3gb ztBU(^ts?K?QTG2k9#VR>t(he@Oe= zMW{>j=xiyDHxmC9$+wjbkPTKB;ZfZh9U7_n$8GjU7f_oEo;m*R$a1dxpHRMc?*V1t z$DNy9&IH0wk5bNl>SAch?%SaR?6_Ee2>A!)0k&zlzgQgX zGWb1VfBIk3@8&&Hr-Q%9mT7E0YNYs+xrx7`vk*m)ziyT8%94>h|BGd2&8AoVNG*4n9rVJn z_dn7R43LAhqsxBK+#)*sTkc6>RUUZb;rTyuB$!Am{e*+E7ptO7s@_J+ZK51TknIz@7zxvcB+x4#hTq+j;tgO{hb4(EY3&=fMzS((hkb)~dlPna)`VKyz}E|Lu*l>s@@+>fj$c;`kw+^VL6>IcI?6EaKfw zg)M)Nvcue>1djuw4{H8$`V0ps)y$8T6Go(O*~P~Wq}%>eeUvbO^Ipc}pjnQmSISPc z5SFmU^;bDT_~wJ$&~Q0XM4qGFSILN(ze<$&i}ikL7U(Wg<$c}8&1(M-7GGv2fadKk z_M_W~8DZrDRUfm)uROcbj?LsQ*P|BM{y4lsK;`Fu`Jyu)i;ir?eQ8esf}ZPFlcw<> z{8|Bi>=tW{`el~b7}BOVjFJgrXpijH{2jir!^SRG*Y{4!MVZKX>;6kvsmeUOjVdH^ zrkoIx5x%hR`n{6QkVwt^zk8ngJM>hv>o=F$xj;XbH*b7n`sXA&?*Z4Ai&Jkv@#7-n zZ$gc=ABE)3v};RAJQsnhzO69!dH&C949*_&36C=0JV`*ebP%qS_+M}A>OVPl6nXUF95?4zg1$qJ5t-E@VgKTas*3>|(wYLF9C4)lA^$H2C1~)_ z=*#JUWxYtUi*jrO!~SJR-#o0Kdx!fHbspCA1K@Eo-Y877822yGXxKr;0Hw!VK>Yc? zyjBT-M|CME@fdTaRlNR0_fIETf(Uh>z65;o4VF|$>OUv>Aj4ziVMT*oaO}ct`Yp%t zo5J5D`HB{Dn@A6kq(ZfJeDTl2JRgxIg1u$+bZeUF)!F(lm$Sl!X~WD7+Ty6|J~K@G zv&d-}GF=1#HN^-;^7i-tbWroB{;R;lW*6JK)WSO0|f8_;hXk>~dW=csO79c6@lqmSSYU_T%a+$5mPT(Plb- zw1JLPS!{;LqyJ-@O1f^;4}=+_Pi$r3=CS`UzlXx%j%;h`;T$6#(%kib$<5Mr0k{3T z8dH>p4cLZ@XbXsi3OmglT25A%F6^=T{$?^?fp?IqvyuHYYRF;zfZ3m6HsjnJys6Es z_5lI%zY0}m_=~B*${8T_?E+!>L4!shO$*-Zy}dxGe^EZG(v`(%nutjU;g_4rK2>IL z=I-YG>#3c3J^_V$>0MWQUo$^!bj&bG=Uoy=$VuK=Go&49@;sW|k&vI!twk0ax!1!h zSMrCTm%sS-4yt8(?93_C2QJ4#JW6+`2z<;k%lF)joH-0gt(1$BIb8fB^|%PdNA))8 z5sL8+uE&OSm<9SDpVN~J(2rb2oTcZ;zb>%OqmFy5Y`kujpZlhpMR?kAx39$Jkfz3T zHmCS%vbtn%w(b5~(j*NuP+54>mCRCNjF+0;ZyoHYxP|$bIZFxTXiNh9;QWag#3fXi zLN;jiWV=!ZM~j<>OZ&m$g!`6~@llW65NKntZ{}GpQN&LSv#A8mss1mDH#Qc$TA$## zTV%<9NqHy%I{{_y(@0L`Gd-pt?ll6_f!=c7g2X7ku^c?YBy0N86!5!%#H`P zEYJh+?e7!WhQ?c^BQ0`|kcDG`JIyoZW}Y2Z=SW+YlD6%GJFeSBHILLk3r@dg6&4E~ z>{WlX3jwsktgn7(Wr3@;KygE=pvm!MSmE@`sHO9lZ;+=H8H))hBMw~Go)(ABy8boT z@eYFgnt0t4gP(9IIC;t&+Xr#)Ua#n+Ie=F9yi<>(_p`X`e{-h29D@2$o&t12C8##%_ME-L&`59F47E>{Rc0vFg@9qX)ItoMIURmGisAFEiyc;yfjaKvsNpZ}{M6lJ%T`tRoY-s2y&?w8vL?EjftO)MGqP#D>6m!By?RQmZPmfXW{_D|A; zKx8Ynt7p_s;~VXXHu0Pk>t@LlP06r@qMH|CKOqwjSH+ZHRUH&W%mJ`(0{`^?QAvu^ zu3NFmJ|h_abA^KSQsS+b-f0rTY7FV>0{3#%>U-Utb)&yi?nO&cxBBC{>^`=|?EWC~ znvY-iY-EMA!uIx}_u^)L$CLHT&BeF^;+r2tXRX#c|3op42f7ht6?3xU?EtaN670!= znr*^=^J1F5WJF#X7+?NM>C?H0Jijq+TZbb90`Ui5+#GT&zldL9v46R^cyU^)$NaV; z<%wtMHOA;c5PUA>p0V9xXGPXFJ{BLGy=zsbCS&?1nhj;c=OOt{kDsfgj-v3o2p_-0 zwFs067k=<@{cmDfCtt55`CVE=kY~;fJ#;AO%Inx8oM1b0g5E>}k7*A`=yjzY=RZwPKpKIZ^epN3bs8}g{x%xG7 zk^uBvEh4eg^o!8EB-0I5Yj_PwiCYi6DP!hS`AK^w*UAKb2|xCaI#G${@pdq-!s)o* zWA0V*jC)1UNJMkpy9aYzPN2xsqV|drJd9L;ZH^d{Iw@fk$!seXU-1{D+szk(-C6p+ zT#wzibg_;*u)jc&;jCzd-;k@Gi<2d zQt|lJT#2f@z#S7COeIgKgKuD>Zg_$%xI==cOcnT+3~k|RtW9f+WXqUJR{c8aVCJf& zO$(gTI(D#yd}*$DA%qS3v5*5XQE$BXkqv%AZBNyj{d5Ar?Eb635j|ZNqVRA%D0F{Z z@i3D8JF~d$MWh)*qI2h-#cl6s~)(nybus{$sE{;$=&$f>iUHmiw?)1~cG zA0yv0kI=Z2va!~-#pm%vNtdWOwo-&XN`ec@yh8ZJ30A}x)dIkItT=o$*FNH~$9oR5 z8W6U1t?pUNs&OmfX4U95cbH@qf}CPN9r_Obyp3`GZP zdEJPJ;F%kZ@(?HZTIYQsfK*7>7n87?-%^qH;cO$o+ZT7cX8taKKqsK)(vu)MP`h)*6U zj`;IN+kh~yMg*^MYUsQA;}z_j?x)u^5*o;jF#4+Qd7BL(?9ckyFA%0K!Lz3Z#IPTv zM>^u_=NK6tT9J=fdNGfbFvVvD?6j`YhF`zg2bA|LJ2Mn?a+tY~nnT$W8$*X)%KL|@ zb49=1-Aqd}`0c?90efC=&9pO6Y%I>OtWT;09uo*n$rPj~GWG%Gu?kulk$;Su>5&uK zZT-!|DHzk|E$I~oV&5iKCSuh9A-d(`c`bqM;F%IPUfvwAfw$4|lmR)$Gd%Q)GP$jm z%cWIFhUY^?-oYp9O|nBCfXe=N^{G-Ly(GP|Ks)VHuwGp#7&d(@(YA6c_O@)z)v3%8 zay~B!WLa`+^QE}|zK{=iAf3Nh$_J!WnZ(JN=yq!qZg&2u+nq*8Ba1tLLU;EUze_Gd zF;d?%n%-<59@-IH)Pid_RF}jC#^x6s32N05I13U$)|q38Y2G0Hy`dAg`kzcIz3l}n ziS?iOs^>kotW&{lWpE7lL^aqY6=gNL8t7X!CSjrNbM+lPCitWL*B9-yr6;Q^_k$~U zXDb;kQo`}YzIU@8hs9=0~H{%0ztU_G)a>G~AAd zFF^w@cCML_W$5ebbOkR=M#cwWwhTCo>D`e5#{@-oo(GFu6TjhF6a*YsyWgX zS(K0RvSKdY+_gOEGOvMNP3I3z3_sGxFG)h$+_*ZWp)8-zO9Kb0u{*1ZZxZ)ZA}%;K z`yy2EiUDyP1m&LZ0|+8mCdVq?T+D-WPgeE$d64bRNG`oMPv64K5C)Vxmw2y46W>9& zOCY9vj{EJ0o%1*0LhIWZ8Z$ysK@?wPfOtA!ognYn0dPj^$R2pj-JgpgwJuzyWrgd<8nYnZQyY?@7vtEa?*Z&1kk7Gz znBqnvRHu3)&jLF`KkA|)YSj>c+O6aDm(SSvO%AWVxHqkf{rcnT(V7yvtj?mbl29d} zV>`eIwQdS2C!cUeS>7g7?}t*3Lk*@xBBJ)Ryi~S9X;ZtHb?!B z-i;So!?Zi7E6$cA_4u$uO}q}#j=#z#*X>*aDZaWq`%!?|U^5o^Ye)G$hpK7!Ix*mZ zVb>&bP~msv&vpvibJy0_ES?edcY{+kv@~6N7P|wM`G9ug(Zt6BWMqYgt5}=#k*lpx z4A&~Dz870OkvgsYVhy0SVxEKTCUJFupwHlJpxR%k02ecBU6fmHH!o#DWN_9f2^d z+2Fe#mSsrGc<8i__q2#w(-M6zgZuuDgw@mY{uY14EB$V{-RrfyT5Hb{14wZOzF!P5 zwL!oXVU_2z_k(Wq$m(nAkxv&byb>^dZ4mHGEbOb(H~AK9`zkExkrw*htOs-eHq{ov zdg|YMIsGC0scnd6$46s2n0lyj#od$xzRu8dYemJ&^T2en}VCuwh z!3icL^pN$yru#l#Uf$G^XulL{Uz)xf1_kQg?wWjs7I_REq`K+dutcAJI9;I7 zJ1mV@=2+&HF_SxY8^Fta$ZZf>{n&_pubE`a$-$ncxmp7=5a4x7~P*8m5 zm;LO<@ihEC_vAZX#k|nnnQet)!Kg#!u_GB5xq#fY{Kz?&LuHs+EdJ*NLdvv+5oz?v z1h|k1xp*|;cDlyQ6L@9&(>N7d!#C=3D?zfmQ8r27#lg&j3m>rAH44j;!M412HzYW> zQi9&h4kGr3-h8sa;cTWF3R&^GJIlDgo@swr@M^feGWGm$zIsKmPl0Z{Mv{k~Gqzrz zTzl0mS~N|BFz^0V2cywFH;`9_r7OXp=`)i~TQ}1Ss8IW!&{n-abl)mK@B2DKnm;`J zw7!*FDPo~QVDTwbB%X+%=!u90z2TE(G8rR5b8%GdB`K#u*)3xHsr$$h^ww-4Q&Rdb zwXU6EW}(&?cVGX=7&CohIF&$PA~Y{+laXgGTV8tgt6(RM2emk6T{NbXEo*NuWH7T+ z1j!IYBaI7wCwB|7}9qOJs`-1_Ai@96K>*5&}=+$aN z^UP8K<` zAWAn~@AgwrS{7bH?fD&#+z*F4omtEJnAU=E>bnJ$fG2)jhj|imsdgss7%bhX3r1-z zS|!8BtKJ|lygb`HS{hQ+Q}aqJq}7DzQWaGr6k+exA}o#WoNP_$kzcxXp{CEvj;+GM zfWgcoI||hZ?iV`G2-XsVo5r8SG`xzM9`$B`^v`d8Wh_+Qy6s+V^Qi;FY|q||=ed8> zlG*70@ThMV@@&Y-__~(w(X;D$E=M=F&MGWti4i=f8^aao-!h<6DQEk#0Kt{o~mqgN$v=#gNow!K_w-mD@E znsQFV5X<+nDZx~?v%wpcv^?AIR475bLJzDDhh8uwu>Il8_VE?Ud;UpIIceRxaYD(z zkZ#cT%?&Lr&_d0L&A!(_XkDMjIW&#`SU6G}6{iU5JjS&i{>uHa>tJ60M4APC4X8zXj-=UCBaazKgY*6`#k<>1Xr-+b4^3i0lAz2 zUjDF-TwKk2ZtafP73#FJ+9byff1)&E4f zU_yC3nE=#Fa@5i6sG7{Z{W0usjH68NYdVBLOj~tx0Fo*Tbrl^q(=t$3EeF&3n{05e z0R<(tzc@i=iVs8h%Leq$u?_NmayZlFub;`FFPMG1)BZWt_n*|d1^r%dOs52ug+K}7 zCoWw*)-0m==YWre?#}~Sqj|%)b?&etXgE@9LSl4DA%-Ox)?pCnydG5z*w8fEO5ZTD zYYxg)m@wNe)Xn9j256QwHdV0pD+PQhuuAv`sn*Gfc7~rT8~@(kTf}5y_KI7&n7~e5 z4A`O#`3d7j80gAm1_EY^P%%q&xF?9qRdj@ZlZuV|{nCuWCj`<vvt8eJ5 zN&D)yV=8u@16oAg2FnxsQl}_z`OHlVZ-p`)pA;~{YcI7=VW<806LTJ9+j#WiMigkm zO6U70MJGkvhbt-T`6qgln9L{(KT`+ok)%~}t3T|#G7ocj;{#Z9J(;z3io={gAIdX1 zf}$e|Ap!*u`Ek+w|NR$W9##e)PrRGRn--pTYb;J=HM-NQyDx{^SLDU1wBlS_vC;?S z;%jncV3D_ar+O2^XFvb))el#HGYV58oiO3{&}N$$!wxEhu#u~!6{$s!a$RB!>H2dF z&RIgQS~7nO?6|htr`@mY(jXu+UP@K?OKrAH2nfq*MQk~6x|+s(`B?e~R!p#h*%OYO z&Njd+%oKcY%@juzuACOVk7mEq@m_$WXrNPKzu6?!qDSs--)`#qXM@jE!EO}#f_!N? zhc|=xvij#U)ZkxUjl~a5Z8wMGPG1-bz;8bC%#y{&(*DqU_VJrHhN#LKsWc^}8gBwi zHjLY*nmd#i>zL^MORGr7;I6L_PWuuv&l6jXDqzC%iNK=qY%s4hu=Py$TtVl7#j_?S z?qtkQiq&!jDOph$r*d|iwugZL5X62Y2JL8?y`b&M?qz&lNESXn8~pR@@5~Qll$~c3 zNn2JSj=R)cG+{R}%f82Wt?y?Q}uho<$ z6ok8$neP;Pycoa|HI|lubk^=$Y`dxNJepc0ZQM{7NcHYf%@UGohu_yR)02PZY3NJVLRl^GJW~b%-(TB^+ISHC zt(Dh<_f6uU=PVj$S-4^&_6mFq1*;fkLW?BvoGXKGQnm2#5#piR9VgF(7sREBGi~0@ zS*W`?ek-EP`N@`)q7CPkF_#>SZR=Bx$SyXGF-fT7(J@G&u6aB;ydNo1S$AL5 zh1!p9N%sBRV|(m;szTl@0(PGx!m3y$pW|iou>n)iiD;7Oyw&Uc-$!ZMx;j4a6K&zHRg{R?e5 zVE3^Xw)-*>6v)w>N#di%iyOfS7@;9>^r^NYV-jJ8b7e*g?4UaNf?YB$&YyJy*8e=sS3MaYhuj|6EKqXA?bJ@38~DGjFH;nBEX>o#e1VX0WyMm)!`eAx{Ei4r-p z)Qd49n-yUZO0dYf5Qw@?`SMI;(R5WrEd!L{;WY4vD6pprUFA&*8Oq$#4}82Rk7s3Z z?9lA@>`zhSrLkBJX)4(*K8s-C4{1?s#nA)G!Kb{YE6qXL?YtpA6^5kZFMjDFbb^hn z>*@O%c`iNb8IW!Fb`}k9J?aUdK>E~=Xc#v+U`HnUT%07eH|28u>UgiG2+#G{$_FI5 z2xj<7zha2Z6VBqH;X|SocBs=hy5RFPQ@`pw1xAPwFq(G!QQogPes#>nkS|KW$I`R* z+g*uI3yUYinH}Q`0Q~+lOZV;=b5Qu{vPo2>x)KDD zwBnsR%ezG?RiF$%ob(Q3y{=2xjG0Z9-cX2SXd%UP9-Xp{}hkudVt=;?493cMCp5i_Vlr zb9YH*ZFcx6+-`>SB^}oA;kvESe8Bz^O^YdAb#;LV>RcTb6HOX+fLNL_&jWt4hp_9* zjdeyk6`rbT;PM(|uL#n{^j4X^z&Os~SHDp1_b_l9Yd_D3n{@#shNAAi^Q{tWhJ7C~ z3daE=sq%Ofy@+Pn(RyY+dvY>7EsUmGQwyCflU4-~mT7LO5`fH}12V(g_-ut=ngHk6 z=!PUfvzevVUlmaZ;7|KrjOik^rWoTA#fbZ9ZhMYNPwFQEn8Fz7!cPj74At27Fy zC&^bjO~-W(eBbf9r!7HoOtjf~(;#St)dfyCefU{!vgcPN|JEcEizC&l_D)HPz3Vr4H+@?;jCFCU|c{?>%Ie5JGAQ32h z0Y1jZ?T$f9V=jTvjuJuV7@%4lhk3M#B`3_4dp{YF;}?CWTJeBw0K)8|V}|{)utNcm z?Pu=cz1+F9-|&N;Lqr!qJt;2^Bm1{yH1)P7U*H7;#CXLKFQ7`EeU_Z@u`3exTz%4f zJLpp3yA~Hd8L3+g2J)6SM-6Uquyn>&MuTm zxUjBl|H=Jl{vuMnq{FPEfxmK(Nw7S=ggHX|#g22tcn8^~$Ll(u{u~A?zuxGOZ4>?5 z>rGXJfs|mCE4WatZyE^63i-H`a>MAUw$x@BI&n$->1wSAhAW&+;rGE$-qMk0;=wmK z5{SZo2v}8iQ{fOYnwcFry*T{5 z>NH;h2Kj@Xe}dc2nnZx1{vC_8Kf%Szo@2O}{3IiRNgn z3Kt2W2({#v(D`UuPA^O(Il5zF)XA4}X4VNy-+20@Lt&avQ=JwKAQRg04)g!)(YTL| z(BYo`Uf=4h1ae)xIBZQ+F?5+2_N%L?OeE^`&Zl9d#HJ#w4jiYUCmoafhT6)yF#dUb zmT>$f^jx03h!jd({r#AZoDS~Y?~_DofIg&of)$(p1LzhJ8>?XzpmLB2b$u*EDsc{T zJJ^Vi_-}8PIUes<^?Z(Bwutv?q443fp>l{~3F%y4mKGXKGzz1bHNw9SOpyE%tyD2C zX|msp!4Np(nY$*<^X{xz&gw1gE{s1lTx~WOjh1N&C@qm zY~LVMd(JhxA)a;LcCw)ZxX(z$Co0j%65is@`{QVB!f@pSO)P;DvZ-wk!Gn}Ev`tJh zHAQE+{qnqm{$hM{qH8)&=ZjJianbn25Y38>*BsA1dV!Dchx!iw*@VUIv4{2vxBYyk zH9-k9V)^DY|GH!=6FMM`+@$KN!rtloS~RX?fFZskqX4*|seK5PB5Et?M(0sQ_fdQz z21wrNn2-9hbx9Bb^T?QE`cmQ)l5Sx>zOSmaYNg5hoWYu8O3iPH0^vEAU^aWcJ zcFVlb#xpJSvP~X=ol@w#8bH2C;V-u8p5?xG6K_`yyCGamj@~XSgxo}iu4p1X9N2}D z5xlF*zhxN#%YwLpk5QQt2DVGc!4QAv=--4tqg@0J{3MVCdAzhNuqc6Q+%_ikcIc7g zk`ZbUiubJ%FtDROUPw&uKo}MUB@tOu6p^MF$?MgmkLFYwmkqs;G#@wkyNQ~a{r$HT zl72WjV{7EStw3^>{q7^=WBv9&Y`DVg>IS)Nwf38aBA@VgXnf$B$!d|`-hm#^4|K1ty5GcQqm2!Z_nurznWty zanksD7gS2{tgtg!zb-W*K@QapubCC&#WzBP#;D6g3?jjgBq zug&SR(L?-xVi7qx%OY^}+jp=KyOf9z0%K+qh;5VD{X;HA&=fC|K&4>G+~(e9XNojM zCaLebgyihBboIELB576f9B}-_Snn!UzgWjT=zgVpQ%H4qT|AtM)DndeCmuu;;74ca z2K_&pu7WMf=k3y=lpqMWl*E$Kv2^#+T~g8^ONo-wNVD|P-Hm`WQcJURh{V#uPbukl z^?$uz;F)J;?wT{_K4aY~>w!jg#Ubkk2ml$hw@_#`*swM0v+tc>WT#o=hCyI|W*Fd( zv*r}dNs!$3ASa8(dL5vljAyDGt^nswCbDW%zKlN7!9_-13dX&gVNCe-?E`v3=s`+V zGE1QxV`F~`M~+>X99}OVbdbr3>ubTAT!tEU4%ujUbe;9u<*#T4hg5ib+W~5V>_|Z8 z5ef3Wa0{X4N7rK5)rsquCk9<8lyZj3*@1x{8)VzS@~Q)ewCo^%=#VJf{H5rR%}g9^ zX}+g+{+|0o0@3x_3|7unr(2~@aM`5yDwFtm8U1cFjBTDVI$~pwQ4fVLxbHQ)rk(v( zWVKgf+iR4AZf~Stm!?8J`MoA`YL8%%=9U9c#*w+*e+M=V!7?AYR9W-}S!aAS8!Z-u*FQ zwSU33_d_j`b@)rgPft{Fez-(HxV~{{@IkB+(oH=~J?7e4SYTYuA2dPWDvdRRLBkjw zCI9NcwW#8>u!NdP+s{Ylq5a#Yb)*wp_LpzFKR8~;U3k$nP1u8WV%>a%zbOT4w8n(C zP?QqGES~-~#xd-$j#{k4b$zW_JU=Ylj+9(M~dpWUP2=+&7 zD1RH+@--=eit}rLs3`FW=4M&xpoV}h2yCl?_aMOKXzdbDWEI}@W|vk=Q0PD%N!cGG z=h+{jE$VS0g5sJxe+fVZmm*jwF-;+$r?fS_D@|uI^XLsWIo{z*s2p_K})Ng|y|N7Q=ORs1Zifu`tn&fl4y)Lx1$%^OX5 zxY6~_sO$Z9k_OxHC@~bhTnLpDgFLAgFccXoDm~P!E-e~nQs$8rwQ_V({X2*9UeWQ;y>eC1)wf`TfuW_rW)9@4jxrOy80@w)ju3(UQt89GcarZKikT3tw!WrCLH28*!3`9#w1%Hz`OrTs!rqs8W{ z*-v%lcma-Lp&J$|ygnER#nY{%nAcIbHQ@WV#=@hT`j_7fC)75C4Gu+3U zdUQ1n-GFA2dfbraDZWfpNu+Cf!wf~}z^#l2#WX-C_S>C zr~5xazrqRhdpXM4MZ}|Zc z;HHG@9Hy^uC3W9Gi9fV=I7J4mS5DEwSao)ePMkSVcXdMxQ^Zz*wwCBA=;zbh9SOMx6d1Nn2?g!INwhz z?S@r1MZ_BGKo;x(*cHAU4uhP)7g}jUDvq5%k7q7w$n!O;uD_M37P6kY-n`h0$bzFcTv(<`lq0X&ZcB%%U2{ zyj$M_NS4%cHW>hc&CFoDF_?I-I32OQR~ODXho=oxIT7c~PH!DT;2xr%{^d#{Qf*L8 zK5XnTh;&WVV6#JXjA{>wZNNj#{k88{AhuEE)dPk|QPbnJ5Xl;$)0XRRDVz{6`;sWN zRqV^A`5D7om+jI8v0#qOf*A(UTNbdK==rH3cU2nybl7>w)-($veUb06x%Q8Ku1bI* zWD6Aye01V%I38QdVFp^0*`e$Sy)8$P4MpsGRVv9uv5mo__(X4&Px;l7HIzAD+F>QO z1uvhXw(@iwffxSFv)n3@bpt=9%@cK73-=VHtyc8RwJ{)quejdmujvR*WEL~5--SF0 z6=>Ec;{4n%ZlBFQyopDeigHkooG1(52#Ajfa?S8{s6pb)*ojX3WmTpz5zSQMiN;8x z#;evp2}Q7ABw=D$>+z)&8!~1PAY;}{ZcRhK+7K-4W|S>q0*G`uEwyGI#;O<`s=#5G zqV&@(chDt2n1QD`XEa1yyGl#t`~H!wv>K?Xgk8z~3w~;bYG=aQAlH0YrSGjp3*Jrl z7?gh~R*-TkFsV<04;h){snGYpwPofUH zD3XF)*dlqXY-dD{PxYoAOLUugtfDgT-278;aYI27A$+;fkj}5dZds@#zKuaq1djsk zOh|Mg=B4P_<846+b)~N~gOI4eFQE#m2Fsg?y9mW56l}je>a^dF(;H}P*Z6+B z$BzccH5nuB$xZa)w8)cHk=EP^py*Lo*Gx(neAM~>yT(N7fe zNMZ*>y^LbL5*-11mk)ljl4&Jh`^KKF_OnIPk0ci#6sj3L2MN5z*%D)r6n*3>1<&2D zM1+%`(UcNXK70a9$)2F+alegkX{|)v8MP!q9=6Wn-Q|(Z!H~){8OI??l~CK7<_^Rz{T3pp41@RC_jc zxIG=uqC$7TbkIAlpqvLBBdLd!T!ag-6nrA!jY|G+t1jHmJyDnEDTPRG~G6U^iA)5UH~P%6ird z0V1c5+K++TZYUhK3YGw-jKs0=^&!`rf{f=!fNl0+;jiyfcqN}l7UEJ4xxnO&Hz*awzT{T-BwbSgAC-}nk=waw$ z=g;D}#Wu!Jw^b7G_J@a`zaf`n509(M7dohutYDT<+l$nu0Qj|li!^9TR1?&eK2XNz zVkYN>ZC)S~X)LSAeJznw_51xxpCbYM<4Nt>l5sV=Rp5`FzG*g=*$9_CBYXQ^K5><- z@!_OO5z%tW9LFzLuA4k@p7wo#fKk~2%R|*lFiR10(N7)0gyr5)8qc~Kmy+9np~VzAz2 zqCsv{&41_k71E#3Hbx4N2=N6_^SFx__i%|@xj!S7bLsm?0vGA~V7N>JGkaMI6!B*2 z>_cy?gB*8WNIA?^XYv*Y>bd?4g-|6j(a2L$fWtI&TK~8!3d`6kRZ}qwXtg}eziAO$ z2hmJdYFmHa)^;lQJ};BkBhN-Iy}})49TFU}$yPPxdZ9aemmzbY6a% zka{2#`F7a}T?=nKlrs|WI4-SDb!#H~#r4UnVJ8)i1n*MJ$Gf3!O-#W6DjMf+jFA!8 zYKkQczv`ml2d|KKeiBnhj+hqC-G9T+1(fXeGt8rmZ7=EyIlY8F62fx!vXEUlh3IAH zzJKePYMNCL6Vof|1&A`gqmBWVY7xo1KL}xcn4-aSi&nA}X8H$;BUH!QzNz<6R;7p{ z#|yWVjQ=Q@(-Kc$$vc|wy-Oh$abMDzxKLmj`|zuzH`K8HX!!CIYobsVciF8J|ha_}szC z$>y(L9(>ncK^w%zjvDF!X9hLXqLk;|@&k4t%?mx<_bCP-s-$m&gjy!#suvly)j!MN z#>;0Wrzw(u7})KPpq{&6P*;~WsG5yF|42w&C-|l)+J^Akin z6vi0v#jm?BQWEhvh-Gt0Hj&dTB1Pi78>Us3K^lO##z5RO^m1okV*1cHo;|v=Kp3nX z+x#6Z{7i8FP=dkOW zCR*F9XPMcs(=}njJD(TQVnl1+-+bJkBsuve6vev4$O{F%70oh>WFSr&%KAj&S*+p> zj`1#N<{swv4HjL{>it$s3k(kjsCyLE3VKxIBROw6OXFqw!cm^`kB9oDwhEw}jPufD zrpzF@en@ueJsYc(LDlkiLzMy&U{6ADY2~wz)N3Dvsaea?U3fZxySzG&1d5K5o5TEH zl8rSO#0$g+>_4@lZN(QM0F6mbukhuOBb@fjd-J?(ltYD(Rxqf0EZ<$U4wBCejE*tA z?>tUnCCmyP`ZRBMdNC58t5;I>-qJAGgm+e@fCG5@c;Zp%-*0c1z!T7^At% zO8+($!`C_w;+moQCdaWV&(7E_VOcW%gDLire^Wuc3X15^VFud@b=3h zm?4VRJ0QXmfEL&kIz>87>n|5M?_(!oNE^Qe;w3ODDbFFcak~3|E&zx0MV#OE_MGt3 z-Vexvsbh4ui9{ixMy=D?Y0FQNc{}CoU#Jhp`ZE6RqN;C@b#e@<3r%k_d8&$0^TubG z%^pP!92>Q0#al5>IbTGj8fdV!M48~%XpGo69B!)YTXolU?QqZgO|KVG(QLIIg^`b1 zsx%$9Bv0IP?j>`+F|$Wjj~4TGEYN4rAB)AGLS1q4dS7Y8?D>jX#Bo0+^6IeGLdjy40Y#d90%bfG25wFXax=B^+r3nfT z{Zv9owa3hQe&zmzb9GVaspYd_qCdsP=xk%<2kBBe7Xx4(R_civk=BsA77`j4RM6%_ z`mZdV9g2RrM%hUk+uqj~$n#5wG|Vo{zO}F+e`gtnDbUn7nse10*uWAj)Vtk&W(n%lZ6J`dzciv-g}`^i_=*PSn)kt*1Xm zh;BVUorRdrlz(76TdU(~XtkM5i~{WQEAygt1ns|Q9O7Gu%J0JwA+3`;s!$1tM-i)F zCAo{9!-L1D^696J##AKa^_4U-u^Sd#eZLwgm?dagQlKDmtpYuDOjoT=&5qiYYZ3_k zp`Ch74A9PIHkEObZ?(y9$hun50(!61iGHi1)&pBR84Xy6J?Fwq>+W-<88uoJgB$-m z`*7HnW&Rny{2B@Spfx!xkq_818aM#!%&QGx7N?BBy=nEs6L?>E3Yn_3adU;-M)RD| zXTMsHTWg}$mvZXcKXk4y57~-(+9gDyG<~)4$QuCaY(PtwZsB@OSkWELt7@W$S~%vs zMdJ9X<&UT;r39u%48NYc4i$tU<<;$XO!JGWaX&cLJ7?)f?9K~*Pk{|+OK%q>Eh*Dz zOuGAqmO*@ta$uFVG=lB@Lt4i;aa3x(OC@g@v-C0@-3n{m*y0G@k}uzb%3NTqPr$9LFolLBEXNNawauzhjW?R?5K@YB zAIX{&^2*D!WL!h1PYihsrGXI)u$H8UPu=$R=sH9~I~mG3iC$Kbouk3_9j^LFn0F`y za2Av9oDZ|&npk)J?RS6NmYai0r|ihJuWWm7_t@-RhHzhylu^jH{^2ornID`d zec^zOV8PjR%tmZ|jf~Q^1YOc@1V*aoDj}R|A?UbIl(p=V_l^6xUjVW#e?98&Oz#{z z@H%i&fJUy+24Zd-V1NalBd#Hs@E+~u4`!*$XBowLCe)))UXi@7ef=JX^D6k3$Hhwl zQDS3(ou!j{R%~V`;%)Rj9n;>+HX|juoQ9gNPOB>_F(?*!Yo=p<=>mPJxFZKk4ABIXQ{Aa>E+SFvQA10X(V{ zMyfQgm7-JhT-Z()kCtaO+q(%6Ihj=t)-f2co1xBl(VNxVa^?TmR)qdmE|qY z;g+^;6cf|e=lqwY1XMSN`78i2b)+Aq@$7C3Q#+IXEsQ0!}EVh+Ik^LDkb-(-~;a1#mE9W>0W&ykl^bk?{q+ob#QdM1`k zLou0nZ|mM1jTtELWltwM?6(gEYaYT&n~K5XkRf5__h-Lm8FjmQcqZ04gHvw9HHRCU zT4u{mcad8@ulMALh~v2>yRF`Qi<~MOxR9tzm13xM9dPIPQ#N+kQ}(e4@|v2?zcv!m z`dea-9mO72(sP);LwDAV=$=>i-2FlXW3&CUAY-jSJZ%E==M&HZ!!RrR8cZH8k7i$C zdM>46W0_rW{3bZOgz)5v+P+1+gGF41aS+(72E!}bjEE$@JGUepJQTl9D}XHzOMSe^ z+8o*b9n`TV_xe1%*21yVxx;BG=JeouIbgVNul@@Id>MXKkK!2eoEgc6qUFDgWKz>* zfcCa$iB>P$@^UATrpbbv7S6lkpQs~A1tt3gc2cO%<#beYlI!`QjQ4W5Efrf98tT-( zQAzZ6LdOCG+Uf_@U%aOvX@9g=|JW>e89f*wUKnrhewgprYq6Vjec-jMrHpY{_e-7fHyqPLUZ={YM_Ln;MQ@2nSL^L*MGCOc;WsWlsPPHh#` z?|!29{^}Wp#(<=qs$AX?|AOkMeX?vF>-x>6qbNi28Vil{=WU{r}oa4(bJy+TGE`CpCfQ(+g2_A{=Ww7*jR{8b{Up*Ww{e0>;ywB=q z7D3OJRC1a&g>ODx%-jjkkR#$Tty;gV_lpsdwiD7593;x5d*qRh}-Xx@Xblvj$p# z-EYO*k&nY19~(_gsvu4Y?}Q(U?(M*fj|ne>MwoLKQxq#>y2wBdx>f&W+OJul=vmDeDwi=K^s`s#Aftx?P{NC-EG)X+`HQKxy!h2DPk9 z31QQp=OKlR=rmZo4TDKCI!o56XI-c^DNFDhTd-T-*9D0>K`DlVcfYvx^d>vl_KFV* z>~T?`^uZXuLwB&?2!p<;<%#Oeu!7s8ZdyZ69bnNoFzvvOw zb?~y6eHwySYAjn29nrt_6Gh#{ts_v2Ia@h~cqj4Zt@}1{`?oWbtEAdd1TiZA7QxyM zii(`M-QbynpWVd&Q>WVqt zcE5niB^S3>TZK}jy`sUE;kCW#oYgQ`$mXZVEQ-SVx%1^a*xarqInqgyuzCaMqwD)< znbve&J8LZk{L&FlVC?d&J-|APdJI%wDpsQpnp*Mp`_Pl7)OqZB$BboL(v*EpO1g0=I;SmIwR%G1f-WGx>k_j90mEMY?P!#=wqKXLRpp!Ry@>m6Dho zXSC`nAMIn!LAx&18yWqq_EvNnW+MbG2^&I*lJ#jx0~CSHQ;WZ&TG}6ER&y6u@<`HG ztyupK=DDDC;WH;0Oy$fJjFxW8^Mng8Dm*SVl!!eN$SnEEp9^SpjY(gBu2J#3SyWh1 z$uw^=jPO?F1ni@>;eFNGpH*x%@^vv5$VDjE{TN!Z_!4epN*Uy~jCADsJby8D>^g=r z#1hF>ZdATg1kFEwpvpbLM((_dd|RDlo*hNx+ZIWvx%69@ttVLUtx5SrC*GQS63FVQ z;z<-bv0N5AndBgG2A?ohUT3k@Mxi9q411o+*-?4TL4ZGN0%AQIw*I{fhG;dgwV;=mkFh%lu``Vj6*baIQeGbOJpp6bLgiR$q@L!=_v48^lgp!5PaOOR4{12`2@QN9(bnpA z32}-bV{e(>GXluG!0ls$Oqac@e>tS0=J<<@as)_=x<+4fqoPJ{lyex`6mmxRMM}3Q zzy34zES^avB!1P`@8<1*YVDVJ+b<=#hQpd8N62n7ZIE*@Y%29Muty2kdArW<2F+x? zo*7u!YtTTxteT2EXLz^g?HM^N(ED1<^y>Hrc~ms zKZ1;eYN|YD=iEA2-p;uif=*EbiW*;UgLEw?S1&qqIj@&NHZN&&P0Y0 zDvY1EgEo~&Ahc2{B$x9_y9C>{*(2*4@s67_vg^QDQ=I&Ciqbg-+m*MjHJS?fez_Sq z9X_yzH&hV8j=P57CGcITfP6=>NDOkM$=dQ(kG6$S&FguI#I=!+Ozie*P~8LIUAGjw z(kU{(b5u!WTo=cg|5?S9%+pmr51&Ff*xc_s*cw?`uyoy%ItI#L+nl^W;Di3JKQFiX57Vbz+`?X1$cy5k><|#?dlgL!borLcu zY{S>C?Ifv9TyQGkn_M5E|Av@UwpnrCOgOm`U?!zaj{p)BXiv~fpOvP|NXfls#!=XC6HfuT$_tyZ|o2Jc^HWSBs)2e6Qtn zI%_?>KF@94^YeZPTjSogK+R19-tH`*c?@|%rEsAYf=;T&hwW|9Df0`#`+$C`V+QNX*jvg%PM78!_M)`Czh$RcKS3w*(y1qE z7PN7F|J|7bd0y)-?0YRt?6;D&H-AsIHETPJ3NiAauHU}hYmBL$0uM0(AXf8Nvq>pD zJ!sW4!5CShFRYfxgQSP#_G7b~rrOB@hnssOU}jH)dJMo3Y3)QKPY2 zh;pKUqDm8~me61Uhah}lN!<;AW&7F|#f-%iU+|2pOxGk#S^fdzwj~RgwVUSVt(>Rc zW?^CxXlcY%b|vb-t>4dgMKQ~6D;DkG2N#CCQ=l%lbAp}~%26&gP_0exW=%N^)#>7A ziTD}-G8!-@ilz+iZ7MI9&sbDf%NNsE;|+H{j~b8pglAKn!bzj&=kx;DwWQ=w$<9?n ze8fwFoo^_Ur)OShl0*qyJ_M@85b3fP@btL40i#q1Ojqqd>89_;BcxVN({uOy-EN)- zncXmO8~p10a2E#Ss%?=+R;NO~3xM{ItvMWW-+P7(3gUk@Kpdx7-cW;V5V0PCM%z)Z z+ii)@1BojD^W*&9+OfY6LJb1rT>tysRRZaSuN8Mn_gQF+_(-ei#rsqnOBB@TfXeo| zE_F4yjWqUQEE9R#MEB_y5hKz9HOI7i$S*#i>VaF=4#)rQ3{rtzX8#>^yK*CAXBrd>=iU`!TFrbLQudMn6TGQf0yBau7%of(%ELBL7D=?&BN zLZD`LR=1Q}9K@*ytnb;+&Ac&F={|Ie-E%^L+5;6)-|7OFXbe&gS0V3u;yJitRXJA8 z@-!9md)DE!AVor1Q5D;XeO{I1Kb1j`JX+t;5jzrPhHWXBRRVvxyeD_>tbebJbQ5;V zmx}LFaz|KBk&iE1Us>5d@?=lPGc_eqQF~4e)7!`|sSf@uLz2bV+7vcqxH*51Myq?xPE%s-ye4Z8 zg0p!X8^@1E;8GE=E&HbgKv!!;I;mmjcoy(nRZtvV8 ztL(oF4-aH<|GvCjt{OW9R&}f~*`ov_)+TA2E*Ug~%=~-W-2zXqUXW`Z|KfksPw?8U zDpECX^-%&j6!#>)?oo9izS14>%Q5Htrax-u&)bP9+q<7W1$AHJHU^F@Q9{SBc~&#A zh^0@c=k~B%Vv62Sw`nw1A6?kUvOgPH#|{N9e$d<;k||8sz2P6_`3id@(dMlqvu}oo z1=9o!>BR$oW^@6zl?F5b$qLeTpp1^zWaEFTh}10p^c!OZ;5=4a^-HuFsb}#%pTzxp z+Y{x!^&{|3pVB!5BAP4BYgA<=2+#M@u^N_JV0wS%^e&Y5g(Zye8Fn)#Acuh2ySNmR zm+#IG0NO%q1{A%#w4(S1`6$`0ko*ZAMCdPtUL`@w*V4_z9vWoi&#@3?hxL1W6MX&T zbQamVbp6H^JbqGZPwbwK zT9f-~Jr3fEcu$s+nSvaq8ga>rXbMn)+l!XW;Z6`vp)u0p-+J6xx~kiO>XDiCqA#gg zz(siU719+Zd(wRlLa*r56(-vg`mKJ!@O`e%XEw!uyXk0^_DDCOsqDaxQo9k)tk~+J zHF$!1Co{0rhMA)1IkiE2V5CZe8xKqYfi(}xU|G{w+FmgG|{2?u(Dk+ z)hbnCCN}I^ke}D@#Y8ig;Qqvgx2>P=nBByf8%&trapm0!7Piui5xqJ3E z?0Z>8TswxKcq0@F@Es^t>}6O||!LGKnhT*Iu&y*w#9#U_B!Fwh|X@VCvr(v4okL(((deKK<}=M10`q z6f5hWc?`#U~w^G=X)`u_x?DI<(KZS)_yZ=nS>>_ z=+Es%ZZwzwdK^kUi{2(~Ie%Fi7mByE&^*Dp$gZ2m54?m2&z(vKujbg70&^pirUar? zM$gJi&6~Y?`C}Ya%9e2m%Ptsl2fyBM+4=So&QR*-ByVX=EBssJVVUIO&|+4neP>J4 z&ln%R3jyOD88pG|lSQR-M~eM(^Z@_V2;!F3#^l?qQV~aV?d0#< z!+r)PZ}yznm-6Bvoun?5vDLqTo~4!p%*GqwE~HRK0}2^~-2;L25+?Ehj zO84AETKoJP!v{Q6t0vYb2@#{QKy$5d8+Iv`H}>CzykE8Erw~9Nq2^Xu0+b7oT`KYU zy>#*oq5Ng{fMj$D?QS;L|4MJGGH|fQPmz67AEkK+jrZ(TU7h!hv*}9BQMh+!)juck zP7Q4W$TIFLFeVA(8!vA@745U>0%$Y4zlZyJo(B@uP;g1%>oV_oYch&j#Pms!L@dU1 zS5>}HYnROYUS?1>u`@k0Z19J49?F;2EsW!dD5@Ks*%f>BV$A z+P-q7pFkLZ4Cq+vlg|IGgchjdE4^m&5a1vximC}}BPzWduOV~+k~;tT%2OOncY4mV z@A1Q{EY)KLM8iFpI0h><)J@RV+VsFlarVT$BG%pe;5=%0NfN2oy(5I-z!qGIVNhbz z8vSpfPpSZiM*KGs<*5EFtT>Fy5OskNEDvh znVus94?j{H*d_rDw@WLVd%&2^+_>!STey*PI`jPsAXkie@%Qej8ZQ-9`q&6Pa@jtn z{N1g3VqE84x`h|$r+s|^nPCy%ExW+-)_9*nDv!oIdJZRJUxS@6Kd;|C21Y$|JouIr zIL$;-D?g#CGU;{O^$sk7Z%74Qix(u}^Nw%tJ%Y_O z_`UxU2sQO9Vg9sRi7u=8Lm{!w$GCz?qRT=KtWAGs41{7f0h&uf$S1xLG3DF;hzNH5 z$%_11T6frbW!@2Le%bU%sJM?3=eOtB%1C54wCMWr&hJWItR8FR*!jeB-Ki} z-|wwU8S%#p3SeS&Uh=;RaZYOQb2%Kp7(C|60OXrZ?he3dCbGWmHhMhLTeiQuhuY1n z&&ei_ZL`*kDrlI8FG)|dih~u!D4Z(P#`WZ$uOy%I0q4kdzmjOEcHNIhLBXlaiEpT^*aMebYFQl^A>)6!(d#W+ zMwFvo%zn47P>|B4ZTP8lfj8??DaC1ej{4_LUc>*=AiS>&7PhcWk~6^N91U_~1iIB{ zBILEoZ&n2KHI<#HnfBeHP))Y+nk>lYMP?EOP9D(()XZ{C_pMd8nmV;v?TB^jTwbbn75ipk7J;Xp>k{Ebl}sBUET;h4 zhoQw7ww0)eVj}&m+N6vIx&T>BginQyW+;C6;}(`iuZ*s^={2R4cRYQMlwey(4Yd%> zV#)!lvs`$iw7HZrt8|Nfw!*nJ zJuR5lY3HU!oBeaMJf3*i=PbEun z&Cp8!P-(KO6&Xj2&Oz~h&U=Kk$i_|ylf%>nqg3!`7|-^z;jI6q`KuRZz11w1*W<-N zT-n8uI7`>3)iA*+$GG2gyZ4{Ft z2f0C_Scv+585=}xv-5ue{Auc$;FJ*}Y21L=LEcWZxkR-7U0J8exRYQ)W!B0nX1ZhU zh>e~B$v%paaqCF?a_L9fg4LCw)~6KGH(8e?`!)hU%Rk4B2G@}OZ$}J4Ka3bx^R!8< z)CE!nLuf?6tv)!kPZa%VJ3)3gnhCp}vNq=Gt5b~}0dM@sVk^zS`b67b`ghQ0brVaM zoM`rXYOSpk7EV9SEdI0ZdLTQ{9h7TZ- zS1x3nGg3j$<_y?@YuQZ39OkIZBEx6$$`b4s5bHO__!%%kCpDBo#pqL8Mku;5XXS1D ziHxx+1#{dQ=2V|v^p<4T&t%yBf8xi0>HzE%fr@X@>TX`L{5bi~peLt4^nfX#S|36E z1tTpzrPLCfGbvpB3138>8Qtq^5*G@|wwfmo<2o;Bd}&IHkNJrzOvMO!lhM{(+R8CM zDF3U!B$4|@Q+S-y_!YyvLjsLCWDRN5q&g&62@e+&pK&sg>n>hE<)A|RJ0o$n>NcDq|Kb@PuJetul$rfvia~|3`f<4=N9qLxbc-=CIjP4hW4|m+3W5|=n8U-TGIE+^ zexMz_8;GF$cLX_N$4x2j%N+XX5vvj>5YnhkF@c@JjlKyopr39f2U zkrgqJ?XIvLYxKO{r%K1qZ^$Wr4+r0gSIhKls(MOK4zGJBx-#Qg4a?2XcPop;Z^tp( zPNVC7d}F~@lZkB?o=rzdh@;eXdpRSiv6Ioj&Lo1C7DW?t&wTdx!*g~tKX=4G4b%Ie zv`im)c@w-Jqb-=P>5|JT@q3qCLq4!dHu98UbW@v(cj~|}3SQ7H)J*cf)hs}@#A;xL z=YPYuJD}#<;_bn^-B0*f%@yeOzS~YyYYub|*e^@|rYM-CV@b9l6uJ}b1!Aj2N?og4-+E`Cru zV~cOsmiX_G_U3w!?WFx1y?0}Ei_E}^AhErm%gz!rh=hUW2)jUJ5ODBZtlVaeE}04S z!bCj~*Lg+qKU85s8t8(InP*KXYN>S5y!fNkl&hK^_WMmh zCF4kxt&c)aF8dc7Q!c(GD)T`$5Wm{>fiVFX+XWve*BHL6e;w_Tu1P# zUBwo(^#cAJFgZ?(HvZeCa0vYZ88#8jFez9NwlF{$t{fY+OS%Iqy5pSc{x#!?@m?L{ z-DCrE!Leap#0XDn$|RX$-=olqSg*w>}^sN}CG$`TOS>uS5qQB-y~Y4@0hQK>RXwyGGZ20DAgTOnqHl3+>ukbihxD|y{yOK|?~trY#q zM&c{f6A%3D?rc|z10VkddlV@)Q8FLMh>ze>At3=JO@9EuitDfDPji_P;54rgy{{#@ z#+D)!%!>M>A*loERzs|I{?2Fj0OIXdcC0l$e_68f-UfXl0`DJ8akSSV)4Xh04gU@S z_u3$;z0PhMc;A9RM$3?*1d~!$SR<0|4^Kd4b6G_Pe5#QrOC}l1%am2h5|KwPx=_#5 zOW^S%-}Uk_l)Yxx!!<9BZ%c16xIbr@r%6Sn+5Slr;7-hepM$`XxLWcc=1Q7n*$&m?@2@MPJND`Jjtk}+>RC+E9V*O6L+K#N8`@zks?j~`y4=Ez1=Zplk@r!Y7C(t zmhV|!?vWJOxbN;%Vj`X@RzmJhQql9@^V0i#$tNE91$|OHMlqV_W zdjY*BrBkX%6#03otaA4o33K`vNUHaX_fCiF;>U$$S^wIMJ~AVvWjV;RqzEX$YWB|G z+IsHz9mYzAjiR_;?K$04ndIvI1@*Qg^oKIrtB;kOKR%Q~cqB!8a?99OXUB0xQyf)@ zL)e+KRTI{K}C1vilmvJZYln`kE!K(6wu`f31qBZy zZKdVmet#+nJCN3pj&uz2{;YlV&GCYZ|4juM+QN%EvlYut*1hv0O#*?#4kLMGdXdAi zPbYC}>9bX%dHXxjJ2eBQ?vVc6xLcXvT7sOyeUK*10$d8;Xq~X2TYnQi=RZUdT>afK zQOM<2O7Ui~+2+5fOQUq>L9m+tZg4CPYc59-!=02`JGi7k{&spA21}pB{VedQ@|py= z>0DtnD`(^0_`8+QU+sS0_6JmiIqy5{opL^r+L=In3v_|yTQxb}>$MJhL(>Ce{j1rvqr}lN3m%?Z^+ugVy7q&IZ<9JT%O< zvGQh4#nZU%^B+MT%0*}nBLpWAhZXm>dUOZIB0kyiwRKwpM7p(*`e?!jb&oVTMny-@ z$vX+@&ECGeI}vIV~K$wJe?hZu#Vqu|8a$?JhI2>I*Bj>ZO_kR zR|;*c9r{B#Gls<_XwHNXS|iNe@->#tZ;5`7-t z3ujf{&;%09K<>&rG zeR>6Wh1bimQxNAt|M=r<$~FRXoH6Wg+Lb@>m%zXcc^F`&anjgU6G_`)cmm`TEArdQ z+D-V8FuHANBG#7~Pn$x|cF4gup|Y>T9!S9?ENZKOVMTd1LiL~eRM^=3{eZM_iHLdx zSSjU5giM5|$4V$<394mtP1r5lLh@@mCrB|yDfNFNDj#$zcA(d!u;s`G^H0TNCsz)am%k=u z=!&=~gx!Zl9XBE6sOkYGHOo^>|OAk81HrX@{XDI68Lwi2>D_a6B2y+Tdx_@ z`O$-zgob#pVzlu+Ojt>$8!_e3dUMnX?3;wm!ui`h10GRt$jqXoJJ+rd*FW_rOX}Ti z#IWC26Jm9u(;y?=`6Is0KEb`Py-X(giyO(6@S_etHc+Bsd@WTT6P7ZJ=JpCiPng)E`gv~8 z#Q*52A;Yj#gn@j{4r|4bJhE96({a;Pj9na?X{bSUu)QloAQ>vv!VkERR zgCeM+s1-y)>{O@Ls!^myX^gZ+YP8f=N?Sy&)`(a|hn=XZ)mC-=!sqvW{(AnnuXE3N zpZ7WEzV36Mdpcv>kCueThq8C%Z)OhmY=}%Cw~9zkNHq`jWX?5A982H?bNELBlH^#KXa7binRZA@wkWWlgR}D_uxWJA^ zJ=4gaoz%D6ix00?nh#m+1szEgYnFICTGa5ep=mw89mDVq@I~74d^%V+)51nsNBCpH zTFb>rVa`!fqaL)(BjE}rbr`;N<8i1!Ngll6%P{`z2$GR*rPAvl*m4=^n>LvjYB;;# zdtxst*g?^C7<4MQ*J9bA@OIH8H7*HH!OdsAqS_+e0kDF^yA`(wdIR zhc6nJUF7lWTs+o&-PXa*-Y&zT8;zJ<_j9vnV`Iqfe`gLCSjIgi_9CRM(n?EpL{aTI zR~0YL^D9oVat%G)495-~{>XeHg3e}o0Kq{UHP|n*J~T+)w~M{jf+^iN4G6V4!Q|Wl z++Um2SzhGwfG|*xr|zFAJ9;={Y>+;m)o?f4u-leix^Z>FP4PASx=#mg)qevf6&Rn^ z?yJPwk8xOMY))hJD-nJfd9}3$iA+R2a6~O1VDqqv!U=V0uY6A(k1fCH52GP4dG>tl zLeAHpJ-EYX{sHMXb)oOVwhQ-nZKrbDIRV8v{}i>bxF`dxQ%O~*NdCvehw>LODR>3A z?FU~(psM@0rHd%qb={Z&<`^MmVW=Emb5Qxlf7`JMCbW3p1hyx+wW+XD6=QSrYqp90 z1|_}T^Rmc(1@#g_rB7-IKi#0AJkchiod%*0H@5V5(CX54iFt2frzf6?->nL_aN_u8 zlIR4zB%OJWBdeMRPygtV<|07?SMamJNFg@Y>Z(v8TKf~S7wvv&A%{XcO>_z6u6^@@ zqE-itcsQb9f=|XtjpTT3nuQ8VDJGZMQ=><71kTF7bP%J_UHh|b1av#}WlUt=(G=KS zvi6`@v0U!0b6Z4lPWgG|gcI~#W4$?MGIP@L!Uz2nWwp}R5%yju$)by5MxH?Bsd$BJ zz3DeQ?Vde)1V5apl{RM7?i}_uv5PPyE*WMmCUX>=CkGYSliNm`Sl>jTez=~{&Fpop zRycRWE2Jc+LB2So)bSy7l7W+wc7S*}qg_0K&19eLgG_n~i$5*QUFFEBG2e`P%9pwq zM%92OOUCm3e3EuP`uKLLnczMtWLV~zW?lymurKxzU=Ek2C!+d8$d*C}aixEhy*UDi z8_IPn5xqJtwqe_WQqLcD6Dxv^`wh08o3we zhM#Pagku?==AO4+Db+!1r}R56Cny|%R|xfT2WwqZ6}Td$n)7wtnZ-QX&8$BTTlGH@ zpqi~PgN-y>KCRZST&fa|?`{;t~kZ)h;v^G6>?=1&tfvYxdL?+a%tpw=T8E-!*e%EjTbe{ zzyG#KQ!RKKrm&YUxCM_wK3_v#k9tbRXhwLD>mSNQsn)tsx+gr=+KrTw@9`0 zk=&78XKSH1s#~RWdU)~Wui->YQ8l@=^A zYv+oAGqNiKqjAZvY5$%wAz9&HKPU2BL)e48Ar=A*7Wt?9&cIs3 zpC>K#^+H?LEB5WYCAHc#kxur8W^DFR$c3^*V+x_v1bznu>w4Jz#3cD$F7T=%24zx2 z`)r}~7Rz=2A~@0DLe@BM7tYT|f+wt(oIGaRP!ptO}RcjlPZY%s7hEGh_TgIBWir zf0;-#8N-O1DmWt|IoS>3|EAdvX-qZBK48gANrq3$+1G>MqZ-kSuaY!;<|P@?>y+onCtHRq+` z`#UGd4gj0s3YXUkUm;uLvFW)b^*<0lzYC!B%J-KFF~LXRW0~T< zg07Pmc5dRsE4CJS-Do>2(ZzYCm;P~d4(d&Hweo`Da|l)Thp`Q)keP_mnP z&BkwEWDOVKzj!DOYB!x_SJCD&6O>N!A06c=FBx&SE8B8mZ{4^xVCvlg`RNVSnh7!O zF=R5&1z{Oc$G@j*2hZux{ZG;pb_Y)So1$f?0sw-uH_j|8Y2U2ONRw#-DkfQC;W_9;eDBI>{GyDys5ZMH_c+lLwtM3Uv8lq);>==qS0_&}8uPv->`1p)T=BP`#mV9jhF-J`1b{t2Wy z5ZWl^vufarKP3>($Qm25jbpkR5>R+RS_+uVFOtSJfZV;US8C1arz>piB`M)0&+%>( zs)CRF=^9z>I-C0QzUqEDoVG`rk7F0WABQvpqs>fs+tBy)Cl9OEq9CqqKBu84Sdi#U z8TMIk1+ls%PT5;D%vk8U&v9^&wD7(XLB}Dzc@NynmUCDIa-vR7Li)(@>ZDh|ONFS9 z=?COs$5!%7H0!Y@Fhb=5N4?Hj!ElTZnWTEs+sUXjG#%Yj%wF-v6sl8w9#-Q=l2@Vl zQXJ=Bt+x@1gy%ZXa8}wch07|%cp-vF%c?B=-$zN*^RwK(Z_fzu926g`lPM$l=}*{q7Zz@H9a1{(~Qj!r8Po`gZ8R z_VVx`=gf|&Kk?u;{Lt6Y&4k<7l>bC{p^&?Czq41XeR~2wakP_hhiC6uhle=Qlami5Z4UZi9qAZWn&19?2k8#b4D^A#7O3JEHAgP~)PCpc%;8nbDtWDySy@+Ezw6SYJc>eZVL<$b&3b zks+-8r*FS-8ns#`PV&j$_j*di{SaDRUEcuq{WHzo`uFVe_haE;dvWx08c;`^(whrW z=MqTG?0nb#;e20o5sUXI?`wm^2NR5M5w{-q7#|<%fBW_aKj=&G>rO#r!Sf#vV1XB= zXV4~T$@Eq*Ws!N#DEwEz=CJZmV30bpd$QVWJ`?~5?qYQX*F=CIA8){RAljF+lq|Wn zK4ne>><%E$q*P9J7Ir)y(czT-i zJFp<~LSy6e!oo#LN#uKGlk4$+2RA$7EmYhn_5A4V{K$8+zx(cr06r}hkeu+38MR}D z?v>k>?~Ant@De4NR>OD7Y2^?etX~kp8By{XD71E`>;_(}0KfTwkjw`JvVE3x83HgfAGzERhK8R;ja>{&yQQE<&&~g)eO18@TfJ^9ZGw#7C+r&{8 z^VO2o-{$1ODd)K7vi7hwdwn>$p%F0@j(TruwGvX9%>NzPqn)&pHMMq+FOdrnI*m5J zjUJn4cJWHG!T_7^u z!U<Em|5zHyI)4W+QFl*hkk)@&yh;9|79GUuEcQ~rCl1Szty!vG z^UIeskJZYpdeoswC_dsV-hsdFuwT9dgtTCG(kx=nj$fjX&*7$(h}TfAPsLt75KvIob@1MmSV7?OZ^@l6 z&NrcKr=3K)H@ssFONYHBlm*rGjZdl3xfOCHVOKFSjY&ZbRRsNx3cAj%t$6^T`7%A( z-SZo?r)cV~Qj6|2#Q*}DuZcKdP?1)etKR3jo%n*5>>0*(&>=-+n13XRH(ya*uGNmU zx#*w8!hfKnDtxlk3f|ZTFfydrTrNRS%*4y?HIFSc3Q`Jp@ezm;(A+49tDdS%*P+n* z{%M2Rqm(w@^qdG&zMe5}R84$b-7-vpRhFg~CRv^RYpims)@+(+8=xix02mZAlJ%cN zTnoxU4TcdZRgQ_k%+u-6I@l$v0822Mc!HPB>GgJW&&&$paXo_aej7!K>@OQwY*1(U zPKWlt7_$hv6rUgV@d!3PJc^Nqw|QUE!RKqT|$f3 zOrE(D*ct+gOGNZuGYLb1(uQ6URIA6^$D{(i;jRvcBDxjzf(%D50)e~$0R1PJ`H< z;cSip*3msv6dU5>s*KMC(x~A~>U3)!Xs+!BDXZI5m$k>OLNUtgFV)#*oXHtYf`mNi zd(rXmO4qCBVAc3sB{rJ?*Xf#LJZ6_ji6Enzfryn{G=H0A_O(REq8m`KOGe zTMenZ`<6q`RYA`Zi!-`mudkZp7z())hMCfg?Xps7NHjasycSSxdH?Kb$~18m8V# z-mn_*coW8@z|6|Kgxo`~&7BxIz@zPlyw`vegUbi=b#MTprK+mh4k30atnHA#h`{)7I?~QXZXIg0N(SdgcNA42m$||bFFLZS5nR^QanYfYV zSjI}jiR^(hAq+V)WZ$Bi9lST?#R=BV5ADzU&S`$mX!-QtTNCp}ow=T({=Qa;4AvXs zoaCNSALy*4H~V6LAt}2rBljWj*Q1D8vL&y>3V^l&Z1{Em0lK{Cg7+-q;Q;nyX@)j^ IYU~yJfB&NIudblbs@G)>bSbEce{$wUxOm|Byg>3B#< zD^HDzMglHJIV>lE-ETJ(1OycEz%F|L+4@|I2@B& zTQ6x|uV-w*M)8zzb*mo3<4abnb!}Z;-FcVGRqXM2=1@;ln&@GF6jxW=7dc){HBonJ zYimJ1$P7^8V>U$}ZmqM^`=4zH*Q(nj->K9}>H>9#f=Kvox8jS3u#ZBHXHid4W2y&Z zYavbHF^OuV3@*n8-*qoP(nkULGpUIq^})EB#bOoqWGazru<813yKaMBw=3B==J_bT zm-%;kz3B3GD#@5!Kb23#QS{-~Jl@Wzd0{-Mvv8lMmQ(fAZDCbftC3cbgMB5bI8d5~ z+^V8`_)>o_Sq_&IRhMdTvaSH9>diQJr2%e_8{#YEBag>eYC^C-?)o50*wd&w;ZhKG zK~)J>d<`&Sd_CKhigo5 z(pShs*vCnFc#bmaK%Vfw6>gBNql$U2CVNK4awDdAh~w|snMth0pEzGz2Sa<`zS z_AG3zby$#uE)^RN1~fbF&41uf;y5-}90;<~m*dO4A8^@m1qDr&h9~KR`m4>OVd91&w z^0ZnLJBkk*xd}JS7EZ-QJGwi&@F2dd(UI0axCU(4UVO;Nb3gn2Z<}4Mixl%wEXn>J z(vu6b*I`Y`Zj`m?D!%MLQGC`vv>(Ym|C)c8Uuvm9Lf%%yX2kQj4QH%X+yiZ@4kfHl zzFvZ}ZS}bBYB%CPkUz@$hu5LZL!sJ(cBnP~W8pp&RhPl4Th%^M$MrA!kC*#gsJ3eF zjmkfYKm7U+^TTzJyk$Km#*0HN)I}ko29R1UlD%L!%+F(oqsp$KXQK1gRbf> zdt$ML`JcC=qoV^ppAUY&AHBUj;QL;A=whEmmO04k@G{`#>NI*Y<3_g-Gl2_{qXw+;12|F z!`F*mU%%qt8oUXS&+o%tdm7@nABn!o--Ju;ZK3^lg!zZK4Gj&d&VI)1?;pU=n>w&? z`V}OvyofDDX;@jh3(4gv*r^|bskscrtyb)@pTMVCYm9y2r^-VJ{*Mywk)h|`8o_ls zooaqnoo^1Ht+gL1TU|&!(1{hlnebs+JZ7AXN9^&X#=B4U!x_vuxF@mpx$AMxaRGh3 zeMWz<_oC`wQ&Xea?e=dZ-$-tFZspkDA7GyaaO?H}_Sc?Nd&2v_FTp!YV-c6OOfiKk za~{jRcyaCq6t!CJ>5rZs)u%o5@D>$*{b~-UQ)_E$d!?_hFP-`JMRM;SOV736aN+3r zT&ybEg~cb<;U@Y9^^@!&?INnXY%IC)MXs{y( zay}&S@g8NOhV;Q}%7?ISviC)iYm(PpR0{Pv^(YmI8*(i7h4dtkA5dA8kBZD`xUrk} z?xo(KM$En65TA|oF`d72sNsA#d0n_~Qe);0<6{Ej#!`8dp95HrB-em&po{c_$hF0FUbc-T(jq literal 0 HcmV?d00001 diff --git a/static/js/blockly.js b/static/js/blockly.js new file mode 100644 index 0000000..aa8a9ad --- /dev/null +++ b/static/js/blockly.js @@ -0,0 +1,728 @@ + +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview JavaScript for Blockly's Code demo. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * Create a namespace for the application. + */ +var blockly = {}; + + + +/** + * Lookup for names of supported languages. Keys should be in ISO 639 format. + */ +blockly.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. + */ +blockly.LANGUAGE_RTL = ['ar', 'fa', 'he', 'lki']; + +/** + * Blockly's main workspace. + * @type {Blockly.WorkspaceSvg} + */ +blockly.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. + */ +blockly.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. + */ +blockly.getLang = function () { + var lang = blockly.getStringParamFromUrl('lang', ''); + if (blockly.LANGUAGE_NAME[lang] === undefined) { + // Default to English. + lang = 'en'; + } + return lang; +}; + +/** + * Is the current language (blockly.LANG) an RTL language? + * @return {boolean} True if RTL, false if LTR. + */ +blockly.isRtl = function () { + return blockly.LANGUAGE_RTL.indexOf(blockly.LANG) != -1; +}; + +/** + * Load blocks saved on App Engine Storage or in session/local storage. + * @param {string} defaultXml Text representation of default blocks. + */ +blockly.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, blockly.workspace); + } else if (defaultXml) { + // Load the editor with default starting blocks. + var xml = Blockly.Xml.textToDom(defaultXml); + Blockly.Xml.domToWorkspace(xml, blockly.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. + */ +blockly.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(blockly.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. + */ +blockly.changeCodingLanguage = function () { + var codeMenu = document.getElementById('code_menu'); + blockly.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. + */ +blockly.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. + */ +blockly.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 + */ +blockly.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} + */ +blockly.LANG = blockly.getLang(); + +/** + * List of tab names. + * @private + */ +blockly.TABS_ = ['blocks', 'python']; + +/** + * List of tab names with casing, for display in the UI. + * @private + */ +blockly.TABS_DISPLAY_ = [ + 'Blocks', 'Python', , +]; + +blockly.selected = 'blocks'; + +/** + * Switch the visible pane when a tab is clicked. + * @param {string} clickedName Name of tab clicked. + */ +blockly.tabClick = function (clickedName) { + // If the XML tab was open, save and render the content. + // tabmin tab_collapse + + if (document.getElementById('tab_blocks').classList.contains('tabon')) { + blockly.workspace.setVisible(false); + } + // Deselect all tabs and hide all panes. + for (var i = 0; i < blockly.TABS_.length; i++) { + var name = blockly.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. + blockly.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'; + blockly.renderContent(); + // The code menu tab is on if the blocks tab is off. + var codeMenuTab = document.getElementById('tab_code'); + if (clickedName == 'blocks') { + blockly.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(blockly.workspace); +}; + +/** + * Populate the currently selected pane with content generated from the blocks. + */ +blockly.renderContent = function () { + var content = document.getElementById('content_' + blockly.selected); + // Initialize the pane. + if (content.id == 'content_xml') { + var xmlTextarea = document.getElementById('content_xml'); + var xmlDom = Blockly.Xml.workspaceToDom(blockly.workspace); + var xmlText = Blockly.Xml.domToPrettyText(xmlDom); + xmlTextarea.value = xmlText; + xmlTextarea.focus(); + } else if (content.id == 'content_python') { + console.log("generating python code") + VarData = {}; + blockly.attemptCodeGeneration(Blockly.Python); + } + 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. + */ +blockly.attemptCodeGeneration = function (generator) { + var content = document.getElementById('content_' + blockly.selected); + content.textContent = ''; + if (blockly.checkAllGeneratorFunctionsDefined(generator)) { + var code = generator.workspaceToCode(blockly.workspace); + content.textContent = code; + + // Remove the 'prettyprinted' class, so that Prettify will recalculate. + } +}; + +/** + * Check whether all blocks in use have generator functions. + * @param generator {!Blockly.Generator} The generator to use. + */ +blockly.checkAllGeneratorFunctionsDefined = function (generator) { + var blocks = blockly.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. + */ +blockly.init = function () { + blockly.initLanguage(); + + var rtl = blockly.isRtl(); + var container = document.getElementById('content_area'); + var onresize = function (e) { + var bBox = blockly.getBBox_(container); + for (var i = 0; i < blockly.TABS_.length; i++) { + var el = document.getElementById('content_' + blockly.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 (blockly.workspace && blockly.workspace.getToolbox().width) { + document.getElementById('tab_blocks').style.minWidth = + (blockly.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); + + blockly.workspace = Blockly.inject('content_blocks', + { + grid: + { + spacing: 25, + length: 3, + colour: '#ccc', + snap: true + }, + media: '/static/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'); + + blockly.loadBlocks(''); + + if ('BlocklyStorage' in window) { + // Hook a save function onto unload. + BlocklyStorage.backupOnUnload(blockly.workspace); + } + + blockly.tabClick(blockly.selected); + + blockly.bindClick('trashButton', + function () { blockly.discard(); blockly.renderContent(); }); + blockly.bindClick('runButton', blockly.LaunchCode); + blockly.bindClick('colabButton', blockly.OpenColab); + blockly.bindClick('copyButton', blockly.copyCode); + blockly.bindClick('downlaodButton', blockly.DownloadCode); + + // 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']; + blockly.bindClick(linkButton, + function () { BlocklyStorage.link(blockly.workspace); }); + } else if (linkButton) { + linkButton.className = 'disabled'; + } + + for (var i = 0; i < blockly.TABS_.length; i++) { + var name = blockly.TABS_[i]; + blockly.bindClick('tab_' + name, + function (name_) { return function () { blockly.tabClick(name_); }; }(name)); + } + blockly.bindClick('tab_code', function (e) { + if (e.target !== document.getElementById('tab_code')) { + // Prevent clicks on child codeMenu from triggering a tab click. + return; + } + blockly.changeCodingLanguage(); + }); + + onresize(); + Blockly.svgResize(blockly.workspace); + + // Lazy-load the syntax-highlighting. + window.setTimeout(blockly.importPrettify, 1); +}; + +/** + * Initialize the page language. + */ +blockly.initLanguage = function () { + // Set the HTML's language and direction. + var rtl = blockly.isRtl(); + document.dir = rtl ? 'rtl' : 'ltr'; + document.head.parentElement.setAttribute('lang', blockly.LANG); + + // Sort languages alphabetically. + var languages = []; + for (var lang in blockly.LANGUAGE_NAME) { + languages.push([blockly.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 == blockly.LANG) { + option.selected = true; + } + languageMenu.options.add(option); + } + languageMenu.addEventListener('change', blockly.changeLanguage, true); + + // Populate the coding language selection menu. + var codeMenu = document.getElementById('code_menu'); + codeMenu.options.length = 0; + for (var i = 1; i < blockly.TABS_.length; i++) { + codeMenu.options.add(new Option(blockly.TABS_DISPLAY_[i], blockly.TABS_[i])); + } + codeMenu.addEventListener('change', blockly.changeCodingLanguage); + + //document.getElementById('title').textContent = MSG['title']; + document.getElementById('tab_blocks').textContent = MSG['blocks']; + + document.getElementById('linkButton').title = MSG['linkTooltip']; + document.getElementById('runButton').title = "Run frature is currently disabled"; + document.getElementById('trashButton').title = MSG['trashTooltip']; +}; + +/** + * Execute the user's blockly. + * Just a quick and dirty eval. Catch infinite loops. + */ +blockly.runJS = function () { + Blockly.JavaScript.INFINITE_LOOP_TRAP = 'checkTimeout();\n'; + var timeouts = 0; + var checkTimeout = function () { + if (timeouts++ > 1000000) { + throw MSG['timeout']; + } + }; + var code = Blockly.Python.workspaceToCode(blockly.workspace); + Blockly.JavaScript.INFINITE_LOOP_TRAP = null; + try { + eval(code); + } catch (e) { + console.log(MSG['badCode'].replace('%1', e)); + } +}; + + +blockly.LaunchCode = function () { + alert("Run is not yet supported!! Please download .ipynb and use in Google Colab"); +}; + +blockly.DownloadCode = function () { + var xml = Blockly.Xml.workspaceToDom(blockly.workspace); + var xml_text = Blockly.Xml.domToText(xml); + + var fileType = "xml" + var fileName = "blocklyML.xml" + var blob = new Blob([xml_text], { type: fileType }); + + var a = document.createElement('a'); + a.download = fileName; + a.href = URL.createObjectURL(blob); + a.dataset.downloadurl = [fileType, a.download, a.href].join(':'); + a.style.display = "none"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + setTimeout(function () { URL.revokeObjectURL(a.href); }, 1500); +}; +blockly.UploadXml = function () { + + + document.getElementById("myForm").style.display = "block"; + + $(document).keyup(function (e) { + if (e.key === "Escape") { // escape key maps to keycode `27` + document.getElementById("myForm").style.display = "none"; + } + }); + + + document.querySelectorAll(".drop-zone__input").forEach((inputElement) => { + + console.log(inputElement) + + var eventChanger = false; + + inputElement.addEventListener("change", (e) => { + if(!eventChanger){ //hot fix + if (inputElement.files.length) { + const input = e.target + var file = input.files[0] + var fr = new FileReader(); + + fr.readAsText(file) + fr.onload = function () { + var xml = Blockly.Xml.textToDom(fr.result); + Blockly.Xml.domToWorkspace(xml, blockly.workspace); + fr = new FileReader(); + document.getElementById("myForm").style.display = "none"; + } + + } + eventChanger = true + } + }); + const dropZoneElement = inputElement.closest(".drop-zone"); + dropZoneElement.addEventListener("click", (e) => { + inputElement.click(); + + }); + dropZoneElement.addEventListener("dragover", (e) => { + e.preventDefault(); + dropZoneElement.classList.add("drop-zone--over"); + }); + + ["dragleave", "dragend"].forEach((type) => { + dropZoneElement.addEventListener(type, (e) => { + dropZoneElement.classList.remove("drop-zone--over"); + }); + }); + + dropZoneElement.addEventListener("drop", (e) => { + e.preventDefault(); + var files = e.dataTransfer.files; + if (e.dataTransfer.files.length) { + //var files = e.target.files || (e.dataTransfer && e.dataTransfer.files); + inputElement.files = files; + var file = files[0] + if (typeof file !== "undefined") { + var fr = new FileReader(); + + fr.readAsText(file) + + fr.onload = function () { + var xml = Blockly.Xml.textToDom(fr.result); + Blockly.Xml.domToWorkspace(xml, blockly.workspace); + document.getElementById("myForm").style.display = "none"; + } + } + } + + dropZoneElement.classList.remove("drop-zone--over"); + }); + + }); + +}; + + +blockly.UploadFromUrl = function () { + + let url = document.forms["urlForm"]["url"].value; + fetch(url).then((r) => { + r.text().then((d) => { + var xml = Blockly.Xml.textToDom(d); + Blockly.Xml.domToWorkspace(xml, blockly.workspace); + }) + }) + + document.getElementById("myForm").style.display = "none"; +}; + + +blockly.OpenColab = function () { + window.open("https://colab.research.google.com/#create=true"); +}; + +blockly.copyCode = function () { + var code = Blockly.Python.workspaceToCode(blockly.workspace); + var copyText = document.createElement('textarea'); + copyText.value = code; + copyText.setAttribute('readonly', ''); + copyText.style = { position: 'absolute', left: '-9999px' }; + document.body.appendChild(copyText); + copyText.select(); + copyText.setSelectionRange(0, 99999); + document.execCommand('copy'); +}; +/** + * Discard all blocks from the workspace. + */ +blockly.discard = function () { + var count = blockly.workspace.getAllBlocks(false).length; + if (count < 2 || + window.confirm(Blockly.Msg['DELETE_ALL_BLOCKS'].replace('%1', count))) { + blockly.workspace.clear(); + if (window.location.hash) { + window.location.hash = ''; + } + } +}; + + + +Blockly.Blocks['string_length'] = { + init: function () { + this.appendValueInput('VALUE') + .setCheck('String') + .appendField('length of'); + this.setOutput(true, 'Number'); + this.setColour(160); + this.setTooltip('Returns number of letters in the provided text.'); + this.setHelpUrl('http://www.w3schools.com/jsref/jsref_length_string.asp'); + } +}; + + + + +// Load the Code demo's language strings. +document.write('\n'); +// Load Blockly's language strings. +document.write('\n'); + +window.addEventListener('load', blockly.init); diff --git a/static/js/blockly_ML.js b/static/js/blockly_ML.js new file mode 100644 index 0000000..ae620ee --- /dev/null +++ b/static/js/blockly_ML.js @@ -0,0 +1,233 @@ +// 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_(.*)ML\.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. +goog.addDependency('../../core/block.js', ['Blockly.Block'], ['Blockly.ASTNode', 'Blockly.Blocks', 'Blockly.Connection', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Extensions', 'Blockly.Input', 'Blockly.Tooltip', 'Blockly.Workspace', 'Blockly.constants', 'Blockly.fieldRegistry', 'Blockly.navigation', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.deprecation', 'Blockly.utils.object', 'Blockly.utils.string'], {'lang': 'es5'}); +goog.addDependency('../../core/block_animations.js', ['Blockly.blockAnimations'], ['Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/block_drag_surface.js', ['Blockly.BlockDragSurfaceSvg'], ['Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/block_dragger.js', ['Blockly.BlockDragger'], ['Blockly.Events', 'Blockly.Events.BlockDrag', 'Blockly.Events.BlockMove', 'Blockly.InsertionMarkerManager', 'Blockly.blockAnimations', 'Blockly.constants', 'Blockly.utils.Coordinate', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/block_svg.js', ['Blockly.BlockSvg'], ['Blockly.ASTNode', 'Blockly.Block', 'Blockly.ContextMenu', 'Blockly.ContextMenuRegistry', 'Blockly.Events', 'Blockly.Events.BlockMove', 'Blockly.Events.Selected', 'Blockly.Msg', 'Blockly.RenderedConnection', 'Blockly.TabNavigateCursor', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.blockAnimations', 'Blockly.blockRendering.IPathObject', 'Blockly.constants', 'Blockly.navigation', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.deprecation', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/blockly.js', ['Blockly'], ['Blockly.Events', 'Blockly.Events.Ui', 'Blockly.Events.UiBase', 'Blockly.Procedures', 'Blockly.ShortcutRegistry', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.Variables', 'Blockly.WidgetDiv', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.constants', 'Blockly.inject', 'Blockly.utils', 'Blockly.utils.Size', 'Blockly.utils.colour'], {}); +goog.addDependency('../../core/blocks.js', ['Blockly.Blocks'], [], {}); +goog.addDependency('../../core/bubble.js', ['Blockly.Bubble'], ['Blockly.Scrollbar', 'Blockly.Touch', 'Blockly.Workspace', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/bubble_dragger.js', ['Blockly.BubbleDragger'], ['Blockly.Bubble', 'Blockly.Events', 'Blockly.Events.CommentMove', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.Coordinate'], {}); +goog.addDependency('../../core/comment.js', ['Blockly.Comment'], ['Blockly.Bubble', 'Blockly.Css', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Events.BubbleOpen', 'Blockly.Icon', 'Blockly.Warning', 'Blockly.utils.Svg', 'Blockly.utils.deprecation', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/connection.js', ['Blockly.Connection'], ['Blockly.Events', 'Blockly.Events.BlockMove', 'Blockly.Xml', 'Blockly.constants', 'Blockly.utils.deprecation'], {}); +goog.addDependency('../../core/connection_checker.js', ['Blockly.ConnectionChecker'], ['Blockly.constants', 'Blockly.registry'], {}); +goog.addDependency('../../core/connection_db.js', ['Blockly.ConnectionDB'], ['Blockly.RenderedConnection', 'Blockly.constants'], {}); +goog.addDependency('../../core/constants.js', ['Blockly.constants'], [], {}); +goog.addDependency('../../core/contextmenu.js', ['Blockly.ContextMenu'], ['Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.Msg', 'Blockly.Xml', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/contextmenu_items.js', ['Blockly.ContextMenuItems'], ['Blockly.constants'], {'lang': 'es5'}); +goog.addDependency('../../core/contextmenu_registry.js', ['Blockly.ContextMenuRegistry'], ['Blockly.ContextMenuItems'], {'lang': 'es5'}); +goog.addDependency('../../core/css.js', ['Blockly.Css'], [], {'lang': 'es5'}); +goog.addDependency('../../core/dropdowndiv.js', ['Blockly.DropDownDiv'], ['Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.style'], {}); +goog.addDependency('../../core/events/block_events.js', ['Blockly.Events.BlockBase', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Events.Change', 'Blockly.Events.Create', 'Blockly.Events.Delete', 'Blockly.Events.Move'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.registry', 'Blockly.utils.Coordinate', 'Blockly.utils.object', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/events/events.js', ['Blockly.Events'], ['Blockly.registry', 'Blockly.utils'], {}); +goog.addDependency('../../core/events/events_abstract.js', ['Blockly.Events.Abstract'], ['Blockly.Events'], {}); +goog.addDependency('../../core/events/events_block_drag.js', ['Blockly.Events.BlockDrag'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_bubble_open.js', ['Blockly.Events.BubbleOpen'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_click.js', ['Blockly.Events.Click'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_marker_move.js', ['Blockly.Events.MarkerMove'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_selected.js', ['Blockly.Events.Selected'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_theme_change.js', ['Blockly.Events.ThemeChange'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_toolbox_item_select.js', ['Blockly.Events.ToolboxItemSelect'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_trashcan_open.js', ['Blockly.Events.TrashcanOpen'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/events_viewport.js', ['Blockly.Events.ViewportChange'], ['Blockly.Events', 'Blockly.Events.UiBase', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/ui_events.js', ['Blockly.Events.Ui', 'Blockly.Events.UiBase'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/variable_events.js', ['Blockly.Events.VarBase', 'Blockly.Events.VarCreate', 'Blockly.Events.VarDelete', 'Blockly.Events.VarRename'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/events/workspace_events.js', ['Blockly.Events.FinishedLoading'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.registry', 'Blockly.utils.object'], {'lang': 'es5'}); +goog.addDependency('../../core/events/ws_comment_events.js', ['Blockly.Events.CommentBase', 'Blockly.Events.CommentChange', 'Blockly.Events.CommentCreate', 'Blockly.Events.CommentDelete', 'Blockly.Events.CommentMove'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.registry', 'Blockly.utils.Coordinate', 'Blockly.utils.object', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/extensions.js', ['Blockly.Extensions'], ['Blockly.utils'], {}); +goog.addDependency('../../core/field.js', ['Blockly.Field'], ['Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Gesture', 'Blockly.Tooltip', 'Blockly.utils', 'Blockly.utils.Rect', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.style', 'Blockly.utils.userAgent'], {'lang': 'es5'}); +goog.addDependency('../../core/field_angle.js', ['Blockly.FieldAngle'], ['Blockly.Css', 'Blockly.DropDownDiv', 'Blockly.FieldTextInput', 'Blockly.fieldRegistry', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/field_checkbox.js', ['Blockly.FieldCheckbox'], ['Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.utils.Size', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/field_colour.js', ['Blockly.FieldColour'], ['Blockly.Css', 'Blockly.DropDownDiv', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.navigation', 'Blockly.utils.IdGenerator', 'Blockly.utils.KeyCodes', 'Blockly.utils.Size', 'Blockly.utils.aria', 'Blockly.utils.colour', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/field_dropdown.js', ['Blockly.FieldDropdown'], ['Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.fieldRegistry', 'Blockly.navigation', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.string', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/field_image.js', ['Blockly.FieldImage'], ['Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.utils', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/field_label.js', ['Blockly.FieldLabel'], ['Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.utils', 'Blockly.utils.Size', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/field_label_serializable.js', ['Blockly.FieldLabelSerializable'], ['Blockly.FieldLabel', 'Blockly.fieldRegistry', 'Blockly.utils', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/field_multilineinput.js', ['Blockly.FieldMultilineInput'], ['Blockly.Css', 'Blockly.DropDownDiv', 'Blockly.FieldTextInput', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {'lang': 'es5'}); +goog.addDependency('../../core/field_number.js', ['Blockly.FieldNumber'], ['Blockly.FieldTextInput', 'Blockly.fieldRegistry', 'Blockly.utils.aria', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/field_registry.js', ['Blockly.fieldRegistry'], ['Blockly.registry'], {}); +goog.addDependency('../../core/field_textinput.js', ['Blockly.FieldTextInput'], ['Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.Msg', 'Blockly.fieldRegistry', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.Size', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/field_variable.js', ['Blockly.FieldVariable'], ['Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.FieldDropdown', 'Blockly.Msg', 'Blockly.VariableModel', 'Blockly.Variables', 'Blockly.Xml', 'Blockly.constants', 'Blockly.fieldRegistry', 'Blockly.utils', 'Blockly.utils.Size', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/flyout_base.js', ['Blockly.Flyout'], ['Blockly.Block', 'Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Events.VarCreate', 'Blockly.FlyoutCursor', 'Blockly.Gesture', 'Blockly.Marker', 'Blockly.Scrollbar', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.blockRendering', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.toolbox'], {}); +goog.addDependency('../../core/flyout_button.js', ['Blockly.FlyoutButton'], ['Blockly.Css', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es5'}); +goog.addDependency('../../core/flyout_dragger.js', ['Blockly.FlyoutDragger'], ['Blockly.WorkspaceDragger', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/flyout_horizontal.js', ['Blockly.HorizontalFlyout'], ['Blockly.Block', 'Blockly.Flyout', 'Blockly.Scrollbar', 'Blockly.WidgetDiv', 'Blockly.constants', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Rect', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/flyout_vertical.js', ['Blockly.VerticalFlyout'], ['Blockly.Block', 'Blockly.Flyout', 'Blockly.Scrollbar', 'Blockly.WidgetDiv', 'Blockly.constants', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Rect', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/generator.js', ['Blockly.Generator'], ['Blockly.Block', 'Blockly.constants'], {}); +goog.addDependency('../../core/gesture.js', ['Blockly.Gesture'], ['Blockly.ASTNode', 'Blockly.BlockDragger', 'Blockly.BubbleDragger', 'Blockly.Events', 'Blockly.Events.Click', 'Blockly.FlyoutDragger', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.WorkspaceDragger', 'Blockly.blockAnimations', 'Blockly.constants', 'Blockly.navigation', 'Blockly.utils', 'Blockly.utils.Coordinate'], {}); +goog.addDependency('../../core/grid.js', ['Blockly.Grid'], ['Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/icon.js', ['Blockly.Icon'], ['Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/inject.js', ['Blockly.inject'], ['Blockly.BlockDragSurfaceSvg', 'Blockly.Css', 'Blockly.DropDownDiv', 'Blockly.Events', 'Blockly.Grid', 'Blockly.Msg', 'Blockly.Options', 'Blockly.ScrollbarPair', 'Blockly.Tooltip', 'Blockly.WorkspaceDragSurfaceSvg', 'Blockly.WorkspaceSvg', 'Blockly.utils', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/input.js', ['Blockly.Input'], ['Blockly.Connection', 'Blockly.FieldLabel', 'Blockly.constants'], {}); +goog.addDependency('../../core/insertion_marker_manager.js', ['Blockly.InsertionMarkerManager'], ['Blockly.Events', 'Blockly.blockAnimations', 'Blockly.constants'], {'lang': 'es5'}); +goog.addDependency('../../core/interfaces/i_accessibility.js', ['Blockly.IASTNodeLocation', 'Blockly.IASTNodeLocationSvg', 'Blockly.IASTNodeLocationWithBlock', 'Blockly.IBlocklyActionable'], [], {}); +goog.addDependency('../../core/interfaces/i_bounded_element.js', ['Blockly.IBoundedElement'], [], {}); +goog.addDependency('../../core/interfaces/i_bubble.js', ['Blockly.IBubble'], [], {}); +goog.addDependency('../../core/interfaces/i_connection_checker.js', ['Blockly.IConnectionChecker'], [], {}); +goog.addDependency('../../core/interfaces/i_contextmenu.js', ['Blockly.IContextMenu'], [], {}); +goog.addDependency('../../core/interfaces/i_copyable.js', ['Blockly.ICopyable'], [], {}); +goog.addDependency('../../core/interfaces/i_deletable.js', ['Blockly.IDeletable'], [], {}); +goog.addDependency('../../core/interfaces/i_deletearea.js', ['Blockly.IDeleteArea'], [], {}); +goog.addDependency('../../core/interfaces/i_flyout.js', ['Blockly.IFlyout'], [], {}); +goog.addDependency('../../core/interfaces/i_movable.js', ['Blockly.IMovable'], [], {}); +goog.addDependency('../../core/interfaces/i_registrable.js', ['Blockly.IRegistrable'], [], {}); +goog.addDependency('../../core/interfaces/i_registrable_field.js', ['Blockly.IRegistrableField'], [], {}); +goog.addDependency('../../core/interfaces/i_selectable.js', ['Blockly.ISelectable'], [], {}); +goog.addDependency('../../core/interfaces/i_styleable.js', ['Blockly.IStyleable'], [], {}); +goog.addDependency('../../core/interfaces/i_toolbox.js', ['Blockly.IToolbox'], [], {}); +goog.addDependency('../../core/interfaces/i_toolbox_item.js', ['Blockly.ICollapsibleToolboxItem', 'Blockly.ISelectableToolboxItem', 'Blockly.IToolboxItem'], [], {}); +goog.addDependency('../../core/keyboard_nav/ast_node.js', ['Blockly.ASTNode'], ['Blockly.constants', 'Blockly.utils.Coordinate'], {'lang': 'es5'}); +goog.addDependency('../../core/keyboard_nav/basic_cursor.js', ['Blockly.BasicCursor'], ['Blockly.ASTNode', 'Blockly.Cursor'], {'lang': 'es5'}); +goog.addDependency('../../core/keyboard_nav/cursor.js', ['Blockly.Cursor'], ['Blockly.ASTNode', 'Blockly.Marker', 'Blockly.navigation', 'Blockly.utils.object'], {'lang': 'es5'}); +goog.addDependency('../../core/keyboard_nav/flyout_cursor.js', ['Blockly.FlyoutCursor'], ['Blockly.Cursor', 'Blockly.navigation', 'Blockly.utils.object'], {'lang': 'es5'}); +goog.addDependency('../../core/keyboard_nav/marker.js', ['Blockly.Marker'], ['Blockly.ASTNode', 'Blockly.navigation'], {}); +goog.addDependency('../../core/keyboard_nav/navigation.js', ['Blockly.navigation'], ['Blockly.ASTNode', 'Blockly.constants', 'Blockly.utils.Coordinate'], {}); +goog.addDependency('../../core/keyboard_nav/tab_navigate_cursor.js', ['Blockly.TabNavigateCursor'], ['Blockly.ASTNode', 'Blockly.BasicCursor', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/marker_manager.js', ['Blockly.MarkerManager'], ['Blockly.Cursor', 'Blockly.Marker'], {}); +goog.addDependency('../../core/menu.js', ['Blockly.Menu'], ['Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.style'], {}); +goog.addDependency('../../core/menuitem.js', ['Blockly.MenuItem'], ['Blockly.utils.IdGenerator', 'Blockly.utils.aria', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/msg.js', ['Blockly.Msg'], ['Blockly.utils.global'], {}); +goog.addDependency('../../core/mutator.js', ['Blockly.Mutator'], ['Blockly.Bubble', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Events.BubbleOpen', 'Blockly.Icon', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.navigation', 'Blockly.utils', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.global', 'Blockly.utils.object', 'Blockly.utils.toolbox', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/names.js', ['Blockly.Names'], ['Blockly.Msg', 'Blockly.constants'], {}); +goog.addDependency('../../core/options.js', ['Blockly.Options'], ['Blockly.Theme', 'Blockly.Themes.Classic', 'Blockly.Xml', 'Blockly.registry', 'Blockly.utils.IdGenerator', 'Blockly.utils.Metrics', 'Blockly.utils.toolbox', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/procedures.js', ['Blockly.Procedures'], ['Blockly.Blocks', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.Msg', 'Blockly.Names', 'Blockly.Workspace', 'Blockly.Xml', 'Blockly.constants', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/registry.js', ['Blockly.registry'], [], {}); +goog.addDependency('../../core/rendered_connection.js', ['Blockly.RenderedConnection'], ['Blockly.Connection', 'Blockly.Events', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.deprecation', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/common/block_rendering.js', ['Blockly.blockRendering'], ['Blockly.registry', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/common/constants.js', ['Blockly.blockRendering.ConstantProvider'], ['Blockly.constants', 'Blockly.utils', 'Blockly.utils.Svg', 'Blockly.utils.colour', 'Blockly.utils.dom', 'Blockly.utils.svgPaths', 'Blockly.utils.userAgent'], {'lang': 'es5'}); +goog.addDependency('../../core/renderers/common/debugger.js', ['Blockly.blockRendering.Debug'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.constants', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es5'}); +goog.addDependency('../../core/renderers/common/drawer.js', ['Blockly.blockRendering.Drawer'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.utils.svgPaths'], {}); +goog.addDependency('../../core/renderers/common/i_path_object.js', ['Blockly.blockRendering.IPathObject'], [], {}); +goog.addDependency('../../core/renderers/common/info.js', ['Blockly.blockRendering.RenderInfo'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.Hat', 'Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.InlineInput', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.RoundCorner', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.SquareCorner', 'Blockly.blockRendering.StatementInput', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.constants'], {}); +goog.addDependency('../../core/renderers/common/marker_svg.js', ['Blockly.blockRendering.MarkerSvg'], ['Blockly.ASTNode', 'Blockly.Events.MarkerMove', 'Blockly.constants', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/renderers/common/path_object.js', ['Blockly.blockRendering.PathObject'], ['Blockly.Theme', 'Blockly.blockRendering.ConstantProvider', 'Blockly.blockRendering.IPathObject', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/renderers/common/renderer.js', ['Blockly.blockRendering.Renderer'], ['Blockly.InsertionMarkerManager', 'Blockly.blockRendering.ConstantProvider', 'Blockly.blockRendering.Drawer', 'Blockly.blockRendering.IPathObject', 'Blockly.blockRendering.MarkerSvg', 'Blockly.blockRendering.PathObject', 'Blockly.blockRendering.RenderInfo', 'Blockly.constants'], {}); +goog.addDependency('../../core/renderers/geras/constants.js', ['Blockly.geras.ConstantProvider'], ['Blockly.blockRendering.ConstantProvider', 'Blockly.utils.object'], {'lang': 'es5'}); +goog.addDependency('../../core/renderers/geras/drawer.js', ['Blockly.geras.Drawer'], ['Blockly.blockRendering.ConstantProvider', 'Blockly.blockRendering.Drawer', 'Blockly.geras.Highlighter', 'Blockly.geras.RenderInfo', 'Blockly.utils.object', 'Blockly.utils.svgPaths'], {}); +goog.addDependency('../../core/renderers/geras/highlight_constants.js', ['Blockly.geras.HighlightConstantProvider'], ['Blockly.blockRendering.ConstantProvider', 'Blockly.utils.svgPaths'], {'lang': 'es5'}); +goog.addDependency('../../core/renderers/geras/highlighter.js', ['Blockly.geras.Highlighter'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.utils.svgPaths'], {}); +goog.addDependency('../../core/renderers/geras/info.js', ['Blockly.geras', 'Blockly.geras.RenderInfo'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Types', 'Blockly.constants', 'Blockly.geras.InlineInput', 'Blockly.geras.StatementInput', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/geras/measurables/inputs.js', ['Blockly.geras.InlineInput', 'Blockly.geras.StatementInput'], ['Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/geras/path_object.js', ['Blockly.geras.PathObject'], ['Blockly.Theme', 'Blockly.blockRendering.PathObject', 'Blockly.geras.ConstantProvider', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/geras/renderer.js', ['Blockly.geras.Renderer'], ['Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.geras.ConstantProvider', 'Blockly.geras.Drawer', 'Blockly.geras.HighlightConstantProvider', 'Blockly.geras.PathObject', 'Blockly.geras.RenderInfo', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/measurables/base.js', ['Blockly.blockRendering.Measurable'], ['Blockly.blockRendering.Types'], {}); +goog.addDependency('../../core/renderers/measurables/connections.js', ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PreviousConnection'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/measurables/inputs.js', ['Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.InlineInput', 'Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.StatementInput'], ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/measurables/row_elements.js', ['Blockly.blockRendering.Field', 'Blockly.blockRendering.Hat', 'Blockly.blockRendering.Icon', 'Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.JaggedEdge', 'Blockly.blockRendering.RoundCorner', 'Blockly.blockRendering.SquareCorner'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/measurables/rows.js', ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.TopRow'], ['Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.Types', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/measurables/types.js', ['Blockly.blockRendering.Types'], [], {}); +goog.addDependency('../../core/renderers/minimalist/constants.js', ['Blockly.minimalist.ConstantProvider'], ['Blockly.blockRendering.ConstantProvider', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/minimalist/drawer.js', ['Blockly.minimalist.Drawer'], ['Blockly.blockRendering.Drawer', 'Blockly.minimalist.RenderInfo', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/minimalist/info.js', ['Blockly.minimalist', 'Blockly.minimalist.RenderInfo'], ['Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/minimalist/renderer.js', ['Blockly.minimalist.Renderer'], ['Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.minimalist.ConstantProvider', 'Blockly.minimalist.Drawer', 'Blockly.minimalist.RenderInfo', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/thrasos/info.js', ['Blockly.thrasos', 'Blockly.thrasos.RenderInfo'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.InlineInput', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.StatementInput', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/thrasos/renderer.js', ['Blockly.thrasos.Renderer'], ['Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.thrasos.RenderInfo', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/zelos/constants.js', ['Blockly.zelos.ConstantProvider'], ['Blockly.blockRendering.ConstantProvider', 'Blockly.constants', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.svgPaths'], {'lang': 'es5'}); +goog.addDependency('../../core/renderers/zelos/drawer.js', ['Blockly.zelos.Drawer'], ['Blockly.blockRendering.ConstantProvider', 'Blockly.blockRendering.Drawer', 'Blockly.blockRendering.Types', 'Blockly.utils.object', 'Blockly.zelos.RenderInfo'], {}); +goog.addDependency('../../core/renderers/zelos/info.js', ['Blockly.zelos', 'Blockly.zelos.RenderInfo'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.InlineInput', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.RoundCorner', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.SquareCorner', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.constants', 'Blockly.utils.object', 'Blockly.zelos.BottomRow', 'Blockly.zelos.RightConnectionShape', 'Blockly.zelos.StatementInput', 'Blockly.zelos.TopRow'], {}); +goog.addDependency('../../core/renderers/zelos/marker_svg.js', ['Blockly.zelos.MarkerSvg'], ['Blockly.blockRendering.MarkerSvg', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/renderers/zelos/measurables/inputs.js', ['Blockly.zelos.StatementInput'], ['Blockly.blockRendering.StatementInput', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/zelos/measurables/row_elements.js', ['Blockly.zelos.RightConnectionShape'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/zelos/measurables/rows.js', ['Blockly.zelos.BottomRow', 'Blockly.zelos.TopRow'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.TopRow', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/renderers/zelos/path_object.js', ['Blockly.zelos.PathObject'], ['Blockly.blockRendering.PathObject', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.zelos.ConstantProvider'], {}); +goog.addDependency('../../core/renderers/zelos/renderer.js', ['Blockly.zelos.Renderer'], ['Blockly.InsertionMarkerManager', 'Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.constants', 'Blockly.utils.object', 'Blockly.zelos.ConstantProvider', 'Blockly.zelos.Drawer', 'Blockly.zelos.MarkerSvg', 'Blockly.zelos.PathObject', 'Blockly.zelos.RenderInfo'], {}); +goog.addDependency('../../core/requires.js', ['Blockly.requires'], ['Blockly', 'Blockly.Comment', 'Blockly.FieldAngle', 'Blockly.FieldCheckbox', 'Blockly.FieldColour', 'Blockly.FieldDropdown', 'Blockly.FieldImage', 'Blockly.FieldLabelSerializable', 'Blockly.FieldMultilineInput', 'Blockly.FieldNumber', 'Blockly.FieldTextInput', 'Blockly.FieldVariable', 'Blockly.FlyoutButton', 'Blockly.Generator', 'Blockly.HorizontalFlyout', 'Blockly.Mutator', 'Blockly.Themes.Classic', 'Blockly.Themes.Dark', 'Blockly.Themes.Deuteranopia', 'Blockly.Themes.HighContrast', 'Blockly.Themes.Tritanopia', 'Blockly.Toolbox', 'Blockly.Trashcan', 'Blockly.VariablesDynamic', 'Blockly.VerticalFlyout', 'Blockly.Warning', 'Blockly.ZoomControls', 'Blockly.geras.Renderer', 'Blockly.thrasos.Renderer', 'Blockly.zelos.Renderer'], {}); +goog.addDependency('../../core/scrollbar.js', ['Blockly.Scrollbar', 'Blockly.ScrollbarPair'], ['Blockly.Touch', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Metrics', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/shortcut_items.js', ['Blockly.ShortcutItems'], ['Blockly.utils.KeyCodes'], {}); +goog.addDependency('../../core/shortcut_registry.js', ['Blockly.ShortcutRegistry'], ['Blockly.ShortcutItems', 'Blockly.navigation', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/theme.js', ['Blockly.Theme'], ['Blockly.registry', 'Blockly.utils', 'Blockly.utils.colour', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/theme/classic.js', ['Blockly.Themes.Classic'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme/dark.js', ['Blockly.Themes.Dark'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme/deuteranopia.js', ['Blockly.Themes.Deuteranopia'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme/highcontrast.js', ['Blockly.Themes.HighContrast'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme/modern.js', ['Blockly.Themes.Modern'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme/tritanopia.js', ['Blockly.Themes.Tritanopia'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme/zelos.js', ['Blockly.Themes.Zelos'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/theme_manager.js', ['Blockly.ThemeManager'], ['Blockly.Theme'], {}); +goog.addDependency('../../core/toolbox/category.js', ['Blockly.ToolboxCategory'], ['Blockly.ToolboxItem', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.toolbox'], {'lang': 'es5'}); +goog.addDependency('../../core/toolbox/collapsible_category.js', ['Blockly.CollapsibleToolboxCategory'], ['Blockly.ToolboxCategory', 'Blockly.ToolboxItem', 'Blockly.ToolboxSeparator', 'Blockly.registry', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.toolbox'], {}); +goog.addDependency('../../core/toolbox/separator.js', ['Blockly.ToolboxSeparator'], ['Blockly.ToolboxItem', 'Blockly.registry', 'Blockly.utils.dom'], {'lang': 'es5'}); +goog.addDependency('../../core/toolbox/toolbox.js', ['Blockly.Toolbox'], ['Blockly.CollapsibleToolboxCategory', 'Blockly.Css', 'Blockly.Events', 'Blockly.Events.ToolboxItemSelect', 'Blockly.Touch', 'Blockly.constants', 'Blockly.navigation', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Rect', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.toolbox'], {'lang': 'es5'}); +goog.addDependency('../../core/toolbox/toolbox_item.js', ['Blockly.ToolboxItem'], [], {}); +goog.addDependency('../../core/tooltip.js', ['Blockly.Tooltip'], ['Blockly.utils.string'], {}); +goog.addDependency('../../core/touch.js', ['Blockly.Touch'], ['Blockly.constants', 'Blockly.utils', 'Blockly.utils.global', 'Blockly.utils.string'], {}); +goog.addDependency('../../core/touch_gesture.js', ['Blockly.TouchGesture'], ['Blockly.Gesture', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/trashcan.js', ['Blockly.Trashcan'], ['Blockly.Events.TrashcanOpen', 'Blockly.Scrollbar', 'Blockly.Xml', 'Blockly.constants', 'Blockly.utils.Rect', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.toolbox'], {}); +goog.addDependency('../../core/utils.js', ['Blockly.utils'], ['Blockly.Msg', 'Blockly.constants', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.colour', 'Blockly.utils.global', 'Blockly.utils.string', 'Blockly.utils.style', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/utils/aria.js', ['Blockly.utils.aria'], [], {}); +goog.addDependency('../../core/utils/colour.js', ['Blockly.utils.colour'], [], {}); +goog.addDependency('../../core/utils/coordinate.js', ['Blockly.utils.Coordinate'], [], {}); +goog.addDependency('../../core/utils/deprecation.js', ['Blockly.utils.deprecation'], [], {}); +goog.addDependency('../../core/utils/dom.js', ['Blockly.utils.dom'], ['Blockly.utils.Svg', 'Blockly.utils.userAgent'], {}); +goog.addDependency('../../core/utils/global.js', ['Blockly.utils.global'], [], {}); +goog.addDependency('../../core/utils/idgenerator.js', ['Blockly.utils.IdGenerator'], [], {}); +goog.addDependency('../../core/utils/keycodes.js', ['Blockly.utils.KeyCodes'], [], {}); +goog.addDependency('../../core/utils/math.js', ['Blockly.utils.math'], [], {}); +goog.addDependency('../../core/utils/metrics.js', ['Blockly.utils.Metrics'], [], {}); +goog.addDependency('../../core/utils/object.js', ['Blockly.utils.object'], [], {}); +goog.addDependency('../../core/utils/rect.js', ['Blockly.utils.Rect'], [], {}); +goog.addDependency('../../core/utils/size.js', ['Blockly.utils.Size'], [], {}); +goog.addDependency('../../core/utils/string.js', ['Blockly.utils.string'], [], {}); +goog.addDependency('../../core/utils/style.js', ['Blockly.utils.style'], ['Blockly.utils.Coordinate', 'Blockly.utils.Size'], {}); +goog.addDependency('../../core/utils/svg.js', ['Blockly.utils.Svg'], [], {}); +goog.addDependency('../../core/utils/svg_paths.js', ['Blockly.utils.svgPaths'], [], {}); +goog.addDependency('../../core/utils/toolbox.js', ['Blockly.utils.toolbox'], ['Blockly.constants'], {}); +goog.addDependency('../../core/utils/useragent.js', ['Blockly.utils.userAgent'], ['Blockly.utils.global'], {}); +goog.addDependency('../../core/utils/xml.js', ['Blockly.utils.xml'], [], {}); +goog.addDependency('../../core/variable_map.js', ['Blockly.VariableMap'], ['Blockly.Events', 'Blockly.Events.VarDelete', 'Blockly.Events.VarRename', 'Blockly.Msg', 'Blockly.utils', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/variable_model.js', ['Blockly.VariableModel'], ['Blockly.Events', 'Blockly.Events.VarCreate', 'Blockly.utils'], {}); +goog.addDependency('../../core/variables.js', ['Blockly.Variables'], ['Blockly.Blocks', 'Blockly.Msg', 'Blockly.VariableModel', 'Blockly.Xml', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/variables_dynamic.js', ['Blockly.VariablesDynamic'], ['Blockly.Blocks', 'Blockly.Msg', 'Blockly.VariableModel', 'Blockly.Variables', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/warning.js', ['Blockly.Warning'], ['Blockly.Bubble', 'Blockly.Events', 'Blockly.Events.BubbleOpen', 'Blockly.Icon', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/widgetdiv.js', ['Blockly.WidgetDiv'], ['Blockly.utils.style'], {}); +goog.addDependency('../../core/workspace.js', ['Blockly.Workspace'], ['Blockly.ConnectionChecker', 'Blockly.Events', 'Blockly.Options', 'Blockly.VariableMap', 'Blockly.utils', 'Blockly.utils.math'], {}); +goog.addDependency('../../core/workspace_audio.js', ['Blockly.WorkspaceAudio'], ['Blockly.constants', 'Blockly.utils', 'Blockly.utils.global', 'Blockly.utils.userAgent'], {'lang': 'es5'}); +goog.addDependency('../../core/workspace_comment.js', ['Blockly.WorkspaceComment'], ['Blockly.Events', 'Blockly.Events.CommentChange', 'Blockly.Events.CommentCreate', 'Blockly.Events.CommentDelete', 'Blockly.Events.CommentMove', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/workspace_comment_render_svg.js', ['Blockly.WorkspaceCommentSvg.render'], ['Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/workspace_comment_svg.js', ['Blockly.WorkspaceCommentSvg'], ['Blockly.Css', 'Blockly.Events', 'Blockly.Events.CommentCreate', 'Blockly.Events.CommentDelete', 'Blockly.Events.CommentMove', 'Blockly.Events.Selected', 'Blockly.WorkspaceComment', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object'], {}); +goog.addDependency('../../core/workspace_drag_surface_svg.js', ['Blockly.WorkspaceDragSurfaceSvg'], ['Blockly.utils', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {}); +goog.addDependency('../../core/workspace_dragger.js', ['Blockly.WorkspaceDragger'], ['Blockly.utils.Coordinate'], {}); +goog.addDependency('../../core/workspace_svg.js', ['Blockly.WorkspaceSvg'], ['Blockly.BlockSvg', 'Blockly.ConnectionDB', 'Blockly.ContextMenuRegistry', 'Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Events.ThemeChange', 'Blockly.Events.ViewportChange', 'Blockly.Gesture', 'Blockly.Grid', 'Blockly.MarkerManager', 'Blockly.Msg', 'Blockly.Options', 'Blockly.ThemeManager', 'Blockly.Themes.Classic', 'Blockly.TouchGesture', 'Blockly.Workspace', 'Blockly.WorkspaceAudio', 'Blockly.WorkspaceDragSurfaceSvg', 'Blockly.Xml', 'Blockly.blockRendering', 'Blockly.constants', 'Blockly.navigation', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Metrics', 'Blockly.utils.Rect', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.toolbox'], {}); +goog.addDependency('../../core/xml.js', ['Blockly.Xml'], ['Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Events.FinishedLoading', 'Blockly.Events.VarCreate', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.dom', 'Blockly.utils.global', 'Blockly.utils.xml'], {}); +goog.addDependency('../../core/zoom_controls.js', ['Blockly.ZoomControls'], ['Blockly.Css', 'Blockly.Scrollbar', 'Blockly.Touch', 'Blockly.constants', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es5'}); +goog.addDependency("base.js", [], []); + +// Load Blockly. +goog.require('Blockly.requires') + +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(''); +} diff --git a/static/js/blockly_compressed.js b/static/js/blockly_compressed.js new file mode 100644 index 0000000..76ffff9 --- /dev/null +++ b/static/js/blockly_compressed.js @@ -0,0 +1,1484 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define([], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(); + } else { // Browser + root.Blockly = factory(); + } +}(this, function() { + '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.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.registry={};Blockly.registry.typeMap_={};Blockly.registry.DEFAULT="default";Blockly.registry.Type=function(a){this.name_=a};Blockly.registry.Type.prototype.toString=function(){return this.name_};Blockly.registry.Type.CONNECTION_CHECKER=new Blockly.registry.Type("connectionChecker");Blockly.registry.Type.EVENT=new Blockly.registry.Type("event");Blockly.registry.Type.FIELD=new Blockly.registry.Type("field");Blockly.registry.Type.RENDERER=new Blockly.registry.Type("renderer"); +Blockly.registry.Type.TOOLBOX=new Blockly.registry.Type("toolbox");Blockly.registry.Type.THEME=new Blockly.registry.Type("theme");Blockly.registry.Type.TOOLBOX_ITEM=new Blockly.registry.Type("toolboxItem");Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX=new Blockly.registry.Type("flyoutsVerticalToolbox");Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX=new Blockly.registry.Type("flyoutsHorizontalToolbox"); +Blockly.registry.register=function(a,b,c,d){if(!(a instanceof Blockly.registry.Type)&&"string"!=typeof a||""==String(a).trim())throw Error('Invalid type "'+a+'". The type must be a non-empty string or a Blockly.registry.Type.');a=String(a).toLowerCase();if("string"!=typeof b||""==b.trim())throw Error('Invalid name "'+b+'". The name must be a non-empty string.');b=b.toLowerCase();if(!c)throw Error("Can not register a null value");var e=Blockly.registry.typeMap_[a];e||(e=Blockly.registry.typeMap_[a]= +{});Blockly.registry.validate_(a,c);if(!d&&e[b])throw Error('Name "'+b+'" with type "'+a+'" already registered.');e[b]=c};Blockly.registry.validate_=function(a,b){switch(a){case String(Blockly.registry.Type.FIELD):if("function"!=typeof b.fromJson)throw Error('Type "'+a+'" must have a fromJson function');}}; +Blockly.registry.unregister=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=Blockly.registry.typeMap_[a];c?c[b]?delete Blockly.registry.typeMap_[a][b]:console.warn('No name "'+b+'" with type "'+a+'" found'):console.warn('No type "'+a+'" found')}; +Blockly.registry.getItem_=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=Blockly.registry.typeMap_[a];return c?c[b]?c[b]:(console.warn('No name "'+b+'" with type "'+a+'" found'),null):(console.warn('No type "'+a+'" found'),null)};Blockly.registry.hasItem=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();return(a=Blockly.registry.typeMap_[a])?!!a[b]:!1};Blockly.registry.getClass=function(a,b){return Blockly.registry.getItem_(a,b)}; +Blockly.registry.getObject=function(a,b){return Blockly.registry.getItem_(a,b)};Blockly.registry.getClassFromOptions=function(a,b){b=b.plugins[a.toString()]||Blockly.registry.DEFAULT;return"function"==typeof b?b:Blockly.registry.getClass(a,b)};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.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.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(b,c){return b.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 new Blockly.utils.Rect(a.y,document.documentElement.clientHeight+a.y,a.x,document.documentElement.clientWidth+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.BLOCK_DRAG="drag";Blockly.Events.SELECTED="selected";Blockly.Events.CLICK="click";Blockly.Events.MARKER_MOVE="marker_move";Blockly.Events.BUBBLE_OPEN="bubble_open";Blockly.Events.TRASHCAN_OPEN="trashcan_open";Blockly.Events.TOOLBOX_ITEM_SELECT="toolbox_item_select";Blockly.Events.THEME_CHANGE="theme_change";Blockly.Events.VIEWPORT_CHANGE="viewport_change";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.isUiEvent?Blockly.Events.UI: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.CLICK||k.type!=Blockly.Events.BUBBLE_OPEN)d[g]={event:f,index:e},c.push(f)}a=c.filter(function(l){return!l.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){var c=Blockly.registry.getClass(Blockly.registry.Type.EVENT,a.type);if(!c)throw Error("Unknown event type.");c=new c;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),c=b.getBlockById(a.blockId);if(c){a=Blockly.Events.recordUndo;try{Blockly.Events.recordUndo=!1;var d=c.getParent();if(d&&d.isEnabled()){var e=c.getDescendants(!1);b=0;for(var f;f=e[b];b++)f.setEnabled(!0)}else if((c.outputConnection||c.previousConnection)&&!b.isDragging()){do c.setEnabled(!1),c=c.getNextBlock();while(c)}}finally{Blockly.Events.recordUndo= +a}}}};Blockly.Events.Abstract=function(){this.isBlank=null;this.workspaceId=void 0;this.group=Blockly.Events.getGroup();this.recordUndo=Blockly.Events.recordUndo};Blockly.Events.Abstract.prototype.isUiEvent=!1;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.isBlank=!1;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.deepMerge=function(a,b){for(var c in b)a[c]=null!=b[c]&&"object"===typeof b[c]?Blockly.utils.object.deepMerge(a[c]||Object.create(null),b[c]):b[c];return a};Blockly.utils.object.values=function(a){return Object.values?Object.values(a):Object.keys(a).map(function(b){return a[b]})};Blockly.Events.UiBase=function(a){Blockly.Events.UiBase.superClass_.constructor.call(this);this.isBlank="undefined"==typeof a;this.workspaceId=a?a:"";this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.UiBase,Blockly.Events.Abstract);Blockly.Events.UiBase.prototype.isUiEvent=!0; +Blockly.Events.Ui=function(a,b,c,d){Blockly.Events.Ui.superClass_.constructor.call(this,a?a.workspace.id:void 0);this.blockId=a?a.id:null;this.element="undefined"==typeof b?"":b;this.oldValue="undefined"==typeof c?"":c;this.newValue="undefined"==typeof d?"":d};Blockly.utils.object.inherits(Blockly.Events.Ui,Blockly.Events.UiBase);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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.UI,Blockly.Events.Ui);Blockly.utils.Svg=function(a){this.tagName_=a};Blockly.utils.Svg.prototype.toString=function(){return this.tagName_};Blockly.utils.Svg.ANIMATE=new Blockly.utils.Svg("animate");Blockly.utils.Svg.CIRCLE=new Blockly.utils.Svg("circle");Blockly.utils.Svg.CLIPPATH=new Blockly.utils.Svg("clipPath");Blockly.utils.Svg.DEFS=new Blockly.utils.Svg("defs");Blockly.utils.Svg.FECOMPOSITE=new Blockly.utils.Svg("feComposite");Blockly.utils.Svg.FECOMPONENTTRANSFER=new Blockly.utils.Svg("feComponentTransfer"); +Blockly.utils.Svg.FEFLOOD=new Blockly.utils.Svg("feFlood");Blockly.utils.Svg.FEFUNCA=new Blockly.utils.Svg("feFuncA");Blockly.utils.Svg.FEGAUSSIANBLUR=new Blockly.utils.Svg("feGaussianBlur");Blockly.utils.Svg.FEPOINTLIGHT=new Blockly.utils.Svg("fePointLight");Blockly.utils.Svg.FESPECULARLIGHTING=new Blockly.utils.Svg("feSpecularLighting");Blockly.utils.Svg.FILTER=new Blockly.utils.Svg("filter");Blockly.utils.Svg.FOREIGNOBJECT=new Blockly.utils.Svg("foreignObject");Blockly.utils.Svg.G=new Blockly.utils.Svg("g"); +Blockly.utils.Svg.IMAGE=new Blockly.utils.Svg("image");Blockly.utils.Svg.LINE=new Blockly.utils.Svg("line");Blockly.utils.Svg.PATH=new Blockly.utils.Svg("path");Blockly.utils.Svg.PATTERN=new Blockly.utils.Svg("pattern");Blockly.utils.Svg.POLYGON=new Blockly.utils.Svg("polygon");Blockly.utils.Svg.RECT=new Blockly.utils.Svg("rect");Blockly.utils.Svg.SVG=new Blockly.utils.Svg("svg");Blockly.utils.Svg.TEXT=new Blockly.utils.Svg("text");Blockly.utils.Svg.TSPAN=new Blockly.utils.Svg("tspan");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.NodeType={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,String(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.removeClasses=function(a,b){b=b.split(" ");for(var c=0;c>>/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.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: 9pt sans-serif;","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: 0 0 3px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv.blocklyFocused {","box-shadow: 0 0 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownContent {", +"max-height: 300px;","overflow: auto;","overflow-x: hidden;","position: relative;","}",".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;","}",".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;","}",".blocklyVerticalMarker {","stroke-width: 3px;","fill: rgba(255,255,255,.5);","pointer-events: none;","}",".blocklyComputeCanvas {","position: absolute;","width: 0;","height: 0;","}",".blocklyNoPointerEvents {","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","max-height: 100%;","}",".blocklyDropdownMenu {","border-radius: 2px;","padding: 0 !important;","}", +".blocklyDropdownMenu .blocklyMenuItem {","padding-left: 28px;","}",".blocklyDropdownMenu .blocklyMenuItemRtl {","padding-left: 5px;","padding-right: 28px;","}",".blocklyWidgetDiv .blocklyMenu {","background: #fff;","border: 1px solid transparent;","box-shadow: 0 0 3px 1px rgba(0,0,0,.3);","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;","}",".blocklyWidgetDiv .blocklyMenu.blocklyFocused {", +"box-shadow: 0 0 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv .blocklyMenu {","background: inherit;","border: inherit;",'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;',"outline: none;","position: relative;","z-index: 20000;","}",".blocklyMenuItem {","border: none;","color: #000;","cursor: pointer;","list-style: none;","margin: 0;","min-width: 7em;","padding: 6px 15px;","white-space: nowrap;","}",".blocklyMenuItemDisabled {","color: #ccc;","cursor: inherit;","}",".blocklyMenuItemHighlight {", +"background-color: rgba(0,0,0,.1);","}",".blocklyMenuItemCheckbox {","height: 16px;","position: absolute;","width: 16px;","}",".blocklyMenuItemSelected .blocklyMenuItemCheckbox {","background: url(<<>>/sprites.png) no-repeat -48px -16px;","float: left;","margin-left: -24px;","position: static;","}",".blocklyMenuItemRtl .blocklyMenuItemCheckbox {","float: right;","margin-right: -24px;","}"];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,arrowAtTop:null,arrowX:null,arrowY:null,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_="");Blockly.DropDownDiv.themeClassName_&&(Blockly.utils.dom.removeClass(a,Blockly.DropDownDiv.themeClassName_),Blockly.DropDownDiv.themeClassName_="");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=a.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(Blockly.utils.Svg.PATTERN,{id:"blocklyGridPattern"+a,patternUnits:"userSpaceOnUse"},c);0 document.");}else a=null;return a};Blockly.utils.xml={};Blockly.utils.xml.NAME_SPACE="https://developers.google.com/blockly/xml";Blockly.utils.xml.document=function(){return document};Blockly.utils.xml.createElement=function(a){return Blockly.utils.xml.document().createElementNS(Blockly.utils.xml.NAME_SPACE,a)};Blockly.utils.xml.createTextNode=function(a){return Blockly.utils.xml.document().createTextNode(a)};Blockly.utils.xml.textToDomDocument=function(a){return(new DOMParser).parseFromString(a,"text/xml")}; +Blockly.utils.xml.domToText=function(a){return(new XMLSerializer).serializeToString(a)};Blockly.Events.BlockBase=function(a){Blockly.Events.BlockBase.superClass_.constructor.call(this);this.blockId=(this.isBlank="undefined"==typeof a)?"":a.id;this.workspaceId=this.isBlank?"":a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.BlockBase,Blockly.Events.Abstract);Blockly.Events.BlockBase.prototype.toJson=function(){var a=Blockly.Events.BlockBase.superClass_.toJson.call(this);a.blockId=this.blockId;return a}; +Blockly.Events.BlockBase.prototype.fromJson=function(a){Blockly.Events.BlockBase.superClass_.fromJson.call(this,a);this.blockId=a.blockId};Blockly.Events.Change=function(a,b,c,d,e){Blockly.Events.Change.superClass_.constructor.call(this,a);a&&(this.element="undefined"==typeof b?"":b,this.name="undefined"==typeof c?"":c,this.oldValue="undefined"==typeof d?"":d,this.newValue="undefined"==typeof e?"":e)};Blockly.utils.object.inherits(Blockly.Events.Change,Blockly.Events.BlockBase); +Blockly.Events.BlockChange=Blockly.Events.Change;Blockly.Events.Change.prototype.type=Blockly.Events.CHANGE;Blockly.Events.Change.prototype.toJson=function(){var a=Blockly.Events.Change.superClass_.toJson.call(this);a.element=this.element;this.name&&(a.name=this.name);a.oldValue=this.oldValue;a.newValue=this.newValue;return a}; +Blockly.Events.Change.prototype.fromJson=function(a){Blockly.Events.Change.superClass_.fromJson.call(this,a);this.element=a.element;this.name=a.name;this.oldValue=a.oldValue;this.newValue=a.newValue};Blockly.Events.Change.prototype.isNull=function(){return this.oldValue==this.newValue}; +Blockly.Events.Change.prototype.run=function(a){var b=this.getEventWorkspace_().getBlockById(this.blockId);if(b)switch(b.mutator&&b.mutator.setVisible(!1),a=a?this.newValue:this.oldValue,this.element){case "field":(b=b.getField(this.name))?b.setValue(a):console.warn("Can't set non-existent field: "+this.name);break;case "comment":b.setCommentText(a||null);break;case "collapsed":b.setCollapsed(!!a);break;case "disabled":b.setEnabled(!a);break;case "inline":b.setInputsInline(!!a);break;case "mutation":var c= +"";b.mutationToDom&&(c=(c=b.mutationToDom())&&Blockly.Xml.domToText(c));if(b.domToMutation){var d=Blockly.Xml.textToDom(a||"");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){Blockly.Events.Create.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),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;this.recordUndo||(a.recordUndo=this.recordUndo);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;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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){Blockly.Events.Delete.superClass_.constructor.call(this,a);if(a){if(a.getParent())throw Error("Connected blocks cannot be deleted.");a.isShadow()&&(this.recordUndo=!1);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.oldXml=Blockly.Xml.domToText(this.oldXml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Delete.prototype.fromJson=function(a){Blockly.Events.Delete.superClass_.fromJson.call(this,a);this.oldXml=Blockly.Xml.textToDom(a.oldXml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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){Blockly.Events.Move.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),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));this.recordUndo||(a.recordUndo=this.recordUndo);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;if(a.newCoordinate){var b=a.newCoordinate.split(",");this.newCoordinate=new Blockly.utils.Coordinate(Number(b[0]),Number(b[1]))}void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CREATE,Blockly.Events.Create);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.DELETE,Blockly.Events.Delete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CHANGE,Blockly.Events.Change); +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MOVE,Blockly.Events.Move);Blockly.Events.FinishedLoading=function(a){this.isBlank="undefined"==typeof a;this.workspaceId=a?a.id:"";this.group=Blockly.Events.getGroup();this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.FinishedLoading,Blockly.Events.Abstract);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.isBlank=!1;this.workspaceId=a.workspaceId;this.group=a.group};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.FINISHED_LOADING,Blockly.Events.FinishedLoading);Blockly.Events.VarBase=function(a){Blockly.Events.VarBase.superClass_.constructor.call(this);this.varId=(this.isBlank="undefined"==typeof a)?"":a.getId();this.workspaceId=this.isBlank?"":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){Blockly.Events.VarCreate.superClass_.constructor.call(this,a);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){Blockly.Events.VarDelete.superClass_.constructor.call(this,a);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){Blockly.Events.VarRename.superClass_.constructor.call(this,a);a&&(this.oldName=a.name,this.newName="undefined"==typeof b?"":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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_CREATE,Blockly.Events.VarCreate);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_DELETE,Blockly.Events.VarDelete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_RENAME,Blockly.Events.VarRename);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){if(a.isInsertionMarker()&&(a=a.getChildren(!1)[0],!a))return new DocumentFragment;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){if(a.isInsertionMarker())return(a=a.getChildren(!1)[0])?Blockly.Xml.blockToDom(a):new DocumentFragment;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(d=0;e=a.inputList[d];d++){var h;f=!0;if(e.type!=Blockly.DUMMY_INPUT){var k=e.connection.targetBlock();e.type==Blockly.INPUT_VALUE?h=Blockly.utils.xml.createElement("value"):e.type==Blockly.NEXT_STATEMENT&&(h=Blockly.utils.xml.createElement("statement")); +g=e.connection.getShadowDom();!g||k&&k.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,b));k&&(g=Blockly.Xml.blockToDom(k,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h.appendChild(g),f=!1));h.setAttribute("name",e.name);f||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(d=a.getNextBlock())g=Blockly.Xml.blockToDom(d,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h=Blockly.utils.xml.createElement("next"),h.appendChild(g),c.appendChild(h));g=a.nextConnection&&a.nextConnection.getShadowDom();!g||d&&d.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,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.NodeType.TEXT_NODE&&""==d.data.trim()&&c.firstChild!=d&&Blockly.utils.dom.removeNode(d);c&&(d=c,c=c.nextSibling,d.nodeType==Blockly.utils.dom.NodeType.TEXT_NODE&&""==d.data.trim()&&Blockly.utils.dom.removeNode(d))}return a}; +Blockly.Xml.domToText=function(a){return Blockly.utils.xml.domToText(a).replace(/<(\w+)([^<]*)\/>/g,"<$1$2>")};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;Object.prototype.hasOwnProperty.call(b,"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=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.dispose=function(){Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.hide()};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.textContent="";var a=Blockly.Tooltip.getTooltipOfObject(Blockly.Tooltip.element_);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.container_=null; +Blockly.WorkspaceDragSurfaceSvg.prototype.createDom=function(){this.SVG_||(this.SVG_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.wsCoordinate_=null;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.createTopNode=function(a){var b=a.previousConnection||a.outputConnection;return b?Blockly.ASTNode.createConnectionNode(b):Blockly.ASTNode.createBlockNode(a)};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(Blockly.utils.Svg.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;ec||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case Blockly.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case Blockly.OUTPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(b.isConnected()&& +!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!=Blockly.draggingConnections.indexOf(b)?!1:!0};Blockly.ConnectionChecker.prototype.canConnectToPrevious_=function(a,b){if(a.targetConnection||-1!=Blockly.draggingConnections.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; +Blockly.registry.register(Blockly.registry.Type.CONNECTION_CHECKER,Blockly.registry.DEFAULT,Blockly.ConnectionChecker);Blockly.VariableMap=function(a){this.variableMap_=Object.create(null);this.workspace=a};Blockly.VariableMap.prototype.clear=function(){this.variableMap_=Object.create(null)};Blockly.VariableMap.prototype.renameVariable=function(a,b){var c=this.getVariable(b,a.type),d=this.workspace.getAllBlocks(!1);Blockly.Events.setGroup(!0);try{c&&c.getId()!=a.getId()?this.renameVariableWithConflict_(a,b,c,d):this.renameVariableAndUses_(a,b,d)}finally{Blockly.Events.setGroup(!1)}}; +Blockly.VariableMap.prototype.renameVariableById=function(a,b){var c=this.getVariableById(a);if(!c)throw Error("Tried to rename a variable that didn't exist. ID: "+a);this.renameVariable(c,b)};Blockly.VariableMap.prototype.renameVariableAndUses_=function(a,b,c){Blockly.Events.fire(new Blockly.Events.VarRename(a,b));a.name=b;for(b=0;bthis.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.getUndoStack=function(){return this.undoStack_};Blockly.Workspace.prototype.getRedoStack=function(){return this.redoStack_}; +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(Blockly.utils.Svg.G,{},null);var c={filter:"url(#"+this.workspace_.getRenderer().getConstants().embossFilterId+")"};Blockly.utils.userAgent.JAVA_FX&&(c={});c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,c,this.bubbleGroup_);this.bubbleArrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{},c);this.bubbleBack_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.G,{"class":this.workspace_.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.bubbleGroup_),b=2*Blockly.Bubble.BORDER_WIDTH,Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.POLYGON,{points:"0,x x,x x,0".replace(/x/g,b.toString())},this.resizeGroup_),Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{"class":"blocklyResizeLine",x1:b/3,y1:b-1,x2:b- +1,y2:b/3},this.resizeGroup_),Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.setDeleteStyle=function(a){}; +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.Bubble.textToDom=function(a){var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText blocklyBubbleText blocklyNoPointerEvents",y:Blockly.Bubble.BORDER_WIDTH},null);a=a.split("\n");for(var c=0;c(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.ASTNode.createTopNode(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.fireWorkspaceClick_=function(a){a=new Blockly.Events.Click(null,a.id,"workspace");Blockly.Events.fire(a)}; +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(){if(this.flyout_&&this.flyout_.autoClose)this.targetBlock_.isEnabled()&&(Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump());else{var a=new Blockly.Events.Click(this.startBlock_,this.startWorkspace_.id,"block");Blockly.Events.fire(a)}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();this.fireWorkspaceClick_(this.startWorkspace_||b)};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.value_=this.DEFAULT_VALUE;this.tooltip_=this.validator_=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.DEFAULT_VALUE=null;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};Blockly.Field.prototype.getConstants=function(){!this.constants_&&this.sourceBlock_&&this.sourceBlock_.workspace&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants());return this.constants_};Blockly.Field.prototype.getSourceBlock=function(){return this.sourceBlock_}; +Blockly.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.borderRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().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(){this.textElement_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText"},this.fieldGroup_);this.getConstants().FIELD_TEXT_BASELINE_CENTER&&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);Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_());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.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.updateSize_=function(a){var b=this.getConstants();a=void 0!=a?a:this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;var c=2*a,d=b.FIELD_TEXT_HEIGHT,e=0;this.textElement_&&(e=Blockly.utils.dom.getFastTextWidth(this.textElement_,b.FIELD_TEXT_FONTSIZE,b.FIELD_TEXT_FONTWEIGHT,b.FIELD_TEXT_FONTFAMILY),c+=e);this.borderRect_&&(d=Math.max(d,b.FIELD_BORDER_RECT_HEIGHT));this.size_.height=d;this.size_.width=c;this.positionTextElement_(a,e);this.positionBorderRect_()}; +Blockly.Field.prototype.positionTextElement_=function(a,b){if(this.textElement_){var c=this.getConstants(),d=this.size_.height/2;this.textElement_.setAttribute("x",this.sourceBlock_.RTL?this.size_.width-b-a:a);this.textElement_.setAttribute("y",c.FIELD_TEXT_BASELINE_CENTER?d:d-c.FIELD_TEXT_HEIGHT/2+c.FIELD_TEXT_BASELINE)}}; +Blockly.Field.prototype.positionBorderRect_=function(){this.borderRect_&&(this.borderRect_.setAttribute("width",this.size_.width),this.borderRect_.setAttribute("height",this.size_.height),this.borderRect_.setAttribute("rx",this.getConstants().FIELD_BORDER_RECT_RADIUS),this.borderRect_.setAttribute("ry",this.getConstants().FIELD_BORDER_RECT_RADIUS))}; +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 new Blockly.utils.Rect(c.y,c.y+ +a,c.x,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.markDirty=function(){this.isDirty_=!0;this.constants_=null};Blockly.Field.prototype.forceRerender=function(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours(),this.updateMarkers_())}; +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.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(b&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(b,"field",this.name||null,c,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};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){a||""===a||(a=this.sourceBlock_);var b=this.getClickTarget_();b?b.tooltip=a:this.tooltip_=a};Blockly.Field.prototype.getTooltip=function(){var a=this.getClickTarget_();return a?Blockly.Tooltip.getTooltipOfObject(a):Blockly.Tooltip.getTooltipOfObject({tooltip:this.tooltip_})}; +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.applyColour());b.name=c;b.setVisible(this.isVisible());c=b;c.prefixField&&(a=this.insertFieldAt(a,c.prefixField));this.fieldRow.splice(a,0,b);++a;c.suffixField&&(a=this.insertFieldAt(a,c.suffixField));this.sourceBlock_.rendered&& +(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return a};Blockly.Input.prototype.removeField=function(a,b){for(var c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');};Blockly.Input.prototype.isVisible=function(){return this.visible_}; +Blockly.Input.prototype.setVisible=function(a){var b=[];if(this.visible_==a)return b;this.visible_=a;for(var c=0,d;d=this.fieldRow[c];c++)d.setVisible(a);this.connection&&(this.connection=this.connection,a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),c=this.connection.targetBlock())&&(c.getSvgRoot().style.display=a?"block":"none");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_=this.sourceBlock_,this.sourceBlock_.render());return this};Blockly.Input.prototype.setShadowDom=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setShadowDom(a);return this}; +Blockly.Input.prototype.getShadowDom=function(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()};Blockly.Input.prototype.init=function(){if(this.sourceBlock_.workspace.rendered)for(var a=0;aa&&(e=e.substring(0,a-3)+"...");return e};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?this.menuItems_.length:a,-1)};Blockly.Menu.prototype.highlightFirst_=function(){this.highlightHelper_(-1,1)};Blockly.Menu.prototype.highlightLast_=function(){this.highlightHelper_(this.menuItems_.length,-1)};Blockly.Menu.prototype.highlightHelper_=function(a,b){a+=b;for(var c;c=this.menuItems_[a];){if(c.isEnabled()){this.setHighlighted(c);break}a+=b}}; +Blockly.Menu.prototype.handleMouseOver_=function(a){(a=this.getMenuItem_(a.target))&&(a.isEnabled()?this.highlightedItem_!=a&&this.setHighlighted(a):this.setHighlighted(null))};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}(a=this.getMenuItem_(a.target))&&a.performAction()}; +Blockly.Menu.prototype.handleMouseEnter_=function(a){this.focus()};Blockly.Menu.prototype.handleMouseLeave_=function(a){this.getElement()&&(this.blur_(),this.setHighlighted(null))}; +Blockly.Menu.prototype.handleKeyEvent_=function(a){if(this.menuItems_.length&&!(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)){var b=this.highlightedItem_;switch(a.keyCode){case Blockly.utils.KeyCodes.ENTER:case Blockly.utils.KeyCodes.SPACE:b&&b.performAction();break;case Blockly.utils.KeyCodes.UP:this.highlightPrevious();break;case Blockly.utils.KeyCodes.DOWN:this.highlightNext();break;case Blockly.utils.KeyCodes.PAGE_UP:case Blockly.utils.KeyCodes.HOME:this.highlightFirst_();break;case Blockly.utils.KeyCodes.PAGE_DOWN:case Blockly.utils.KeyCodes.END:this.highlightLast_(); +break;default:return}a.preventDefault();a.stopPropagation()}};Blockly.Menu.prototype.getSize=function(){var a=this.getElement(),b=Blockly.utils.style.getSize(a);b.height=a.scrollHeight;return b};Blockly.MenuItem=function(a,b){this.content_=a;this.value_=b;this.enabled_=!0;this.element_=null;this.rightToLeft_=!1;this.roleName_=null;this.highlight_=this.checked_=this.checkable_=!1;this.actionHandler_=null}; +Blockly.MenuItem.prototype.createDom=function(){var a=document.createElement("div");a.id=Blockly.utils.IdGenerator.getNextUniqueId();this.element_=a;a.className="blocklyMenuItem goog-menuitem "+(this.enabled_?"":"blocklyMenuItemDisabled goog-menuitem-disabled ")+(this.checked_?"blocklyMenuItemSelected goog-option-selected ":"")+(this.highlight_?"blocklyMenuItemHighlight goog-menuitem-highlight ":"")+(this.rightToLeft_?"blocklyMenuItemRtl goog-menuitem-rtl ":"");var b=document.createElement("div"); +b.className="blocklyMenuItemContent goog-menuitem-content";if(this.checkable_){var c=document.createElement("div");c.className="blocklyMenuItemCheckbox goog-menuitem-checkbox";b.appendChild(c)}c=this.content_;"string"==typeof this.content_&&(c=document.createTextNode(this.content_));b.appendChild(c);a.appendChild(b);this.roleName_&&Blockly.utils.aria.setRole(a,this.roleName_);Blockly.utils.aria.setState(a,Blockly.utils.aria.State.SELECTED,this.checkable_&&this.checked_||!1);Blockly.utils.aria.setState(a, +Blockly.utils.aria.State.DISABLED,!this.enabled_);return a};Blockly.MenuItem.prototype.dispose=function(){this.element_=null};Blockly.MenuItem.prototype.getElement=function(){return this.element_};Blockly.MenuItem.prototype.getId=function(){return this.element_.id};Blockly.MenuItem.prototype.getValue=function(){return this.value_};Blockly.MenuItem.prototype.setRightToLeft=function(a){this.rightToLeft_=a};Blockly.MenuItem.prototype.setRole=function(a){this.roleName_=a}; +Blockly.MenuItem.prototype.setCheckable=function(a){this.checkable_=a};Blockly.MenuItem.prototype.setChecked=function(a){this.checked_=a};Blockly.MenuItem.prototype.setHighlighted=function(a){this.highlight_=a;var b=this.getElement();b&&this.isEnabled()&&(a?(Blockly.utils.dom.addClass(b,"blocklyMenuItemHighlight"),Blockly.utils.dom.addClass(b,"goog-menuitem-highlight")):(Blockly.utils.dom.removeClass(b,"blocklyMenuItemHighlight"),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};Blockly.MenuItem.prototype.performAction=function(){this.isEnabled()&&this.actionHandler_&&this.actionHandler_(this)};Blockly.MenuItem.prototype.onAction=function(a,b){this.actionHandler_=a.bind(b)};Blockly.ContextMenu={};Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.menu_=null;Blockly.ContextMenu.show=function(a,b,c){Blockly.WidgetDiv.show(Blockly.ContextMenu,c,Blockly.ContextMenu.dispose);if(b.length){var d=Blockly.ContextMenu.populate_(b,c);Blockly.ContextMenu.menu_=d;Blockly.ContextMenu.position_(d,a,c);setTimeout(function(){d.focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()}; +Blockly.ContextMenu.populate_=function(a,b){var c=new Blockly.Menu;c.setRole(Blockly.utils.aria.Role.MENU);for(var d=0,e;e=a[d];d++){var f=new Blockly.MenuItem(e.text);f.setRightToLeft(b);f.setRole(Blockly.utils.aria.Role.MENUITEM);c.addChild(f);f.setEnabled(e.enabled);if(e.enabled)f.onAction(function(g){Blockly.ContextMenu.hide();this.callback(this.scope)},e)}return c}; +Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBox();b=new Blockly.utils.Rect(b.clientY+d.top,b.clientY+d.top,b.clientX+d.left,b.clientX+d.left);Blockly.ContextMenu.createWidget_(a);var e=a.getSize();c&&(b.left+=e.width,b.right+=e.width,d.left+=e.width,d.right+=e.width);Blockly.WidgetDiv.positionWithAnchor(d,b,e,c);a.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.dispose=function(){Blockly.ContextMenu.menu_&&(Blockly.ContextMenu.menu_.dispose(),Blockly.ContextMenu.menu_=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.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 d=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);d.moveBy(e.x,e.y);a.rendered&&(d.initSvg(),d.render(),d.select())};return c};Blockly.ContextMenuItems={};Blockly.ContextMenuItems.registerUndo=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.UNDO},preconditionFn:function(a){return 0b.length?Blockly.ContextMenuItems.deleteNext_(b,c):Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",b.length),function(d){d&&Blockly.ContextMenuItems.deleteNext_(b,c)})}},scopeType:Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})}; +Blockly.ContextMenuItems.registerWorkspaceOptions_=function(){Blockly.ContextMenuItems.registerUndo();Blockly.ContextMenuItems.registerRedo();Blockly.ContextMenuItems.registerCleanup();Blockly.ContextMenuItems.registerCollapse();Blockly.ContextMenuItems.registerExpand();Blockly.ContextMenuItems.registerDeleteAll()}; +Blockly.ContextMenuItems.registerDuplicate=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.DUPLICATE_BLOCK},preconditionFn:function(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback:function(a){a.block&&Blockly.duplicate(a.block)},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK,id:"blockDuplicate",weight:1})}; +Blockly.ContextMenuItems.registerComment=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getCommentIcon()?Blockly.Msg.REMOVE_COMMENT:Blockly.Msg.ADD_COMMENT},preconditionFn:function(a){a=a.block;return Blockly.utils.userAgent.IE||a.isInFlyout||!a.workspace.options.comments||a.isCollapsed()||!a.isEditable()?"hidden":"enabled"},callback:function(a){a=a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK, +id:"blockComment",weight:2})}; +Blockly.ContextMenuItems.registerInline=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getInputsInline()?Blockly.Msg.EXTERNAL_INPUTS:Blockly.Msg.INLINE_INPUTS},preconditionFn:function(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(var b=1;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(),b.getSvgRoot().style.display="block")};Blockly.RenderedConnection.prototype.respawnShadow_=function(){Blockly.RenderedConnection.superClass_.respawnShadow_.call(this);var a=this.targetBlock();a&&(a.initSvg(),a.render(!1),a=this.getSourceBlock(),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();var c=b.rendered,d=a.rendered;c&&b.updateDisabled();d&&a.updateDisabled();c&&d&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?a.render():b.render());if(b=b.getInputWithBlock(a))b=b.isVisible(),a.getSvgRoot().style.display=b?"block":"none"}; +Blockly.RenderedConnection.prototype.onCheckChanged_=function(){!this.isConnected()||this.targetConnection&&this.getConnectionChecker().canConnect(this,this.targetConnection,!1)||((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.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},null);this.svgGroup_.translate_="";this.style=a.getRenderer().getConstants().getBlockStyle(null);this.pathObject=a.getRenderer().makePathObject(this.svgGroup_,this.style);this.renderIsInProgress_=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.userAgent.IE&&this.svgGroup_.setAttribute("data-id",this.id)};Blockly.utils.object.inherits(Blockly.BlockSvg,Blockly.Block);Blockly.BlockSvg.prototype.height=0;Blockly.BlockSvg.prototype.width=0;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(l){var m=e-d[l].x,n=f-d[l].y;Math.sqrt(m*m+n*n)<=b&&k.push(d[l]);return na)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;eMath.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_)||(this.oldScale_=a,this.oldTop_=b,this.oldLeft_=c,a=new Blockly.Events.ViewportChange(b,c,a,this.id),Blockly.Events.fire(a))}}; +Blockly.WorkspaceSvg.prototype.translate=function(a,b){if(this.useWorkspaceDragSurface_&&this.isDragSurfaceActive_)this.workspaceDragSurface_.translateSurface(a,b);else{var c="translate("+a+","+b+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",c);this.svgBubbleCanvas_.setAttribute("transform",c)}this.blockDragSurface_&&this.blockDragSurface_.translateAndScaleGroup(a,b,this.scale);this.grid_&&this.grid_.moveTo(a,b);this.maybeFireViewportChangeEvent()}; +Blockly.WorkspaceSvg.prototype.resetDragSurface=function(){if(this.useWorkspaceDragSurface_){this.isDragSurfaceActive_=!1;var a=this.workspaceDragSurface_.getSurfaceTranslation();this.workspaceDragSurface_.clearAndHide(this.svgGroup_);a="translate("+a.x+","+a.y+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",a);this.svgBubbleCanvas_.setAttribute("transform",a)}}; +Blockly.WorkspaceSvg.prototype.setupDragSurface=function(){if(this.useWorkspaceDragSurface_&&!this.isDragSurfaceActive_){this.isDragSurfaceActive_=!0;var a=this.svgBlockCanvas_.previousSibling,b=parseInt(this.getParentSvg().getAttribute("width"),10),c=parseInt(this.getParentSvg().getAttribute("height"),10),d=Blockly.utils.getRelativeXY(this.getCanvas());this.workspaceDragSurface_.setContentsAndShow(this.getCanvas(),this.getBubbleCanvas(),a,b,c,this.scale);this.workspaceDragSurface_.translateSurface(d.x, +d.y)}};Blockly.WorkspaceSvg.prototype.getBlockDragSurface=function(){return this.blockDragSurface_};Blockly.WorkspaceSvg.prototype.getWidth=function(){var a=this.getMetrics();return a?a.viewWidth/this.scale:0}; +Blockly.WorkspaceSvg.prototype.setVisible=function(a){this.isVisible_=a;if(this.svgGroup_)if(this.scrollbar&&this.scrollbar.setContainerVisible(a),this.getFlyout()&&this.getFlyout().setContainerVisible(a),this.getParentSvg().style.display=a?"block":"none",this.toolbox_&&this.toolbox_.setVisible(a),a){a=this.getAllBlocks(!1);for(var b=a.length-1;0<=b;b--)a[b].markDirty();this.render();this.toolbox_&&this.toolbox_.position()}else Blockly.hideChaff(!0)}; +Blockly.WorkspaceSvg.prototype.render=function(){for(var a=this.getAllBlocks(!1),b=a.length-1;0<=b;b--)a[b].render(!1);if(this.currentGesture_)for(a=this.currentGesture_.getInsertionMarkers(),b=0;b=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()&&Blockly.WorkspaceComment.fireCreateEvent(b);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_&&"function"==typeof this.toolbox_.getClientRect?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.getTopBoundedElements();if(!a.length)return new Blockly.utils.Rect(0,0,0,0);for(var b=a[0].getBoundingRectangle(),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){if(!this.options.readOnly&&!this.isFlyout){var b=Blockly.ContextMenuRegistry.registry.getContextMenuOptions(Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,{workspace:this});this.configureContextMenu&&this.configureContextMenu(b,a);Blockly.ContextMenu.show(a,b,this.RTL)}}; +Blockly.WorkspaceSvg.prototype.updateToolbox=function(a){if(a=Blockly.utils.toolbox.convertToolboxDefToJson(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(Blockly.utils.toolbox.hasCategories(a)){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.render(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree= +a;this.flyout_.show(a)}}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&&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&&ag.viewBottom||g.contentLeftg.viewRight){h=null;f&&(h=Blockly.Events.getGroup(),Blockly.Events.setGroup(f.group));switch(f.type){case Blockly.Events.BLOCK_CREATE:case Blockly.Events.BLOCK_MOVE:var l= +e.getBlockById(f.blockId);l&&(l=l.getRootBlock());break;case Blockly.Events.COMMENT_CREATE:case Blockly.Events.COMMENT_MOVE:l=e.getCommentById(f.commentId)}if(l){k=l.getBoundingRectangle();k.height=k.bottom-k.top;k.width=k.right-k.left;var m=g.viewTop,n=g.viewBottom-k.height;n=Math.max(m,n);m=Blockly.utils.math.clamp(m,k.top,n)-k.top;n=g.viewLeft;var p=g.viewRight-k.width;g.RTL?n=Math.min(p,n):p=Math.max(n,p);g=Blockly.utils.math.clamp(n,k.left,p)-k.left;l.moveBy(g,m)}f&&(!f.group&&l&&console.warn("Moved object in bounds but there was no event group. This may break undo."), +null!==h&&Blockly.Events.setGroup(h))}}});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(e){Blockly.utils.isTargetInput(e)||e.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),"function"==typeof d.scrollToStart&& +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;bb.indexOf(d))throw Error(d+" is not a valid modifier key.");}; +Blockly.ShortcutRegistry.prototype.createSerializedKey=function(a,b){var c="";if(b){this.checkModifiers_(b);for(var d in Blockly.ShortcutRegistry.modifierKeys)-11'),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="4.20201217.0";Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.parentContainer=null;Blockly.svgSize=function(a){return new Blockly.utils.Size(a.cachedWidth_,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()))Blockly.ShortcutRegistry.registry.onKeyDown(b,a)}; +Blockly.deleteBlock=function(a){a.workspace.isFlyout||(Blockly.Events.setGroup(!0),Blockly.hideChaff(),a.dispose(!0,!0),Blockly.Events.setGroup(!1))};Blockly.copy=function(a){if(a=a.toCopyData())Blockly.clipboardXml_=a.xml,Blockly.clipboardSource_=a.source,Blockly.clipboardTypeCounts_=a.typeCounts}; +Blockly.paste=function(){if(!Blockly.clipboardXml_)return!1;var a=Blockly.clipboardSource_;a.isFlyout&&(a=a.targetWorkspace);return Blockly.clipboardTypeCounts_&&a.isCapacityAvailable(Blockly.clipboardTypeCounts_)?(Blockly.Events.setGroup(!0),a.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1),!0):!1}; +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.closeFlyout(),(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.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_TOP||this.targetWorkspace.getToolbox()|| +this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.HorizontalFlyout);Blockly.VerticalFlyout=function(a){Blockly.VerticalFlyout.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.VerticalFlyout,Blockly.Flyout);Blockly.VerticalFlyout.registryName="verticalFlyout"; +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{contentHeight:a.height*this.workspace_.scale+2*this.MARGIN,contentWidth:a.width*this.workspace_.scale+2*this.MARGIN,contentTop:a.y,contentLeft:a.x,viewHeight:c,viewWidth:d,viewTop:-this.workspace_.scrollY+ +a.y,viewLeft:-this.workspace_.scrollX,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.getX=function(){var a=this.targetWorkspace.getMetrics();return a?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.getY=function(){return 0}; +Blockly.VerticalFlyout.prototype.position=function(){if(this.isVisible()){var a=this.targetWorkspace.getMetrics();if(a){this.height_=a.viewHeight;this.setBackgroundPath_(this.width_-this.CORNER_RADIUS,a.viewHeight-2*this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}}; +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();Blockly.DropDownDiv.hideWithoutAnimation()}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.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_LEFT||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY); +this.width_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.VerticalFlyout);Blockly.FlyoutButton=function(a,b,c,d){this.workspace_=a;this.targetWorkspace_=b;this.text_=c.text;this.position_=new Blockly.utils.Coordinate(0,0);this.isLabel_=d;this.callbackKey_=c.callbackKey||c.callbackkey;this.cssClass_=c["web-class"]||null;this.onMouseUpWrapper_=null;this.info=c};Blockly.FlyoutButton.MARGIN_X=5;Blockly.FlyoutButton.MARGIN_Y=2;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(Blockly.utils.Svg.G,{"class":a},this.workspace_.getCanvas());if(!this.isLabel_)var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"blocklyFlyoutButtonShadow",rx:4,ry:4,x:1,y:1},this.svgGroup_);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":this.isLabel_? +"blocklyFlyoutLabelBackground":"blocklyFlyoutButtonBackground",rx:4,ry:4},this.svgGroup_);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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"));var e=Blockly.utils.style.getComputedStyle(c, +"fontSize"),f=Blockly.utils.style.getComputedStyle(c,"fontWeight"),g=Blockly.utils.style.getComputedStyle(c,"fontFamily");this.width=Blockly.utils.dom.getFastTextWidthWithSizeString(c,e,f,g);d=Blockly.utils.dom.measureFontMetrics(d,e,f,g);this.height=d.height;this.isLabel_||(this.width+=2*Blockly.FlyoutButton.MARGIN_X,this.height+=2*Blockly.FlyoutButton.MARGIN_Y,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/2-d.height/2+d.baseline);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.isLabel=function(){return this.isLabel_};Blockly.FlyoutButton.prototype.getPosition=function(){return this.position_};Blockly.FlyoutButton.prototype.getButtonText=function(){return this.text_}; +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;,}".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.isInitialized=null; +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;c>>/sprites.png);","height: 16px;","vertical-align: middle;","visibility: hidden;","width: 16px;","}",".blocklyTreeIconClosed {","background-position: -32px -1px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeIconClosed {',"background-position: 0 -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosed {","background-position: -32px -17px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeSelected>.blocklyTreeIconClosed {', +"background-position: 0 -17px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeLabel {","cursor: default;","font: 16px sans-serif;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}"]); +Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.ToolboxCategory.registrationName,Blockly.ToolboxCategory);Blockly.ToolboxSeparator=function(a,b){Blockly.ToolboxSeparator.superClass_.constructor.call(this,a,b);this.cssConfig_={container:"blocklyTreeSeparator"};Blockly.utils.object.mixin(this.cssConfig_,a.cssconfig||a.cssConfig)};Blockly.utils.object.inherits(Blockly.ToolboxSeparator,Blockly.ToolboxItem);Blockly.ToolboxSeparator.registrationName="sep";Blockly.ToolboxSeparator.prototype.init=function(){this.createDom_()}; +Blockly.ToolboxSeparator.prototype.createDom_=function(){var a=document.createElement("div");Blockly.utils.dom.addClass(a,this.cssConfig_.container);return this.htmlDiv_=a};Blockly.ToolboxSeparator.prototype.getDiv=function(){return this.htmlDiv_};Blockly.ToolboxSeparator.prototype.dispose=function(){Blockly.utils.dom.removeNode(this.htmlDiv_)};Blockly.Css.register('.blocklyTreeSeparator {,border-bottom: solid #e5e5e5 1px;,height: 0;,margin: 5px 0;,},.blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {,border-right: solid #e5e5e5 1px;,border-bottom: none;,height: auto;,margin: 0 5px 0 5px;,padding: 5px 0;,width: 0;,}'.split(",")); +Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.ToolboxSeparator.registrationName,Blockly.ToolboxSeparator);Blockly.CollapsibleToolboxCategory=function(a,b,c){this.subcategoriesDiv_=null;this.expanded_=!1;this.toolboxItems_=[];Blockly.CollapsibleToolboxCategory.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.CollapsibleToolboxCategory,Blockly.ToolboxCategory);Blockly.CollapsibleToolboxCategory.registrationName="collapsibleCategory"; +Blockly.CollapsibleToolboxCategory.prototype.makeDefaultCssConfig_=function(){var a=Blockly.CollapsibleToolboxCategory.superClass_.makeDefaultCssConfig_.call(this);a.contents="blocklyToolboxContents";return a}; +Blockly.CollapsibleToolboxCategory.prototype.parseContents_=function(a){var b=a.contents,c=!0;if(a.custom)this.flyoutItems_=a.custom;else if(b){a=0;for(var d;d=b[a];a++)!Blockly.registry.hasItem(Blockly.registry.Type.TOOLBOX_ITEM,d.kind)||d.kind.toLowerCase()==Blockly.ToolboxSeparator.registrationName&&c?(this.flyoutItems_.push(d),c=!0):(this.createToolboxItem_(d),c=!1)}}; +Blockly.CollapsibleToolboxCategory.prototype.createToolboxItem_=function(a){var b=a.kind;"CATEGORY"==b.toUpperCase()&&Blockly.utils.toolbox.isCategoryCollapsible(a)&&(b=Blockly.CollapsibleToolboxCategory.registrationName);a=new (Blockly.registry.getClass(Blockly.registry.Type.TOOLBOX_ITEM,b))(a,this.parentToolbox_,this);this.toolboxItems_.push(a)}; +Blockly.CollapsibleToolboxCategory.prototype.init=function(){Blockly.CollapsibleToolboxCategory.superClass_.init.call(this);this.setExpanded("true"==this.toolboxItemDef_.expanded||this.toolboxItemDef_.expanded)}; +Blockly.CollapsibleToolboxCategory.prototype.createDom_=function(){Blockly.CollapsibleToolboxCategory.superClass_.createDom_.call(this);var a=this.getChildToolboxItems();this.subcategoriesDiv_=this.createSubCategoriesDom_(a);Blockly.utils.aria.setRole(this.subcategoriesDiv_,Blockly.utils.aria.Role.GROUP);this.htmlDiv_.appendChild(this.subcategoriesDiv_);return this.htmlDiv_}; +Blockly.CollapsibleToolboxCategory.prototype.createIconDom_=function(){var a=document.createElement("span");this.parentToolbox_.isHorizontal()||(Blockly.utils.dom.addClass(a,this.cssConfig_.icon),a.style.visibility="visible");a.style.display="inline-block";return a}; +Blockly.CollapsibleToolboxCategory.prototype.createSubCategoriesDom_=function(a){var b=document.createElement("div");Blockly.utils.dom.addClass(b,this.cssConfig_.contents);for(var c=0;c>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","padding: 4px 0 4px 0;","position: absolute;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyToolboxContents {","display: flex;","flex-wrap: wrap;","flex-direction: column;", +"}",".blocklyToolboxContents:focus {","outline: none;","}"]);Blockly.registry.register(Blockly.registry.Type.TOOLBOX,Blockly.registry.DEFAULT,Blockly.Toolbox);Blockly.Events.TrashcanOpen=function(a,b){Blockly.Events.TrashcanOpen.superClass_.constructor.call(this,b);this.isOpen=a};Blockly.utils.object.inherits(Blockly.Events.TrashcanOpen,Blockly.Events.UiBase);Blockly.Events.TrashcanOpen.prototype.type=Blockly.Events.TRASHCAN_OPEN;Blockly.Events.TrashcanOpen.prototype.toJson=function(){var a=Blockly.Events.TrashcanOpen.superClass_.toJson.call(this);a.isOpen=this.isOpen;return a}; +Blockly.Events.TrashcanOpen.prototype.fromJson=function(a){Blockly.Events.TrashcanOpen.superClass_.fromJson.call(this,a);this.isOpen=a.isOpen};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TRASHCAN_OPEN,Blockly.Events.TrashcanOpen);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,rendererOverrides:this.workspace_.options.rendererOverrides});if(this.workspace_.horizontalLayout){a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.TOP? +Blockly.utils.toolbox.Position.BOTTOM:Blockly.utils.toolbox.Position.TOP;if(!Blockly.HorizontalFlyout)throw Error("Missing require for Blockly.HorizontalFlyout");this.flyout=new Blockly.HorizontalFlyout(a)}else{a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.RIGHT?Blockly.utils.toolbox.Position.LEFT:Blockly.utils.toolbox.Position.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.ANIMATION_LENGTH_=80;Blockly.Trashcan.ANIMATION_FRAMES_=4;Blockly.Trashcan.OPACITY_MIN_=.4; +Blockly.Trashcan.OPACITY_MAX_=.8;Blockly.Trashcan.MAX_LID_ANGLE_=45;Blockly.Trashcan.prototype.isLidOpen=!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(Blockly.utils.Svg.G,{"class":"blocklyTrash"},null);var a=String(Math.random()).substring(2);var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashBodyClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.BODY_HEIGHT_,y:this.LID_HEIGHT_},b);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashLidClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.LID_HEIGHT_},b);this.svgLid_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.bindEvent_(this.svgGroup_,"mousedown",this,this.blockMouseDownWhenOpenable_);Blockly.bindEvent_(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),Blockly.Trashcan.ANIMATION_LENGTH_/ +a))};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.setMinOpenness_=function(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*Blockly.Trashcan.MAX_LID_ANGLE_)};Blockly.Trashcan.prototype.closeLid=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.click=function(){this.hasContents_()&&this.openFlyout()};Blockly.Trashcan.prototype.fireUiEvent_=function(a){a=new Blockly.Events.TrashcanOpen(a,this.workspace_.id);Blockly.Events.fire(a)};Blockly.Trashcan.prototype.blockMouseDownWhenOpenable_=function(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()};Blockly.Trashcan.prototype.mouseOver_=function(){this.hasContents_()&&this.setLidOpen(!0)};Blockly.Trashcan.prototype.mouseOut_=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.onDelete_=function(a){if(!(0>=this.workspace_.options.maxTrashcanContents)&&a.type==Blockly.Events.BLOCK_DELETE&&a.oldXml.tagName&&"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.setMinOpenness_(this.HAS_BLOCKS_LID_ANGLE_)}}; +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(Blockly.utils.Svg.RECT,{"class":"blocklyIconShape",rx:"4",ry:"4",height:"16",width:"16"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.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(Blockly.utils.Svg.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,rendererOverrides:this.block_.workspace.options.rendererOverrides});b.toolboxPosition=this.block_.RTL?Blockly.utils.toolbox.Position.RIGHT:Blockly.utils.toolbox.Position.LEFT;if(c=!!a)b.languageTree=Blockly.utils.toolbox.convertToolboxDefToJson(a),b.getMetrics=this.getFlyoutMetrics_.bind(this);this.workspace_=new Blockly.WorkspaceSvg(b);this.workspace_.isMutator=!0;this.workspace_.addChangeListener(Blockly.Events.disableOrphans); +a=c?this.workspace_.addFlyout(Blockly.utils.Svg.G):null;b=this.workspace_.createDom("blocklyMutatorBackground");a&&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(),c=b.width+b.x,d=b.height+3*a,e=this.workspace_.getFlyout();if(e){var f=e.getMetrics_();d=Math.max(d,f.contentHeight+20);c+=e.getWidth()}this.block_.RTL&&(c=-b.x);c+=3*a;if(Math.abs(this.workspaceWidth_-c)>a||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+a,d+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.BubbleOpen(this.block_,a,"mutator")),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));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=this.rootBlock_.RTL?a.getWidth()+b: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.isUiEvent||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();20>d.y&&c.moveBy(0,20-d.y);if(c.RTL){var e=-20,f=this.workspace_.getFlyout();f&&(e-=f.getWidth());d.x>e&&c.moveBy(e-d.x,0)}else 20>d.x&&c.moveBy(20-d.x,0)}}if(this.rootBlock_.workspace==this.workspace_){Blockly.Events.setGroup(!0);c=this.block_; +a=(a=c.mutationToDom())&&Blockly.Xml.domToText(a);b=c.rendered;c.rendered=!1;c.compose(this.rootBlock_);c.rendered=b;c.initSvg();Blockly.getMainWorkspace().keyboardAccessibilityMode&&Blockly.navigation.moveCursorOnBlockMutation(c);c.rendered&&c.render();b=(b=c.mutationToDom())&&Blockly.Xml.domToText(b);if(a!=b){Blockly.Events.fire(new Blockly.Events.BlockChange(c,"mutation",null,a,b));var g=Blockly.Events.getGroup();setTimeout(function(){Blockly.Events.setGroup(g);c.bumpNeighbours();Blockly.Events.setGroup(!1)}, +Blockly.BUMP_DELAY)}this.workspace_.isDragging()||this.resizeBubble_();Blockly.Events.setGroup(!1)}}};Blockly.Mutator.prototype.getFlyoutMetrics_=function(){var a=this.workspace_.getFlyout();a=a?a.getWidth():0;return{contentHeight:0,contentWidth:0,contentTop:0,contentLeft:0,viewHeight:this.workspaceHeight_,viewWidth:this.workspaceWidth_-a,viewTop:0,viewLeft:0,absoluteTop:0,absoluteLeft:this.workspace_.RTL?0:a}};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.getConstants().FULL_BLOCK_FIELDS&&(this.borderRect_?this.borderRect_.setAttribute("stroke",this.sourceBlock_.style.colourTertiary):this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.getConstants().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(){Blockly.prompt(Blockly.Msg.CHANGE_VALUE_TITLE,this.getText(),function(a){this.setValue(this.getValueFromEditorText_(a))}.bind(this))};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_.getScale(),d=this.getConstants().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.getConstants().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.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,b,c);this.moveSurfaceWrapper_=this.clickSurfaceWrapper_=this.clickWrapper_=this.line_=this.gauge_=null};Blockly.utils.object.inherits(Blockly.FieldAngle,Blockly.FieldTextInput);Blockly.FieldAngle.prototype.DEFAULT_VALUE=0; +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(Blockly.utils.Svg.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(Blockly.utils.Svg.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(Blockly.utils.Svg.CIRCLE,{cx:Blockly.FieldAngle.HALF,cy:Blockly.FieldAngle.HALF,r:Blockly.FieldAngle.RADIUS,"class":"blocklyAngleCircle"}, +a);this.gauge_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{"class":"blocklyAngleGauge"},a);this.line_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{x1:Blockly.FieldAngle.HALF,y1:Blockly.FieldAngle.HALF,"class":"blocklyAngleLine"},a);for(var c=0;360>c;c+=15)Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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;Blockly.FieldCheckbox.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.FieldCheckbox,Blockly.Field);Blockly.FieldCheckbox.prototype.DEFAULT_VALUE=!1;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.configure_=function(a){Blockly.FieldCheckbox.superClass_.configure_.call(this,a);a.checkCharacter&&(this.checkChar_=a.checkCharacter)};Blockly.FieldCheckbox.prototype.initView=function(){Blockly.FieldCheckbox.superClass_.initView.call(this);Blockly.utils.dom.addClass(this.textElement_,"blocklyCheckbox");this.textElement_.style.display=this.value_?"block":"none"}; +Blockly.FieldCheckbox.prototype.render_=function(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)};Blockly.FieldCheckbox.prototype.getDisplayText_=function(){return this.checkChar_||Blockly.FieldCheckbox.CHECK_CHAR};Blockly.FieldCheckbox.prototype.setCheckCharacter=function(a){this.checkChar_=a;this.forceRerender()};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,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.getConstants().FIELD_COLOUR_DEFAULT_WIDTH,this.getConstants().FIELD_COLOUR_DEFAULT_HEIGHT);this.getConstants().FIELD_COLOUR_FULL_BLOCK?this.clickTarget_=this.sourceBlock_.getSvgRoot():(this.createBorderRect_(),this.borderRect_.style.fillOpacity="1")}; +Blockly.FieldColour.prototype.applyColour=function(){this.getConstants().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_.rendered&&(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.prototype.DEFAULT_VALUE=Blockly.FieldColour.COLOURS[0];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_)switch(a.name){case Blockly.navigation.actionNames.PREVIOUS:return this.moveHighlightBy_(0,-1),!0;case Blockly.navigation.actionNames.NEXT:return this.moveHighlightBy_(0,1),!0;case Blockly.navigation.actionNames.OUT:return this.moveHighlightBy_(-1,0),!0;case Blockly.navigation.actionNames.IN:return this.moveHighlightBy_(1,0),!0;default:return!1}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.suffixField=this.prefixField=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(Blockly.utils.Svg.IMAGE,{},this.fieldGroup_);this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_();this.borderRect_&&Blockly.utils.dom.addClass(this.borderRect_,"blocklyDropdownRect")}; +Blockly.FieldDropdown.prototype.shouldAddBorderRect_=function(){return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!this.sourceBlock_.isShadow()}; +Blockly.FieldDropdown.prototype.createTextArrow_=function(){this.arrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.IMAGE,{height:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_);this.svgArrow_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.getConstants().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());a=this.menu_.getElement();Blockly.utils.dom.addClass(a,"blocklyDropdownMenu");if(this.getConstants().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_&&this.menu_.setHighlighted(this.selectedMenuItem_);this.applyColour()}; +Blockly.FieldDropdown.prototype.dropdownCreate_=function(){var a=new Blockly.Menu;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.prototype.DEFAULT_VALUE="";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(Blockly.utils.Svg.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_);this.clickHandler_&&(this.imageElement_.style.cursor="pointer")};Blockly.FieldImage.prototype.updateSize_=function(){}; +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){Blockly.FieldMultilineInput.superClass_.constructor.call(this,a,b,c);this.textGroup_=null};Blockly.utils.object.inherits(Blockly.FieldMultilineInput,Blockly.FieldTextInput);Blockly.FieldMultilineInput.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.text);return new Blockly.FieldMultilineInput(b,void 0,a)};Blockly.FieldMultilineInput.prototype.toXml=function(a){a.textContent=this.getValue().replace(/\n/g," ");return a}; +Blockly.FieldMultilineInput.prototype.fromXml=function(a){this.setValue(a.textContent.replace(/ /g,"\n"))};Blockly.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}; +Blockly.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.getText();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+=this.getConstants().FIELD_TEXT_HEIGHT+(0this.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="string"===typeof a?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.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.getConstants().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+" .blocklyFlyoutLabelText {","fill: #000;","}",a+" .blocklyText.blocklyBubbleText {","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;","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};Blockly.Events.MarkerMove=function(a,b,c,d){var e=a?a.workspace.id:void 0;d&&d.getType()==Blockly.ASTNode.types.WORKSPACE&&(e=d.getLocation().id);Blockly.Events.MarkerMove.superClass_.constructor.call(this,e);this.blockId=a?a.id:null;this.oldNode=c;this.newNode=d;this.isCursor=b};Blockly.utils.object.inherits(Blockly.Events.MarkerMove,Blockly.Events.UiBase);Blockly.Events.MarkerMove.prototype.type=Blockly.Events.MARKER_MOVE; +Blockly.Events.MarkerMove.prototype.toJson=function(){var a=Blockly.Events.MarkerMove.superClass_.toJson.call(this);a.isCursor=this.isCursor;a.blockId=this.blockId;a.oldNode=this.oldNode;a.newNode=this.newNode;return a};Blockly.Events.MarkerMove.prototype.fromJson=function(a){Blockly.Events.MarkerMove.superClass_.fromJson.call(this,a);this.isCursor=a.isCursor;this.blockId=a.blockId;this.oldNode=a.oldNode;this.newNode=a.newNode}; +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MARKER_MOVE,Blockly.Events.MarkerMove);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.getMarker=function(){return this.marker_};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(Blockly.utils.Svg.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.draw=function(a,b){if(b){this.constants_=this.workspace_.getRenderer().getConstants();var c=this.isCursor()?this.constants_.CURSOR_COLOUR:this.constants_.MARKER_COLOUR;this.colour_=this.marker_.colour||c;this.applyColour_(b);this.showAtLocation_(b);this.fireMarkerEvent_(a,b);a=this.currentMarkerSvg.childNodes[0];void 0!==a&&a.beginElement&&a.beginElement()}else this.hide()}; +Blockly.blockRendering.MarkerSvg.prototype.showAtLocation_=function(a){var b=a.getLocation();a.getType()==Blockly.ASTNode.types.BLOCK?this.showWithBlock_(a):a.getType()==Blockly.ASTNode.types.OUTPUT?this.showWithOutput_(a):b.type==Blockly.INPUT_VALUE?this.showWithInput_(a):b.type==Blockly.NEXT_STATEMENT?this.showWithNext_(a):a.getType()==Blockly.ASTNode.types.PREVIOUS?this.showWithPrevious_(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.showWithBlockPrevOutput_=function(a){a=a.getSourceBlock();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.showWithBlock_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithPrevious_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithOutput_=function(a){this.showWithBlockPrevOutput_(a)}; +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.fireMarkerEvent_=function(a,b){var c=b.getSourceBlock();a=new Blockly.Events.MarkerMove(c,this.isCursor(),a,b);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(Blockly.utils.Svg.G,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT},this.svgGroup_);this.markerSvgLine_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT,style:"display: none"},this.markerSvg_);this.markerSvgRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT, +{"class":"blocklyVerticalMarker",rx:10,ry:10,style:"display: none"},this.markerSvg_);this.markerInput_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none"},this.markerSvg_);this.markerBlock_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none",fill:"none","stroke-width":this.constants_.CURSOR_STROKE_WIDTH},this.markerSvg_);if(this.isCursor()){var a=this.getBlinkProperties_();Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE, +a,this.markerSvgLine_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerInput_);a.attributeName="stroke";Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerBlock_)}return this.markerSvg_}; +Blockly.blockRendering.MarkerSvg.prototype.applyColour_=function(a){this.markerSvgLine_.setAttribute("fill",this.colour_);this.markerSvgRect_.setAttribute("stroke",this.colour_);this.markerInput_.setAttribute("fill",this.colour_);this.markerBlock_.setAttribute("stroke",this.colour_);this.isCursor()&&(a=this.colour_+";transparent;transparent;",this.markerSvgLine_.firstChild.setAttribute("values",a),this.markerInput_.firstChild.setAttribute("values",a),this.markerBlock_.firstChild.setAttribute("values", +a))};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){Object.prototype.hasOwnProperty.call(Blockly.blockRendering.Types,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.inputRows=[];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_);this.inputRows.push(a);var 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.inputRows.push(a));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;d.blocklyPathLight,",a+" .blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"])};Blockly.geras.Highlighter=function(a){this.info_=a;this.inlineSteps_=this.steps_="";this.RTL_=this.info_.RTL;a=a.getRenderer();this.constants_=a.getConstants();this.highlightConstants_=a.getHighlightConstants();this.highlightOffset_=this.highlightConstants_.OFFSET;this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER;this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER;this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB;this.notchPaths_=this.highlightConstants_.NOTCH;this.startPaths_= +this.highlightConstants_.START_HAT;this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH};Blockly.geras.Highlighter.prototype.getPath=function(){return this.steps_+"\n"+this.inlineSteps_}; +Blockly.geras.Highlighter.prototype.drawTopCorner=function(a){this.steps_+=Blockly.utils.svgPaths.moveBy(a.xPos,this.info_.startY);for(var b=0,c;c=a.elements[b];b++)Blockly.blockRendering.Types.isLeftSquareCorner(c)?this.steps_+=this.highlightConstants_.START_POINT:Blockly.blockRendering.Types.isLeftRoundedCorner(c)?this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):Blockly.blockRendering.Types.isPreviousConnection(c)?this.steps_+=this.notchPaths_.pathLeft:Blockly.blockRendering.Types.isHat(c)? +this.steps_+=this.startPaths_.path(this.RTL_):Blockly.blockRendering.Types.isSpacer(c)&&0!=c.width&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",c.xPos+c.width-this.highlightOffset_));this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",a.xPos+a.width-this.highlightOffset_)};Blockly.geras.Highlighter.prototype.drawJaggedEdge_=function(a){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+Blockly.utils.svgPaths.lineOnAxis("v",a.height-this.jaggedTeethPaths_.height-this.highlightOffset_))}; +Blockly.geras.Highlighter.prototype.drawValueInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-b.connectionHeight;this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos+b.width-this.highlightOffset_,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",c)}else this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos+b.width,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}; +Blockly.geras.Highlighter.prototype.drawStatementInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-2*this.insideCornerPaths_.height;this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos,a.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",c)+this.insideCornerPaths_.pathBottom(this.RTL_)+Blockly.utils.svgPaths.lineTo(a.width-b.xPos-this.insideCornerPaths_.width,0)}else this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos,a.yPos+a.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+ +Blockly.utils.svgPaths.lineTo(a.width-b.xPos-this.insideCornerPaths_.width,0)};Blockly.geras.Highlighter.prototype.drawRightSideRow=function(a){var b=a.xPos+a.width-this.highlightOffset_;a.followsStatement&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",b));this.RTL_&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",b),a.height>this.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;eb?b:f;e=e?-1:1;c=(d?-1:1)*c/2;return Blockly.utils.svgPaths.lineTo(-e*f,c)+Blockly.utils.svgPaths.lineTo(e*f,c)}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width:function(c){c/=2;return c>b?b:c},height:function(c){return c},connectionOffsetY:function(c){return c/2},connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c, +!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.makeRounded=function(){function a(d,e,f){var g=d>c?d-c:0;d=(d>c?c:d)/2;return Blockly.utils.svgPaths.arc("a","0 0,1",d,Blockly.utils.svgPaths.point((e?-1:1)*d,(e?-1:1)*d))+Blockly.utils.svgPaths.lineOnAxis("v",(f?1:-1)*g)+Blockly.utils.svgPaths.arc("a","0 0,1",d,Blockly.utils.svgPaths.point((e?1:-1)*d,(e?-1:1)*d))}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,c=2*b;return{type:this.SHAPES.ROUND,isDynamic:!0,width:function(d){d/=2;return d>b?b:d},height:function(d){return d}, +connectionOffsetY:function(d){return d/2},connectionOffsetX:function(d){return-d},pathDown:function(d){return a(d,!1,!1)},pathUp:function(d){return a(d,!0,!1)},pathRightDown:function(d){return a(d,!1,!0)},pathRightUp:function(d){return a(d,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.makeSquared=function(){function a(c,d,e){c-=2*b;return Blockly.utils.svgPaths.arc("a","0 0,1",b,Blockly.utils.svgPaths.point((d?-1:1)*b,(d?-1:1)*b))+Blockly.utils.svgPaths.lineOnAxis("v",(e?1:-1)*c)+Blockly.utils.svgPaths.arc("a","0 0,1",b,Blockly.utils.svgPaths.point((d?1:-1)*b,(d?-1:1)*b))}var b=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE,isDynamic:!0,width:function(c){return b},height:function(c){return c},connectionOffsetY:function(c){return c/2}, +connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c,!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.shapeFor=function(a){var b=a.getCheck();!b&&a.targetConnection&&(b=a.targetConnection.getCheck());switch(a.type){case Blockly.INPUT_VALUE:case Blockly.OUTPUT_VALUE:a=a.getSourceBlock().getOutputShape();if(null!=a)switch(a){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}if(b&&-1!=b.indexOf("Boolean"))return this.HEXAGONAL;if(b&&-1!=b.indexOf("Number"))return this.ROUNDED; +b&&b.indexOf("String");return this.ROUNDED;case Blockly.PREVIOUS_STATEMENT:case Blockly.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type");}}; +Blockly.zelos.ConstantProvider.prototype.makeNotch=function(){function a(l){return Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/2,0),Blockly.utils.svgPaths.point(l*e*3/4,g/2),Blockly.utils.svgPaths.point(l*e,g)])+Blockly.utils.svgPaths.line([Blockly.utils.svgPaths.point(l*e,f)])+Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/4,g/2),Blockly.utils.svgPaths.point(l*e/2,g),Blockly.utils.svgPaths.point(l*e,g)])+Blockly.utils.svgPaths.lineOnAxis("h",l*d)+Blockly.utils.svgPaths.curve("c", +[Blockly.utils.svgPaths.point(l*e/2,0),Blockly.utils.svgPaths.point(l*e*3/4,-(g/2)),Blockly.utils.svgPaths.point(l*e,-g)])+Blockly.utils.svgPaths.line([Blockly.utils.svgPaths.point(l*e,-f)])+Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/4,-(g/2)),Blockly.utils.svgPaths.point(l*e/2,-g),Blockly.utils.svgPaths.point(l*e,-g)])}var b=this.NOTCH_WIDTH,c=this.NOTCH_HEIGHT,d=b/3,e=d/3,f=c/2,g=f/2,h=a(1),k=a(-1);return{type:this.SHAPES.NOTCH,width:b,height:c,pathLeft:h,pathRight:k}}; +Blockly.zelos.ConstantProvider.prototype.makeInsideCorners=function(){var a=this.CORNER_RADIUS,b=Blockly.utils.svgPaths.arc("a","0 0,0",a,Blockly.utils.svgPaths.point(-a,a)),c=Blockly.utils.svgPaths.arc("a","0 0,1",a,Blockly.utils.svgPaths.point(-a,a)),d=Blockly.utils.svgPaths.arc("a","0 0,0",a,Blockly.utils.svgPaths.point(a,a)),e=Blockly.utils.svgPaths.arc("a","0 0,1",a,Blockly.utils.svgPaths.point(a,a));return{width:a,height:a,pathTop:b,pathBottom:d,rightWidth:a,rightHeight:a,pathTopRight:c,pathBottomRight:e}}; +Blockly.zelos.ConstantProvider.prototype.generateSecondaryColour_=function(a){return Blockly.utils.colour.blend("#000",a,.15)||a};Blockly.zelos.ConstantProvider.prototype.generateTertiaryColour_=function(a){return Blockly.utils.colour.blend("#000",a,.25)||a}; +Blockly.zelos.ConstantProvider.prototype.createDom=function(a,b,c){Blockly.zelos.ConstantProvider.superClass_.createDom.call(this,a,b,c);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.DEFS,{},a);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FILTER,{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},b);c= +Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},c);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFLOOD,{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},b);this.selectedGlowFilterId= +b.id;this.selectedGlowFilter_=b;a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FILTER,{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},a);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFUNCA,{type:"table", +tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFLOOD,{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"SourceGraphic",in2:"outGlow",operator:"over"},a);this.replacementGlowFilterId=a.id;this.replacementGlowFilter_= +a}; +Blockly.zelos.ConstantProvider.prototype.getCSS_=function(a){return[a+" .blocklyText,",a+" .blocklyFlyoutLabelText {","font: "+this.FIELD_TEXT_FONTWEIGHT+" "+this.FIELD_TEXT_FONTSIZE+"pt "+this.FIELD_TEXT_FONTFAMILY+";","}",a+" .blocklyText {","fill: #fff;","}",a+" .blocklyNonEditableText>rect: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+" .blocklyFlyoutLabelText {","fill: #575E75;","}",a+" .blocklyText.blocklyBubbleText {","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: "+this.SELECTED_GLOW_COLOUR+";","}",a+" .blocklyDisabled > .blocklyOutlinePath {","fill: url(#blocklyDisabledPattern"+this.randomIdentifier+")","}",a+" .blocklyInsertionMarker>.blocklyPath {", +"fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};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&&!a.statementInputCount&&!a.nextConnection};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&&!a.statementInputCount&&!a.nextConnection};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.hasStatementInput=0=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))&&fc?c:this.height/2,b-c*(1-Math.sin(Math.acos((c-this.constants_.SMALL_PADDING)/c)));default:return 0}if(Blockly.blockRendering.Types.isInlineInput(a)){var e=a.connectedBlock;a=e?e.pathObject.outputShapeType: +a.shape.type;return e&&e.outputConnection&&(e.statementInputCount||e.nextConnection)||c==d.SHAPES.HEXAGONAL&&c!=a?0:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][a]}return Blockly.blockRendering.Types.isField(a)?c==d.SHAPES.ROUND&&a.field instanceof Blockly.FieldTextInput?b-2.75*d.GRID_UNIT:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][0]:Blockly.blockRendering.Types.isIcon(a)?this.constants_.SMALL_PADDING:0}; +Blockly.zelos.RenderInfo.prototype.finalizeVerticalAlignment_=function(){if(!this.outputConnection)for(var a=2;a=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);this.rightSide&&(this.widthWithChildren+=this.rightSide.width)};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.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):Blockly.zelos.Drawer.superClass_.drawOutline_.call(this)}; +Blockly.zelos.Drawer.prototype.drawLeft_=function(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?this.drawLeftDynamicConnection_():Blockly.zelos.Drawer.superClass_.drawLeft_.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/static/js/blocks/colour.js b/static/js/blocks/colour.js new file mode 100644 index 0000000..9ab3acb --- /dev/null +++ b/static/js/blocks/colour.js @@ -0,0 +1,122 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/blocks/lists.js b/static/js/blocks/lists.js new file mode 100644 index 0000000..37c53ee --- /dev/null +++ b/static/js/blocks/lists.js @@ -0,0 +1,862 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 && !itemBlock.isInsertionMarker()) { + 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) + .setAlign(Blockly.ALIGN_RIGHT); + 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/static/js/blocks/logic.js b/static/js/blocks/logic.js new file mode 100644 index 0000000..c45089d --- /dev/null +++ b/static/js/blocks/logic.js @@ -0,0 +1,635 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 && !clauseBlock.isInsertionMarker()) { + 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 && + !this.workspace.connectionChecker.doTypeChecks( + blockA.outputConnection, 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.workspace.connectionChecker.doTypeChecks( + block.outputConnection, 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/static/js/blocks/loops.js b/static/js/blocks/loops.js new file mode 100644 index 0000000..772871d --- /dev/null +++ b/static/js/blocks/loops.js @@ -0,0 +1,356 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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) { + // Don't change state if: + // * It's at the start of a drag. + // * It's not a move event. + if (!this.workspace.isDragging || this.workspace.isDragging() || + e.type != Blockly.Events.BLOCK_MOVE) { + return; + } + var enabled = Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN + .getSurroundLoop(this); + this.setWarningText(enabled ? null : + Blockly.Msg['CONTROLS_FLOW_STATEMENTS_WARNING']); + if (!this.isInFlyout) { + var group = Blockly.Events.getGroup(); + // Makes it so the move and the disable event get undone together. + Blockly.Events.setGroup(e.group); + this.setEnabled(enabled); + Blockly.Events.setGroup(group); + } + } +}; + +Blockly.Extensions.registerMixin('controls_flow_in_loop_check', + Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN); diff --git a/static/js/blocks/math.js b/static/js/blocks/math.js new file mode 100644 index 0000000..b6827c5 --- /dev/null +++ b/static/js/blocks/math.js @@ -0,0 +1,566 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 "divisible 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/static/js/blocks/procedures.js b/static/js/blocks/procedures.js new file mode 100644 index 0000000..242fa4f --- /dev/null +++ b/static/js/blocks/procedures.js @@ -0,0 +1,1080 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 initName = Blockly.Procedures.findLegalName('', this); + var nameField = new Blockly.FieldTextInput(initName, + 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 && !paramBlock.isInsertionMarker()) { + 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 initName = Blockly.Procedures.findLegalName('', this); + var nameField = new Blockly.FieldTextInput(initName, + 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); + var caselessName = varName.toLowerCase(); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].id == this.getSourceBlock().id) { + continue; + } + // Other blocks values may not be set yet when this is loaded. + var otherVar = blocks[i].getFieldValue('NAME'); + if (otherVar && otherVar.toLowerCase() == caselessName) { + 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('', '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 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_; + }, + /** + * 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.getVars()) != 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'); + var callName = this.getProcedureCall(); + if (!callName) { + // Rename if name is empty string. + callName = Blockly.Procedures.findLegalName('', this); + this.renameProcedure('', callName); + } + field.appendChild(Blockly.utils.xml.createTextNode(callName)); + 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 programmatically 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.argumentVarModels_ = []; + 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, + getVars: Blockly.Blocks['procedures_callnoreturn'].getVars, + 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/static/js/blocks/text.js b/static/js/blocks/text.js new file mode 100644 index 0000000..9e806be --- /dev/null +++ b/static/js/blocks/text.js @@ -0,0 +1,923 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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, 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); + } + // 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 && !itemBlock.isInsertionMarker()) { + 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) + .setAlign(Blockly.ALIGN_RIGHT); + 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/static/js/blocks/variables.js b/static/js/blocks/variables.js new file mode 100644 index 0000000..65967f9 --- /dev/null +++ b/static/js/blocks/variables.js @@ -0,0 +1,163 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/blocks/variables_dynamic.js b/static/js/blocks/variables_dynamic.js new file mode 100644 index 0000000..de9a364 --- /dev/null +++ b/static/js/blocks/variables_dynamic.js @@ -0,0 +1,180 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/blocks_ML.js b/static/js/blocks_ML.js new file mode 100644 index 0000000..4d8beeb --- /dev/null +++ b/static/js/blocks_ML.js @@ -0,0 +1,3461 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +(function (root, factory) { + if (typeof define === "function" && define.amd) { + // AMD + define(["./blockly_compressed.js"], factory); + } else if (typeof exports === "object") { + // Node.js + module.exports = factory(require("./blockly_compressed.js")); + } else { + // Browser + root.Blockly.Blocks = factory(root.Blockly); + } +})(this, function (Blockly) { + "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, d = 0; d < this.itemCount_; d++) { + var e = a.newBlock("lists_create_with_item"); + e.initSvg(); + c.connect(e.previousConnection); + c = e.nextConnection; + } + return b; + }, + compose: function (a) { + var b = a.getInputTargetBlock("STACK"); + for (a = []; b && !b.isInsertionMarker();) a.push(b.valueConnection_), (b = b.nextConnection && b.nextConnection.targetBlock()); + for (b = 0; b < this.itemCount_; b++) { + var c = this.getInput("ADD" + b).connection.targetConnection; + c && -1 == a.indexOf(c) && c.disconnect(); + } + this.itemCount_ = a.length; + this.updateShape_(); + for (b = 0; b < this.itemCount_; b++) Blockly.Mutator.reconnect(a[b], this, "ADD" + b); + }, + saveConnections: function (a) { + a = a.getInputTargetBlock("STACK"); + for (var b = 0; a;) { + var c = this.getInput("ADD" + b); + a.valueConnection_ = c && c.connection.targetConnection; + b++; + a = a.nextConnection && a.nextConnection.targetBlock(); + } + }, + updateShape_: function () { + this.itemCount_ && this.getInput("EMPTY") ? this.removeInput("EMPTY") : this.itemCount_ || this.getInput("EMPTY") || this.appendDummyInput("EMPTY").appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE); + for (var a = 0; a < this.itemCount_; a++) + if (!this.getInput("ADD" + a)) { + var b = this.appendValueInput("ADD" + a).setAlign(Blockly.ALIGN_RIGHT); + 0 == a && b.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH); + } + for (; this.getInput("ADD" + a);) this.removeInput("ADD" + a), a++; + }, + }; + + Blockly.Blocks.lists_create_with_container = { + init: function () { + this.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 = !1; + }, + }; + Blockly.Blocks.lists_create_with_item = { + init: function () { + this.setStyle("list_blocks"); + this.appendDummyInput().appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(!0); + this.setNextStatement(!0); + this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = !1; + }, + }; + Blockly.Blocks.lists_indexOf = { + init: function () { + var a = [ + [Blockly.Msg.LISTS_INDEX_OF_FIRST, "FIRST"], + [Blockly.Msg.LISTS_INDEX_OF_LAST, "LAST"], + ]; + this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL); + this.setStyle("list_blocks"); + this.setOutput(!0, "Number"); + this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST); + this.appendValueInput("FIND").appendField(new Blockly.FieldDropdown(a), "END"); + this.setInputsInline(!0); + var b = this; + this.setTooltip(function () { + return Blockly.Msg.LISTS_INDEX_OF_TOOLTIP.replace("%1", b.workspace.options.oneBasedIndex ? "0" : "-1"); + }); + }, + }; + Blockly.Blocks.lists_getIndex = { + init: function () { + var a = [ + [Blockly.Msg.LISTS_GET_INDEX_GET, "GET"], + [Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE, "GET_REMOVE"], + [Blockly.Msg.LISTS_GET_INDEX_REMOVE, "REMOVE"], + ]; + this.WHERE_OPTIONS = [ + [Blockly.Msg.LISTS_GET_INDEX_FROM_START, "FROM_START"], + [Blockly.Msg.LISTS_GET_INDEX_FROM_END, "FROM_END"], + [Blockly.Msg.LISTS_GET_INDEX_FIRST, "FIRST"], + [Blockly.Msg.LISTS_GET_INDEX_LAST, "LAST"], + [Blockly.Msg.LISTS_GET_INDEX_RANDOM, "RANDOM"], + ]; + this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL); + this.setStyle("list_blocks"); + a = new Blockly.FieldDropdown(a, function (c) { + c = "REMOVE" == c; + this.getSourceBlock().updateStatement_(c); + }); + this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST); + this.appendDummyInput().appendField(a, "MODE").appendField("", "SPACE"); + this.appendDummyInput("AT"); + Blockly.Msg.LISTS_GET_INDEX_TAIL && this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL); + this.setInputsInline(!0); + this.setOutput(!0); + this.updateAt_(!0); + var b = this; + this.setTooltip(function () { + var c = b.getFieldValue("MODE"), + d = b.getFieldValue("WHERE"), + e = ""; + switch (c + " " + d) { + case "GET FROM_START": + case "GET FROM_END": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM; + break; + case "GET FIRST": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST; + break; + case "GET LAST": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST; + break; + case "GET RANDOM": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM; + break; + case "GET_REMOVE FROM_START": + case "GET_REMOVE FROM_END": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM; + break; + case "GET_REMOVE FIRST": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST; + break; + case "GET_REMOVE LAST": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST; + break; + case "GET_REMOVE RANDOM": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM; + break; + case "REMOVE FROM_START": + case "REMOVE FROM_END": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM; + break; + case "REMOVE FIRST": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST; + break; + case "REMOVE LAST": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST; + break; + case "REMOVE RANDOM": + e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM; + } + if ("FROM_START" == d || "FROM_END" == d) + e += " " + ("FROM_START" == d ? Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP : Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP).replace("%1", b.workspace.options.oneBasedIndex ? "#1" : "#0"); + return e; + }); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"); + a.setAttribute("statement", !this.outputConnection); + var b = this.getInput("AT").type == Blockly.INPUT_VALUE; + a.setAttribute("at", b); + return a; + }, + domToMutation: function (a) { + var b = "true" == a.getAttribute("statement"); + this.updateStatement_(b); + a = "false" != a.getAttribute("at"); + this.updateAt_(a); + }, + updateStatement_: function (a) { + a != !this.outputConnection && (this.unplug(!0, !0), a ? (this.setOutput(!1), this.setPreviousStatement(!0), this.setNextStatement(!0)) : (this.setPreviousStatement(!1), this.setNextStatement(!1), this.setOutput(!0))); + }, + updateAt_: function (a) { + this.removeInput("AT"); + this.removeInput("ORDINAL", !0); + a ? (this.appendValueInput("AT").setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT"); + var b = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function (c) { + var d = "FROM_START" == c || "FROM_END" == c; + if (d != a) { + var e = this.getSourceBlock(); + e.updateAt_(d); + e.setFieldValue(c, "WHERE"); + return null; + } + }); + this.getInput("AT").appendField(b, "WHERE"); + Blockly.Msg.LISTS_GET_INDEX_TAIL && this.moveInputBefore("TAIL", null); + }, + }; + Blockly.Blocks.lists_setIndex = { + init: function () { + var a = [ + [Blockly.Msg.LISTS_SET_INDEX_SET, "SET"], + [Blockly.Msg.LISTS_SET_INDEX_INSERT, "INSERT"], + ]; + this.WHERE_OPTIONS = [ + [Blockly.Msg.LISTS_GET_INDEX_FROM_START, "FROM_START"], + [Blockly.Msg.LISTS_GET_INDEX_FROM_END, "FROM_END"], + [Blockly.Msg.LISTS_GET_INDEX_FIRST, "FIRST"], + [Blockly.Msg.LISTS_GET_INDEX_LAST, "LAST"], + [Blockly.Msg.LISTS_GET_INDEX_RANDOM, "RANDOM"], + ]; + this.setHelpUrl(Blockly.Msg.LISTS_SET_INDEX_HELPURL); + this.setStyle("list_blocks"); + this.appendValueInput("LIST").setCheck("Array").appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST); + this.appendDummyInput().appendField(new Blockly.FieldDropdown(a), "MODE").appendField("", "SPACE"); + this.appendDummyInput("AT"); + this.appendValueInput("TO").appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_TO); + this.setInputsInline(!0); + this.setPreviousStatement(!0); + this.setNextStatement(!0); + this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_TOOLTIP); + this.updateAt_(!0); + var b = this; + this.setTooltip(function () { + var c = b.getFieldValue("MODE"), + d = b.getFieldValue("WHERE"), + e = ""; + switch (c + " " + d) { + case "SET FROM_START": + case "SET FROM_END": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM; + break; + case "SET FIRST": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST; + break; + case "SET LAST": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST; + break; + case "SET RANDOM": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM; + break; + case "INSERT FROM_START": + case "INSERT FROM_END": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM; + break; + case "INSERT FIRST": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST; + break; + case "INSERT LAST": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST; + break; + case "INSERT RANDOM": + e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM; + } + if ("FROM_START" == d || "FROM_END" == d) e += " " + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1", b.workspace.options.oneBasedIndex ? "#1" : "#0"); + return e; + }); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"), + b = this.getInput("AT").type == Blockly.INPUT_VALUE; + a.setAttribute("at", b); + return a; + }, + domToMutation: function (a) { + a = "false" != a.getAttribute("at"); + this.updateAt_(a); + }, + updateAt_: function (a) { + this.removeInput("AT"); + this.removeInput("ORDINAL", !0); + a ? (this.appendValueInput("AT").setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT"); + var b = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function (c) { + var d = "FROM_START" == c || "FROM_END" == c; + if (d != a) { + var e = this.getSourceBlock(); + e.updateAt_(d); + e.setFieldValue(c, "WHERE"); + return null; + } + }); + this.moveInputBefore("AT", "TO"); + this.getInput("ORDINAL") && this.moveInputBefore("ORDINAL", "TO"); + this.getInput("AT").appendField(b, "WHERE"); + }, + }; + Blockly.Blocks.lists_getSublist = { + init: function () { + this.WHERE_OPTIONS_1 = [ + [Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START, "FROM_START"], + [Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END, "FROM_END"], + [Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST, "FIRST"], + ]; + this.WHERE_OPTIONS_2 = [ + [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START, "FROM_START"], + [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END, "FROM_END"], + [Blockly.Msg.LISTS_GET_SUBLIST_END_LAST, "LAST"], + ]; + this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setStyle("list_blocks"); + this.appendValueInput("LIST").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST); + this.appendDummyInput("AT1"); + this.appendDummyInput("AT2"); + Blockly.Msg.LISTS_GET_SUBLIST_TAIL && this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL); + this.setInputsInline(!0); + this.setOutput(!0, "Array"); + this.updateAt_(1, !0); + this.updateAt_(2, !0); + this.setTooltip(Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"), + b = this.getInput("AT1").type == Blockly.INPUT_VALUE; + a.setAttribute("at1", b); + b = this.getInput("AT2").type == Blockly.INPUT_VALUE; + a.setAttribute("at2", b); + return a; + }, + domToMutation: function (a) { + var b = "true" == a.getAttribute("at1"); + a = "true" == a.getAttribute("at2"); + this.updateAt_(1, b); + this.updateAt_(2, a); + }, + updateAt_: function (a, b) { + this.removeInput("AT" + a); + this.removeInput("ORDINAL" + a, !0); + b ? (this.appendValueInput("AT" + a).setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL" + a).appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT" + a); + var c = new Blockly.FieldDropdown(this["WHERE_OPTIONS_" + a], function (d) { + var e = "FROM_START" == d || "FROM_END" == d; + if (e != b) { + var f = this.getSourceBlock(); + f.updateAt_(a, e); + f.setFieldValue(d, "WHERE" + a); + return null; + } + }); + this.getInput("AT" + a).appendField(c, "WHERE" + a); + 1 == a && (this.moveInputBefore("AT1", "AT2"), this.getInput("ORDINAL1") && this.moveInputBefore("ORDINAL1", "AT2")); + Blockly.Msg.LISTS_GET_SUBLIST_TAIL && this.moveInputBefore("TAIL", null); + }, + }; + Blockly.Blocks.lists_sort = { + init: function () { + this.jsonInit({ + message0: Blockly.Msg.LISTS_SORT_TITLE, + args0: [ + { + type: "field_dropdown", + name: "TYPE", + options: [ + [Blockly.Msg.LISTS_SORT_TYPE_NUMERIC, "NUMERIC"], + [Blockly.Msg.LISTS_SORT_TYPE_TEXT, "TEXT"], + [Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE, "IGNORE_CASE"], + ], + }, + { + type: "field_dropdown", + name: "DIRECTION", + options: [ + [Blockly.Msg.LISTS_SORT_ORDER_ASCENDING, "1"], + [Blockly.Msg.LISTS_SORT_ORDER_DESCENDING, "-1"], + ], + }, + { type: "input_value", name: "LIST", check: "Array" }, + ], + output: "Array", + style: "list_blocks", + tooltip: Blockly.Msg.LISTS_SORT_TOOLTIP, + helpUrl: Blockly.Msg.LISTS_SORT_HELPURL, + }); + }, + }; + Blockly.Blocks.lists_split = { + init: function () { + var a = this, + b = new Blockly.FieldDropdown( + [ + [Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT, "SPLIT"], + [Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST, "JOIN"], + ], + function (c) { + a.updateType_(c); + } + ); + this.setHelpUrl(Blockly.Msg.LISTS_SPLIT_HELPURL); + this.setStyle("list_blocks"); + this.appendValueInput("INPUT").setCheck("String").appendField(b, "MODE"); + this.appendValueInput("DELIM").setCheck("String").appendField(Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER); + this.setInputsInline(!0); + this.setOutput(!0, "Array"); + this.setTooltip(function () { + var c = a.getFieldValue("MODE"); + if ("SPLIT" == c) return Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT; + if ("JOIN" == c) return Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN; + throw Error("Unknown mode: " + c); + }); + }, + updateType_: function (a) { + if (this.getFieldValue("MODE") != a) { + var b = this.getInput("INPUT").connection; + b.setShadowDom(null); + var c = b.targetBlock(); + c && (b.disconnect(), c.isShadow() ? c.dispose() : this.bumpNeighbours()); + } + "SPLIT" == a ? (this.outputConnection.setCheck("Array"), this.getInput("INPUT").setCheck("String")) : (this.outputConnection.setCheck("String"), this.getInput("INPUT").setCheck("Array")); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"); + a.setAttribute("mode", this.getFieldValue("MODE")); + return a; + }, + domToMutation: function (a) { + this.updateType_(a.getAttribute("mode")); + }, + }; + Blockly.Blocks.logic = {}; + Blockly.Constants.Logic = {}; + Blockly.Constants.Logic.HUE = 210; + Blockly.defineBlocksWithJsonArray([ + { + 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}", + }, + { + 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"], + }, + { + 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"], + }, + { + 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: !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, d = 1; d <= this.elseifCount_; d++) { + var e = a.newBlock("controls_if_elseif"); + e.initSvg(); + c.connect(e.previousConnection); + c = e.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], d = null; a && !a.isInsertionMarker();) { + switch (a.type) { + case "controls_if_elseif": + this.elseifCount_++; + b.push(a.valueConnection_); + c.push(a.statementConnection_); + break; + case "controls_if_else": + this.elseCount_++; + d = a.statementConnection_; + break; + default: + throw TypeError("Unknown block type: " + a.type); + } + a = a.nextConnection && a.nextConnection.targetBlock(); + } + this.updateShape_(); + this.reconnectChildBlocks_(b, c, d); + }, + 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), + d = this.getInput("DO" + b); + a.valueConnection_ = c && c.connection.targetConnection; + a.statementConnection_ = d && d.connection.targetConnection; + b++; + break; + case "controls_if_else": + d = this.getInput("ELSE"); + a.statementConnection_ = d && d.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 d = 1; this.getInput("IF" + d);) { + var e = this.getInput("IF" + d), + f = this.getInput("DO" + d); + a.push(e.connection.targetConnection); + b.push(f.connection.targetConnection); + d++; + } + 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 d = 1; d <= this.elseifCount_; d++) Blockly.Mutator.reconnect(a[d], this, "IF" + d), Blockly.Mutator.reconnect(b[d], this, "DO" + d); + 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 && + !this.workspace.connectionChecker.doTypeChecks(b.outputConnection, 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"), + d = this.outputConnection.targetConnection; + if ((b || c) && d) + for (var e = 0; 2 > e; e++) { + var f = 1 == e ? b : c; + f && + !f.workspace.connectionChecker.doTypeChecks(f.outputConnection, d) && + (Blockly.Events.setGroup(a.group), d === this.prevParentConnection_ ? (this.unplug(), d.getSourceBlock().bumpNeighbours()) : (f.unplug(), f.bumpNeighbours()), Blockly.Events.setGroup(!1)); + } + this.prevParentConnection_ = d; + }, + }; + 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 d = { enabled: !0 }; + d.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); + d.callback = Blockly.ContextMenu.callbackFactory(this, c); + a.push(d); + } + } + }, + }; + 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) { + if (this.workspace.isDragging && !this.workspace.isDragging() && a.type == Blockly.Events.BLOCK_MOVE) { + var b = Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(this); + this.setWarningText(b ? null : Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); + if (!this.isInFlyout) { + var c = Blockly.Events.getGroup(); + Blockly.Events.setGroup(a.group); + this.setEnabled(b); + Blockly.Events.setGroup(c); + } + } + }, + }; + /* + * Custom + */ + + /* + * pycaret + */ + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_setup", + colour: 0, + previousStatement: null, + nextStatement: null, + message0: "Setup()", + message1: "Input Dataset %1", + args1: [ + { + type: "input_value", + name: "input_data", + check: "DataFrame" + }], + message2: "Target Column %1", + args2: [ + { + type: "input_value", + name: "input_column", + check: "String" + }], + message3: "Algorithm Type Column %1", + args3: [ + { + type: "field_dropdown", + name: "algorithm", + options: [ + ["Classification", "Classification"], + ["Regression", "Regression"] + ], + }], + inputsInline: 0 + } + ]) + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_predict", + colour: 0, + output: "DataFrame", + message0: "Predict()", + message1: "Model %1", + args1: [ + { + type: "input_value", + check: "pycaret_model", + name: "input_model", + + }], + message2: "Data %1", + args2: [ + { + type: "input_value", + check: "DataFrame", + name: "input_data", + + }], + inputsInline: 0 + } + ]) + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_save", + colour: 0, + previousStatement: null, + nextStatement: null, + message0: "Save()", + message1: "Model %1", + args1: [ + { + type: "input_value", + check: "Pycaret_Model", + name: "input_model", + + }], + message2: "Name %1", + args2: [ + { + type: "input_value", + check: "String", + name: "input_data", + + }], + inputsInline: 0 + } + ]) + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_plot_model", + colour: 0, + previousStatement: null, + nextStatement: null, + message0: "Plot()", + message1: "Model %1", + args1: [ + { + type: "input_value", + check: "Pycaret_Model", + name: "input_model", + + }], + message2: "Plot %1", + args2: [ + { + type: "field_dropdown", + name: "plot_data", + options: [ + ["Area Under the Curve", "auc"], + ["Discrimination Threshold", "threshold"], + ["Precision Recall Curve", "pr"], + ["Confusion Matrix", "confusion_matrix"], + ["Class Prediction Error", "error"], + ["Classification Report", "class_report"], + ["Decision Boundary", "boundary"], + ["Recursive Feature Selection", "rfe"], + ["Learning Curve", "learning"], + ["Manifold Learning", "manifold"], + ["Calibration Curve", "calibration"], + ["Validation Curve", "vc"], + ["Dimension Learning", "dimension"], + ["Feature Importance (Top 10)", "feature"], + ["Feature IImportance (all)", "feature_all"], + ["Model Hyperparameter", "parameter"], + ["Lift Curve", "lift"], + ["Gain Curve", "gain"], + ["KS Statistic Plot", "ks"], + + + ["Residuals Plot", "residuals"], + ["Cooks Distance Plot", "cooks"], + ], + }], + inputsInline: 0 + } + ]) + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_load", + colour: 0, + output: "Pycaret_Model", + message0: "Load()", + message1: "Name %1", + args1: [ + { + type: "input_value", + check: "String", + name: "input_data", + + }], + inputsInline: 0 + } + ]) + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_blend_model", + colour: 0, + output: "Pycaret_Model", + message0: "Blend Models()", + message1: "List of Models %1", + args1: [ + { + type: "input_value", + check: "Array", + name: "input_models", + + }], + message2: "Fold %1", + args2: [ + { + type: "input_value", + check: "Number", + name: "input_fold", + + }], + message3: "method %1", + args3: [ + { + type: "field_dropdown", + name: "input_method", + options: [ + ["Soft", "soft"], + ["Hard", "hard"], + ] + + }], + inputsInline: 0 + } + ]) + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_ensemble_model", + colour: 0, + output: "Pycaret_Model", + message0: "Ensemble Models()", + message1: "Input Model %1", + args1: [ + { + type: "input_value", + check: "Pycaret_Model", + name: "input_models", + + }], + message2: "Fold %1", + args2: [ + { + type: "input_value", + check: "Number", + name: "input_fold", + + }], + message3: "method %1", + args3: [ + { + type: "field_dropdown", + name: "input_method", + options: [ + ["Boosting", "Boosting"], + ["Bagging", "Bagging"], + ] + + }], + inputsInline: 0 + } + ]) + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_automl", + colour: 0, + output: "Pycaret_Model", + message0: "AutoML()", + message1: "Optimizer %1", + args1: [ + { + type: "field_dropdown", + name: "optimizer", + options: [ + ["Accuracy", "Accuracy"], + ["AUC", "AUC"], + ["Recall", "Recall"], + ["Precision", "Precision"], + ["F1", "F1"], + ["Kappa", "Kappa"], + ["MCC", "MCC"], + ["MAE", "MAE"], + ["MSE", "MSE"], + ["RMSE", "RMSE"], + ["R2", "R2"], + ["RMSLE", "RMSLE"], + ["MAPE", "MAPE"], + ], + }], + inputsInline: 0 + } + ]) + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_classifier", + colour: 0, + output: "Pycaret_Model", + message0: "Classifier()", + message1: "Algorithm %1", + args1: [ + { + type: "field_dropdown", + name: "model", + options: [ + ["Logistic Regression", "lr"], + ["K Nearest Neighbour", "knn"], + ["Naives Bayes", "nb"], + ["Decision Tree Classifier", "dt"], + ["SVM – Linear Kernel", "svm"], + ["SVM – Radial Kernel", "rbfsvm"], + ["Gaussian Process Classifier", "gpc"], + ["Multi Level Perceptron", "mlp"], + ["Ridge Classifier", "ridge"], + ["Random Forest Classifier", "rf"], + ["Quadratic Discriminant Analysis", "qda"], + ["Ada Boost Classifier", "ada"], + ["Gradient Boosting Classifier", "gbc"], + ["Linear Discriminant Analysis", "lda"], + ["Extra Trees Classifier", "et"], + ["Extreme Gradient Boosting", "xgboost"], + ["Light Gradient Boosting", "lightgbm"], + ["CatBoost Classifier", "catboost"], + ], + } + ], + }]) + + Blockly.defineBlocksWithJsonArray([ + { + type: "pycaret_regressor", + output: "Pycaret_Model", + colour: 0, + message0: "Regression()", + message1: "Algorithm %1", + args1: [ + { + type: "field_dropdown", + name: "model", + options: [ + ["Linear Regression", "lr"], + ["Lasso Regression", "lasso"], + ["Ridge Regression", "ridge"], + ["Elastic Net", "en"], + ["Least Angle Regression", "lar"], + ["Lasso Least Angle Regression", "llar"], + ["Orthogonal Matching Pursuit", "omp"], + ["Bayesian Ridge", "br"], + ["Automatic Relevance Determination", "ard"], + ["Passive Aggressive Regressor", "par"], + ["Random Sample Consensus", "ransac"], + ["TheilSen Regressor", "tr"], + ["Huber Regressor", "huber"], + ["Kernel Ridge", "kr"], + ["Support Vector Machine", "svm"], + ["K Neighbors Regressor", "knn"], + ["Decision Tree", "dt"], + ["Random Forest", "rf"], + ["Extra Trees Regressor", "et"], + ["AdaBoost Regressor", "gbr"], + ["Gradient Boosting Regressor", "gbr"], + ["Multi Level Perceptron", "mlp"], + ["Extreme Gradient Boosting", "xgboost"], + ["Light Gradient Boosting", "lightgbm"], + ["CatBoost Regressor", "catboost"], + ], + } + ] + }]) + + /* + * pycaret end + */ + /* + * pandas start + */ + Blockly.defineBlocksWithJsonArray([ + { + type: "pandas_set_columns", + message0: "Add Column to DataFrame ", + message1: "Columns to Set %1 ", + previousStatement: null, + nextStatement: null, + tooltip: "Select columns mentioned in the list form pandas dataframe", + setHelpUrl: "https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html", + + args1: [ + { + type: "input_value", + name: "COLUMN", + check: ["String", "Array"] + }], + message2: "Input Dataframe %1", + args2: [ + { + type: "input_value", + name: "DATAFRAME_IN", + check: "DataFrame" + }], + message3: "Output Dataframe %1", + args3: [ + { + type: "input_value", + name: "DATAFRAME_OUT", + check: "DataFrame" + }] + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "dataframe_Filter", + message0: "DataFrame Filter \n %1 %2 %3 Apply to %4", + 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" }, + { type: "input_value", name: "C" }, + ], + inputsInline: !0, + output: "DataFrame", + } + ]); + + + Blockly.defineBlocksWithJsonArray([ + { + type: "dataframe_Map", + message0: "DataFrame Map \n %1 Apply to %2", + args0: [ + { type: "input_value", name: "Map", check: "DICT" }, + { type: "input_value", name: "Series", check: "DataFrameSeries" }, + ], + inputsInline: !0, + output: ["DataFrame", "DataFrameSeries"], + } + ]); + + + Blockly.Blocks['pandas_read_csv'] = { + init: function () { + this.appendValueInput('VALUE') + .setCheck(['String']) + .appendField('Read DataFrame'); + this.setOutput(true, 'DataFrame'); + this.setTooltip('Read CSV from Url or path'); + this.setHelpUrl('https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html'); + } + }; + + Blockly.defineBlocksWithJsonArray([ + { + type: "skl_train_test_split", + tooltip: "Scikit learn test train split, X will be input and Y will be the target to Train ML model", + setHelpUrl: "https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html", + + previousStatement: null, + nextStatement: null, + message0: "Train Test Split", + + message1: "%1 %2 %3 %4 = %5", + args1: [ + { type: "field_variable", name: "VAR", variable: "train_X" }, + { type: "field_variable", name: "VAR1", variable: "test_X" }, + { type: "field_variable", name: "VAR2", variable: "train_Y" }, + { type: "field_variable", name: "VAR3", variable: "test_Y" }, + { type: "input_value", name: "DATAFRAME", variable: "%{BKY_VARIABLES_DEFAULT_NAME}", check: "DataFrame" }, + + ], + extensions: ["contextMenu_variableSetterGetter"], + message2: "Test Size %1 ", + args2: [ + { + type: "input_value", + name: "TESTSIZE", + check: "Number" + }], + message3: " Target Variable %1", + args3: [ + { + type: "input_value", + name: "TARGETVAR", + check: ["String", "Array"] + }], + message4: " Handle Missing Values %1", + args4: [ + { + type: "field_dropdown", + name: "SPLIT", + options: [["Delete", "dropNa"]] + }], + inputsInline: 0 + } + + ]); + + + Blockly.defineBlocksWithJsonArray([ + { + type: "pandas_select_columns", + message0: "Select DataFrame Columns ", + message1: "Columns to Select %1 ", + tooltip: "Select columns mentioned in the list form pandas dataframe", + setHelpUrl: "https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html", + + args1: [ + { + type: "input_value", + name: "COLUMN", + check: ["String", "Array"], + value: 0 + }], + message2: "Input Dataframe %1", + args2: [ + { + type: "input_value", + name: "DATAFRAME", + check: "DataFrame", + value: 0 + }], + output: ["DataFrame", "DataFrameSeries"] + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "pandas_sample", + message0: "Dataframe Sampling ", + message1: "Sample Factor %1 ", + tooltip: "Select columns mentioned in the list/string will be dropped pandas dataframe", + + args1: [ + { + type: "input_value", + name: "FACTOR", + check: "Number", + value: 0 + }], + message2: "Input Dataframe %1", + args2: [ + { + type: "input_value", + name: "DATAFRAME", + check: "DataFrame", + value: 0 + }], + output: "DataFrame" + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "pandas_drop_columns", + message0: "Dataframe Drop Columns ", + message1: "Columns to Drop %1 ", + tooltip: "Select columns mentioned in the list/string will be dropped pandas dataframe", + + args1: [ + { + type: "input_value", + name: "COLUMN", + check: ["String", "Array"], + value: 0 + }], + message2: "Input Dataframe %1", + args2: [ + { + type: "input_value", + name: "DATAFRAME", + check: "DataFrame", + value: 0 + }], + output: ["DataFrame", "DataFrameSeries"] + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "create_dict", + + tooltip: "Create Dictionary", + setHelpUrl: "https://docs.python.org/3/tutorial/datastructures.html", + message0: "Create Dictionary", + mutator: "DICT_mutator", + output: "DICT" + } + ]); + + Blockly.Constants.Logic.DICT_Logic = { + elementcount_: 0, + suppressPrefixSuffix: !0, + mutationToDom: function () { + if (!this.elementcount_) return null; + var a = Blockly.utils.xml.createElement("mutation"); + this.elementcount_ && a.setAttribute("Element", this.elementcount_); + return a; + }, + domToMutation: function (a) { + this.elementcount_ = parseInt(a.getAttribute("Element"), 10) || 0; + this.rebuildShape_(); + }, + decompose: function (a) { + var b = a.newBlock("Control_DICT"); + b.initSvg(); + for (var c = b.nextConnection, d = 1; d <= this.elementcount_; d++) { + var e = a.newBlock("DICT_Element"); + e.initSvg(); + c.connect(e.previousConnection); + c = e.nextConnection; + } + return b; + }, + compose: function (a) { + a = a.nextConnection.targetBlock(); + this.elementcount_ = 0; + for (var b = [null], c = [null]; a && !a.isInsertionMarker();) { + switch (a.type) { + case "DICT_Element": + this.elementcount_++; + b.push(a.valueConnection_); + c.push(a.statementConnection_); + break; + default: + throw TypeError("Unknown block type: " + a.type); + } + a = a.nextConnection && a.nextConnection.targetBlock(); + } + this.updateShape_(); + this.reconnectChildBlocks_(b, c); + }, + saveConnections: function (a) { + a = a.nextConnection.targetBlock(); + for (var b = 1; a;) { + switch (a.type) { + case "DICT_Element": + var c = this.getInput("Key" + b), + d = this.getInput("Value" + b); + a.valueConnection_ = c && c.connection.targetConnection; + a.statementConnection_ = d && d.connection.targetConnection; + b++; + break; + default: + throw TypeError("Unknown block type: " + a.type); + } + a = a.nextConnection && a.nextConnection.targetBlock(); + } + }, + rebuildShape_: function () { + var e = [null], + f = [null]; + for (var d = 1; this.getInput("KEY" + d);) { + var h = this.getInput("KEY" + d), + i = this.getInput("VAL" + d); + + e.push(h.connection.targetConnection); + f.push(i.connection.targetConnection); + d++; + } + this.updateShape_(); + this.reconnectChildBlocks_(e, f); + }, + updateShape_: function () { + for (var a = 1; this.getInput("KEY" + a);) this.removeInput("KEY" + a), this.removeInput("VAL" + a), a++; + for (var a = 1; a <= this.elementcount_; a++) + this.appendValueInput("KEY" + a).appendField("Key"), + this.appendValueInput("VAL" + a).appendField("Value"); + }, + reconnectChildBlocks_: function (b, c) { + for (var d = 1; d <= this.elementcount_; d++) { + Blockly.Mutator.reconnect(b[d], this, "KEY" + d); + Blockly.Mutator.reconnect(c[d], this, "VAL" + d); + } + }, + }; + + Blockly.defineBlocksWithJsonArray([ + { type: "Control_DICT", message0: "Control_DICT", nextStatement: null, enableContextMenu: !1, style: "logic_blocks" }, + { type: "DICT_Element", message0: "Key : Value", previousStatement: null, nextStatement: null, enableContextMenu: !1, style: "logic_blocks" } + ]); + + Blockly.Extensions.registerMutator("DICT_mutator", Blockly.Constants.Logic.DICT_Logic, null, ["DICT_Element"]); + + + Blockly.defineBlocksWithJsonArray([ + { + type: "dict_append", + previousStatement: null, + nextStatement: null, + tooltip: "Add Key and Value Dictionary", + setHelpUrl: "https://docs.python.org/3/tutorial/datastructures.html", + message0: "Add Values to Dictionary", + message1: "Input Dictionary %1", + args1: [ + { + type: "input_value", + name: "DICTIONARY", + check: "DICT" + }], + + message2: "Key %1", + args2: [ + { + type: "input_value", + name: "KEY" + }], + message3: "Value %1", + args3: [ + { + type: "input_value", + name: "VALUE", + }] + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "Classification_Report", + output: "String", + message0: "Generate Classification Report", + message1: "Prediction %1", + args1: [ + { + type: "input_value", + name: "Pred", + check: "DataFrame" + }], + + message2: "Ground Truth %1", + args2: [ + { + type: "input_value", + name: "True", + check: "DataFrame" + }] + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "R2_Report", + output: "String", + message0: "Generate Regression R2 score", + message1: "Prediction %1", + args1: [ + { + type: "input_value", + name: "Pred", + check: "DataFrame" + }], + + message2: "Ground Truth %1", + args2: [ + { + type: "input_value", + name: "True", + check: "DataFrame" + }] + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "Print", + previousStatement: null, + nextStatement: null, + message0: "Print %1", + args0: [ + { type: "input_value", name: "INPUT" } + ], + message1: " End: %1", + args1: [ + { + type: "field_dropdown", + name: "END", + options: [["New Line", "newLine"], + ["Tab", "tab"], + ["Space", "space"], + ["Comma", "comma"]] + }], + inputsInline: 0 + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "Input", + message0: "Input %1", + args0: [ + { type: "input_value", name: "INPUT", check: "String" } + ], + output: "String" + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_XGBoost", + tooltip: "XGBoost Classification Algorithm", + setHelpUrl: "https://xgboost.readthedocs.io/en/latest/", + message0: "XGBoost", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "REG_LinearRegression", + tooltip: "Linear Regression Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html", + message0: "REG_LinearRegression", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "REG_XGBRegressor", + tooltip: "XGBRegressor Algorithm", + setHelpUrl: "https://xgboost.readthedocs.io/en/latest/python/python_api.html", + message0: "REG_XGBRegressor", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_LogisticRegression", + tooltip: "LogisticRegression Classification Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html", + message0: "Logistic Regression", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_NaiveBayes", + tooltip: "NaiveBayes Classification Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/naive_bayes.html", + message0: "Naive Bayes", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_KNN", + tooltip: "K nearest Neighbor Classification Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/neighbors.html", + message0: "K-Nearest Neighbours", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_DecisionTree", + tooltip: "Decision Tree Classification Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/tree.html", + message0: "Decision Tree", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_RandomForest", + tooltip: "RandomForestClassifier Classification Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html", + message0: "Random Forest", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + Blockly.defineBlocksWithJsonArray([ + { + type: "CLR_SVM", + tooltip: "Support Vector Machine Classification Algorithm", + setHelpUrl: "https://scikit-learn.org/stable/modules/svm.html", + message0: "Support Vector Machine", + style: "logic_blocks", + mutator: "CLR_mutator", + output: "Sklearn_Model" + } + ]); + Blockly.Constants.Logic.CLR_Logic = { + //elseifCount_ -> validCount_ + // elseCount_ -> parmCount_ + validCount_: 0, + parmCount_: 0, + trainCount_: 0, + testCount_: 0, + suppressPrefixSuffix: !0, + mutationToDom: function () { + if (!this.validCount_ && !this.parmCount_ && !this.trainCount_ && !this.testCount_) return null; + var a = Blockly.utils.xml.createElement("mutation"); + this.validCount_ && a.setAttribute("ValidData", this.validCount_); + this.parmCount_ && a.setAttribute("Params", 1); + this.trainCount_ && a.setAttribute("TrainData", this.trainCount_) + this.testCount_ && a.setAttribute("TestData", 1) + return a; + }, + domToMutation: function (a) { + this.validCount_ = parseInt(a.getAttribute("ValidData"), 10) || 0; + this.parmCount_ = parseInt(a.getAttribute("Params"), 10) || 0; + this.trainCount_ = parseInt(a.getAttribute("TrainData"), 10) || 0; + this.testCount_ = parseInt(a.getAttribute("TestData"), 10) || 0; + this.rebuildShape_(); + }, + decompose: function (a) { + var b = a.newBlock("Control_CLR"); + b.initSvg(); + for (var c = b.nextConnection, d = 1; d <= this.validCount_; d++) { + var e = a.newBlock("CLR_Valid"); + e.initSvg(); + c.connect(e.previousConnection); + c = e.nextConnection; + } + for (var c = b.nextConnection, d = 1; d <= this.trainCount_; d++) { + var e = a.newBlock("CLR_Train"); + e.initSvg(); + c.connect(e.previousConnection); + c = e.nextConnection; + } + this.parmCount_ && ((e = a.newBlock("CLR_Params")), e.initSvg(), c.connect(e.previousConnection), c = e.nextConnection); + this.testCount_ && ((e = a.newBlock("CLR_Test")), e.initSvg(), c.connect(e.previousConnection), c = e.nextConnection); + + return b; + }, + compose: function (a) { + a = a.nextConnection.targetBlock(); + this.parmCount_ = this.validCount_ = this.testCount_ = this.trainCount_ = 0; + for (var b = [null], c = [null], d = null, e = [null], f = [null], g = null; a && !a.isInsertionMarker();) { + switch (a.type) { + case "CLR_Valid": + this.validCount_++; + b.push(a.valueConnection_); + c.push(a.statementConnection_); + break; + case "CLR_Train": + this.trainCount_++; + e.push(a.valueConnection_); + f.push(a.statementConnection_); + break; + case "CLR_Params": + this.parmCount_++; + d = a.statementConnection_; + break; + case "CLR_Test": + this.testCount_++; + g = a.statementConnection_; + break; + default: + throw TypeError("Unknown block type: " + a.type); + } + a = a.nextConnection && a.nextConnection.targetBlock(); + } + this.updateShape_(); + this.reconnectChildBlocks_(b, c, d, e, f, g); + }, + saveConnections: function (a) { + a = a.nextConnection.targetBlock(); + for (var b = 1; a;) { + switch (a.type) { + case "CLR_Valid": + var c = this.getInput("X - Valid"), + d = this.getInput("y - Valid"); + a.valueConnection_ = c && c.connection.targetConnection; + a.statementConnection_ = d && d.connection.targetConnection; + b++; + break; + case "CLR_Train": + var c = this.getInput("X - Train"), + d = this.getInput("y - Train"); + a.valueConnection_ = c && c.connection.targetConnection; + a.statementConnection_ = d && d.connection.targetConnection; + b++; + break; + case "CLR_Params": + var d = this.getInput("Control Parameters"); + a.statementConnection_ = d && d.connection.targetConnection; + break; + case "CLR_Test": + var d = this.getInput("X - Test"); + a.statementConnection_ = d && d.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, + e = [null], + f = [null], + g = null; + this.getInput("PARAMS") && (c = this.getInput("PARAMS").connection.targetConnection); + this.getInput("XTEST") && (g = this.getInput("XTEST").connection.targetConnection); + + for (var d = 1; this.getInput("XTRAIN");) { + var h = this.getInput("XTRAIN"), + i = this.getInput("YTRAIN"); + + e.push(h.connection.targetConnection); + f.push(i.connection.targetConnection); + d++; + } + for (var d = 1; this.getInput("XVALID");) { + var h = this.getInput("XVALID"), + i = this.getInput("YVALID"); + a.push(h.connection.targetConnection); + b.push(i.connection.targetConnection); + d++; + } + + + this.updateShape_(); + this.reconnectChildBlocks_(a, b, c, e, f, g); + }, + updateShape_: function () { + this.getInput("PARAMS") && this.removeInput("PARAMS"); + this.getInput("XTEST") && this.removeInput("XTEST"); + this.getInput("TMODEL") && this.removeInput("TMODEL"); + + if (this.validCount_ > 1) { + this.validCount_ = 1 + } + if (this.trainCount_ > 1) { + this.trainCount_ = 1 + } + var model = false + for (var a = 1; this.getInput("XTRAIN");) this.removeInput("XTRAIN"), this.removeInput("YTRAIN"), a++; + for (a = 1; a <= this.trainCount_; a++) + this.appendValueInput("XTRAIN").appendField("X - Train").setCheck("DataFrame"), + this.appendValueInput("YTRAIN").appendField("y - Train").setCheck("DataFrame"), model = true; + for (var a = 1; this.getInput("XVALID");) this.removeInput("XVALID"), this.removeInput("YVALID"), a++; + for (a = 1; a <= this.validCount_; a++) + this.appendValueInput("XVALID").appendField("X - Valid").setCheck("DataFrame"), + this.appendValueInput("YVALID").appendField("y - Valid").setCheck("DataFrame"), model = true; + + //this.removeInput("TModel"); + + + this.parmCount_ && this.appendValueInput("PARAMS").appendField("Control Parameters"); + if (this.testCount_ > 0) { + this.testCount_ && this.appendValueInput("XTEST").appendField("X - Test").setCheck("DataFrame"); + model = true; + } + + if (model) { + this.appendValueInput("TMODEL").appendField("Model").setCheck("Sklearn_Model") + } + + }, + reconnectChildBlocks_: function (a, b, c, e, f, g) { + var d = 0 + Blockly.Mutator.reconnect(a[d], this, "XVALID"); + Blockly.Mutator.reconnect(b[d], this, "YVALID"); + Blockly.Mutator.reconnect(e[d], this, "XTRAIN"); + Blockly.Mutator.reconnect(f[d], this, "YTRAIN"); + Blockly.Mutator.reconnect(c, this, "PARAMS"); + Blockly.Mutator.reconnect(g, this, "XTEST"); + + }, + }; + + + + Blockly.defineBlocksWithJsonArray([ + { type: "Control_CLR", message0: "Control_CLR", nextStatement: null, enableContextMenu: !1, style: "logic_blocks" }, + { type: "CLR_Train", message0: "Training Data", previousStatement: null, nextStatement: null, enableContextMenu: !1, style: "logic_blocks" }, + { type: "CLR_Test", message0: "Testing Data", previousStatement: null, nextStatement: null, enableContextMenu: !1, style: "logic_blocks" }, + { type: "CLR_Valid", message0: "Validation Data", previousStatement: null, nextStatement: null, enableContextMenu: !1, style: "logic_blocks" }, + { type: "CLR_Params", message0: "Parameters", previousStatement: null, nextStatement: null, enableContextMenu: !1, style: "logic_blocks" } + ]); + + Blockly.Extensions.registerMutator("CLR_mutator", Blockly.Constants.Logic.CLR_Logic, null, ["CLR_Valid", "CLR_Train", "CLR_Params", "CLR_Test"]); + + Blockly.defineBlocksWithJsonArray([ + { + type: "seaborn_dataset", + message0: "Load Dataset %1", + args0: [ + { + type: "field_dropdown", + name: "VAR", + options: [ + ["Auto-Mpg Data", "mpg"], + ["Iris Data", "iris"], + ["Car-Crash Data", "car_crashes"], + ["Anagrams", "anagrams"], + ["Exercise", "exercise"], + ["Diamonds", "diamonds"], + ["Brain Networks", "brain_networks"], + ["Flights", "flights"], + ["Penguins", "penguins"], + ["Planets", "planets"], + ["Titanic", "titanic"], + ["Tips", "tips"] + ] + } + ], + output: "DataFrame" + } + ]) + + 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 = Blockly.Procedures.findLegalName("", this); + a = new Blockly.FieldTextInput(a, 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 < this.argumentVarModels_.length; c++) { + var d = Blockly.utils.xml.createElement("arg"), + e = this.argumentVarModels_[c]; + d.setAttribute("name", e.name); + d.setAttribute("varid", e.getId()); + a && this.paramIds_ && d.setAttribute("paramId", this.paramIds_[c]); + b.appendChild(d); + } + this.hasStatements_ || b.setAttribute("statements", "false"); + return b; + }, + domToMutation: function (a) { + this.arguments_ = []; + this.argumentVarModels_ = []; + for (var b = 0, c; (c = a.childNodes[b]); b++) + if ("arg" == c.nodeName.toLowerCase()) { + var d = c.getAttribute("name"); + c = c.getAttribute("varid") || c.getAttribute("varId"); + this.arguments_.push(d); + c = Blockly.Variables.getOrCreateVariablePackage(this.workspace, c, d, ""); + null != c ? this.argumentVarModels_.push(c) : console.log("Failed to create a variable with name " + d + ", ignoring."); + } + this.updateParams_(); + Blockly.Procedures.mutateCallers(this); + this.setStatements_("false" !== a.getAttribute("statements")); + }, + decompose: function (a) { + var b = Blockly.utils.xml.createElement("block"); + b.setAttribute("type", "procedures_mutatorcontainer"); + var c = Blockly.utils.xml.createElement("statement"); + c.setAttribute("name", "STACK"); + b.appendChild(c); + for (var d = 0; d < this.arguments_.length; d++) { + var e = Blockly.utils.xml.createElement("block"); + e.setAttribute("type", "procedures_mutatorarg"); + var f = Blockly.utils.xml.createElement("field"); + f.setAttribute("name", "NAME"); + var g = Blockly.utils.xml.createTextNode(this.arguments_[d]); + f.appendChild(g); + e.appendChild(f); + f = Blockly.utils.xml.createElement("next"); + e.appendChild(f); + c.appendChild(e); + c = f; + } + a = Blockly.Xml.domToBlock(b, a); + "procedures_defreturn" == this.type ? a.setFieldValue(this.hasStatements_, "STATEMENTS") : a.removeInput("STATEMENT_INPUT"); + Blockly.Procedures.mutateCallers(this); + return a; + }, + compose: function (a) { + this.arguments_ = []; + this.paramIds_ = []; + this.argumentVarModels_ = []; + for (var b = a.getInputTargetBlock("STACK"); b && !b.isInsertionMarker();) { + var c = b.getFieldValue("NAME"); + this.arguments_.push(c); + c = this.workspace.getVariable(c, ""); + this.argumentVarModels_.push(c); + this.paramIds_.push(b.id); + b = b.nextConnection && b.nextConnection.targetBlock(); + } + this.updateParams_(); + Blockly.Procedures.mutateCallers(this); + a = a.getFieldValue("STATEMENTS"); + if (null !== a && ((a = "TRUE" == a), this.hasStatements_ != a)) + if (a) this.setStatements_(!0), Blockly.Mutator.reconnect(this.statementConnection_, this, "STACK"), (this.statementConnection_ = null); + else { + a = this.getInput("STACK").connection; + if ((this.statementConnection_ = a.targetConnection)) (a = a.targetBlock()), a.unplug(), a.bumpNeighbours(); + this.setStatements_(!1); + } + }, + getProcedureDef: function () { + return [this.getFieldValue("NAME"), this.arguments_, !1]; + }, + getVars: function () { + return this.arguments_; + }, + getVarModels: function () { + return this.argumentVarModels_; + }, + renameVarById: function (a, b) { + var c = this.workspace.getVariableById(a); + if ("" == c.type) { + c = c.name; + b = this.workspace.getVariableById(b); + for (var d = !1, e = 0; e < this.argumentVarModels_.length; e++) this.argumentVarModels_[e].getId() == a && ((this.arguments_[e] = b.name), (this.argumentVarModels_[e] = b), (d = !0)); + d && (this.displayRenamedVar_(c, b.name), Blockly.Procedures.mutateCallers(this)); + } + }, + updateVarName: function (a) { + for (var b = a.name, c = !1, d = 0; d < this.argumentVarModels_.length; d++) + if (this.argumentVarModels_[d].getId() == a.getId()) { + var e = this.arguments_[d]; + this.arguments_[d] = b; + c = !0; + } + c && (this.displayRenamedVar_(e, b), Blockly.Procedures.mutateCallers(this)); + }, + displayRenamedVar_: function (a, b) { + this.updateParams_(); + if (this.mutator && this.mutator.isVisible()) + for (var c = this.mutator.workspace_.getAllBlocks(!1), d = 0, e; (e = c[d]); d++) "procedures_mutatorarg" == e.type && Blockly.Names.equals(a, e.getFieldValue("NAME")) && e.setFieldValue(b, "NAME"); + }, + customContextMenu: function (a) { + if (!this.isInFlyout) { + var b = { enabled: !0 }, + c = this.getFieldValue("NAME"); + b.text = Blockly.Msg.PROCEDURES_CREATE_DO.replace("%1", c); + var d = Blockly.utils.xml.createElement("mutation"); + d.setAttribute("name", c); + for (c = 0; c < this.arguments_.length; c++) { + var e = Blockly.utils.xml.createElement("arg"); + e.setAttribute("name", this.arguments_[c]); + d.appendChild(e); + } + c = Blockly.utils.xml.createElement("block"); + c.setAttribute("type", this.callType_); + c.appendChild(d); + b.callback = Blockly.ContextMenu.callbackFactory(this, c); + a.push(b); + if (!this.isCollapsed()) + for (c = 0; c < this.argumentVarModels_.length; c++) + (b = { enabled: !0 }), + (d = this.argumentVarModels_[c]), + (b.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1", d.name)), + (d = Blockly.Variables.generateVariableFieldDom(d)), + (e = Blockly.utils.xml.createElement("block")), + e.setAttribute("type", "variables_get"), + e.appendChild(d), + (b.callback = Blockly.ContextMenu.callbackFactory(this, e)), + a.push(b); + } + }, + callType_: "procedures_callnoreturn", + }; + Blockly.Blocks.procedures_defreturn = { + init: function () { + var a = Blockly.Procedures.findLegalName("", this); + a = new Blockly.FieldTextInput(a, Blockly.Procedures.rename); + a.setSpellcheck(!1); + this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE).appendField(a, "NAME").appendField("", "PARAMS"); + this.appendValueInput("RETURN").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"])); + (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_(!0); + this.statementConnection_ = null; + }, + setStatements_: Blockly.Blocks.procedures_defnoreturn.setStatements_, + updateParams_: Blockly.Blocks.procedures_defnoreturn.updateParams_, + mutationToDom: Blockly.Blocks.procedures_defnoreturn.mutationToDom, + domToMutation: Blockly.Blocks.procedures_defnoreturn.domToMutation, + decompose: Blockly.Blocks.procedures_defnoreturn.decompose, + compose: Blockly.Blocks.procedures_defnoreturn.compose, + getProcedureDef: function () { + return [this.getFieldValue("NAME"), this.arguments_, !0]; + }, + getVars: Blockly.Blocks.procedures_defnoreturn.getVars, + 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 = { + 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 = !1; + }, + }; + Blockly.Blocks.procedures_mutatorarg = { + init: function () { + var a = new Blockly.FieldTextInput(Blockly.Procedures.DEFAULT_ARG, this.validator_); + a.oldShowEditorFn_ = a.showEditor_; + a.showEditor_ = function () { + this.createdVariables_ = []; + this.oldShowEditorFn_(); + }; + this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_MUTATORARG_TITLE).appendField(a, "NAME"); + this.setPreviousStatement(!0); + this.setNextStatement(!0); + this.setStyle("procedure_blocks"); + this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP); + this.contextMenu = !1; + a.onFinishEditing_ = this.deleteIntermediateVars_; + a.createdVariables_ = []; + a.onFinishEditing_("x"); + }, + validator_: function (a) { + var b = this.getSourceBlock(), + c = Blockly.Mutator.findParentWs(b.workspace); + a = a.replace(/[\s\xa0]+/g, " ").replace(/^ | $/g, ""); + if (!a) return null; + for (var d = (b.workspace.targetWorkspace || b.workspace).getAllBlocks(!1), e = a.toLowerCase(), f = 0; f < d.length; f++) + if (d[f].id != this.getSourceBlock().id) { + var g = d[f].getFieldValue("NAME"); + if (g && g.toLowerCase() == e) return null; + } + if (b.isInFlyout) return a; + (b = c.getVariable(a, "")) && b.name != a && c.renameVariableById(b.getId(), a); + b || ((b = c.createVariable(a, "")) && this.createdVariables_ && this.createdVariables_.push(b)); + return a; + }, + deleteIntermediateVars_: function (a) { + var b = Blockly.Mutator.findParentWs(this.getSourceBlock().workspace); + if (b) + for (var c = 0; c < this.createdVariables_.length; c++) { + var d = this.createdVariables_[c]; + d.name != a && b.deleteVariableById(d.getId()); + } + }, + }; + Blockly.Blocks.procedures_callnoreturn = { + init: function () { + this.appendDummyInput("TOPROW").appendField("", "NAME"); + this.setPreviousStatement(!0); + this.setNextStatement(!0); + this.setStyle("procedure_blocks"); + this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + this.previousEnabledState_ = !0; + }, + getProcedureCall: function () { + return this.getFieldValue("NAME"); + }, + renameProcedure: function (a, b) { + Blockly.Names.equals(a, this.getProcedureCall()) && + (this.setFieldValue(b, "NAME"), this.setTooltip((this.outputConnection ? Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP : Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP).replace("%1", b))); + }, + setProcedureParameters_: function (a, b) { + var c = Blockly.Procedures.getDefinition(this.getProcedureCall(), this.workspace), + d = c && c.mutator && c.mutator.isVisible(); + d || ((this.quarkConnections_ = {}), (this.quarkIds_ = null)); + if (b) + if (a.join("\n") == this.arguments_.join("\n")) this.quarkIds_ = b; + else { + if (b.length != a.length) throw RangeError("paramNames and paramIds must be the same length."); + this.setCollapsed(!1); + this.quarkIds_ || ((this.quarkConnections_ = {}), (this.quarkIds_ = [])); + c = this.rendered; + this.rendered = !1; + for (var e = 0; e < this.arguments_.length; e++) { + var f = this.getInput("ARG" + e); + f && ((f = f.connection.targetConnection), (this.quarkConnections_[this.quarkIds_[e]] = f), d && f && -1 == b.indexOf(this.quarkIds_[e]) && (f.disconnect(), f.getSourceBlock().bumpNeighbours())); + } + this.arguments_ = [].concat(a); + this.argumentVarModels_ = []; + for (e = 0; e < this.arguments_.length; e++) (a = Blockly.Variables.getOrCreateVariablePackage(this.workspace, null, this.arguments_[e], "")), this.argumentVarModels_.push(a); + this.updateShape_(); + if ((this.quarkIds_ = b)) + for (e = 0; e < this.arguments_.length; e++) + (b = this.quarkIds_[e]), b in this.quarkConnections_ && ((f = this.quarkConnections_[b]), Blockly.Mutator.reconnect(f, this, "ARG" + e) || delete this.quarkConnections_[b]); + (this.rendered = c) && this.render(); + } + }, + updateShape_: function () { + for (var a = 0; a < this.arguments_.length; a++) { + var b = this.getField("ARGNAME" + a); + if (b) { + Blockly.Events.disable(); + try { + b.setValue(this.arguments_[a]); + } finally { + Blockly.Events.enable(); + } + } else + (b = new Blockly.FieldLabel(this.arguments_[a])), + this.appendValueInput("ARG" + a) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(b, "ARGNAME" + a) + .init(); + } + for (; this.getInput("ARG" + a);) this.removeInput("ARG" + a), a++; + if ((a = this.getInput("TOPROW"))) this.arguments_.length ? this.getField("WITH") || (a.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS, "WITH"), a.init()) : this.getField("WITH") && a.removeField("WITH"); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"); + a.setAttribute("name", this.getProcedureCall()); + for (var b = 0; b < this.arguments_.length; b++) { + var c = Blockly.utils.xml.createElement("arg"); + c.setAttribute("name", this.arguments_[b]); + a.appendChild(c); + } + return a; + }, + domToMutation: function (a) { + var b = a.getAttribute("name"); + this.renameProcedure(this.getProcedureCall(), b); + b = []; + for (var c = [], d = 0, e; (e = a.childNodes[d]); d++) "arg" == e.nodeName.toLowerCase() && (b.push(e.getAttribute("name")), c.push(e.getAttribute("paramId"))); + this.setProcedureParameters_(b, c); + }, + getVars: function () { + return this.arguments_; + }, + getVarModels: function () { + return this.argumentVarModels_; + }, + onchange: function (a) { + if (this.workspace && !this.workspace.isFlyout && a.recordUndo) + if (a.type == Blockly.Events.BLOCK_CREATE && -1 != a.ids.indexOf(this.id)) { + var b = this.getProcedureCall(); + b = Blockly.Procedures.getDefinition(b, this.workspace); + !b || (b.type == this.defType_ && JSON.stringify(b.getVars()) == JSON.stringify(this.arguments_)) || (b = null); + if (!b) { + Blockly.Events.setGroup(a.group); + a = Blockly.utils.xml.createElement("xml"); + b = Blockly.utils.xml.createElement("block"); + b.setAttribute("type", this.defType_); + var c = this.getRelativeToSurfaceXY(), + d = c.y + 2 * Blockly.SNAP_RADIUS; + b.setAttribute("x", c.x + Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1)); + b.setAttribute("y", d); + c = this.mutationToDom(); + b.appendChild(c); + c = Blockly.utils.xml.createElement("field"); + c.setAttribute("name", "NAME"); + d = this.getProcedureCall(); + d || ((d = Blockly.Procedures.findLegalName("", this)), this.renameProcedure("", d)); + c.appendChild(Blockly.utils.xml.createTextNode(d)); + b.appendChild(c); + a.appendChild(b); + Blockly.Xml.domToWorkspace(a, this.workspace); + Blockly.Events.setGroup(!1); + } + } else + a.type == Blockly.Events.BLOCK_DELETE + ? ((b = this.getProcedureCall()), (b = Blockly.Procedures.getDefinition(b, this.workspace)), b || (Blockly.Events.setGroup(a.group), this.dispose(!0), Blockly.Events.setGroup(!1))) + : a.type == Blockly.Events.CHANGE && + "disabled" == a.element && + ((b = this.getProcedureCall()), + (b = Blockly.Procedures.getDefinition(b, this.workspace)) && + b.id == a.blockId && + ((b = Blockly.Events.getGroup()) && console.log("Saw an existing group while responding to a definition change"), + Blockly.Events.setGroup(a.group), + a.newValue ? ((this.previousEnabledState_ = this.isEnabled()), this.setEnabled(!1)) : this.setEnabled(this.previousEnabledState_), + Blockly.Events.setGroup(b))); + }, + customContextMenu: function (a) { + if (this.workspace.isMovable()) { + var b = { enabled: !0 }; + b.text = Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF; + var c = this.getProcedureCall(), + d = this.workspace; + b.callback = function () { + var e = Blockly.Procedures.getDefinition(c, d); + e && (d.centerOnBlock(e.id), e.select()); + }; + a.push(b); + } + }, + defType_: "procedures_defnoreturn", + }; + Blockly.Blocks.procedures_callreturn = { + init: function () { + this.appendDummyInput("TOPROW").appendField("", "NAME"); + this.setOutput(!0); + this.setStyle("procedure_blocks"); + this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + this.previousEnabledState_ = !0; + }, + 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, + getVars: Blockly.Blocks.procedures_callnoreturn.getVars, + 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 = { + init: function () { + this.appendValueInput("CONDITION").setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); + this.appendValueInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + this.setInputsInline(!0); + this.setPreviousStatement(!0); + this.setNextStatement(!0); + this.setStyle("procedure_blocks"); + this.setTooltip(Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP); + this.setHelpUrl(Blockly.Msg.PROCEDURES_IFRETURN_HELPURL); + this.hasReturnValue_ = !0; + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"); + a.setAttribute("value", Number(this.hasReturnValue_)); + return a; + }, + domToMutation: function (a) { + this.hasReturnValue_ = 1 == a.getAttribute("value"); + this.hasReturnValue_ || (this.removeInput("VALUE"), this.appendDummyInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN)); + }, + onchange: function (a) { + if (this.workspace.isDragging && !this.workspace.isDragging()) { + a = !1; + var b = this; + do { + if (-1 != this.FUNCTION_TYPES.indexOf(b.type)) { + a = !0; + break; + } + b = b.getSurroundParent(); + } while (b); + a + ? ("procedures_defnoreturn" == b.type && this.hasReturnValue_ + ? (this.removeInput("VALUE"), this.appendDummyInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN), (this.hasReturnValue_ = !1)) + : "procedures_defreturn" != b.type || this.hasReturnValue_ || (this.removeInput("VALUE"), this.appendValueInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN), (this.hasReturnValue_ = !0)), + this.setWarningText(null), + this.isInFlyout || this.setEnabled(!0)) + : (this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING), this.isInFlyout || this.getInheritedDisabled() || this.setEnabled(!1)); + } + }, + FUNCTION_TYPES: ["procedures_defnoreturn", "procedures_defreturn"], + }; + Blockly.Blocks.texts = {}; + Blockly.Constants.Text = {}; + Blockly.Constants.Text.HUE = 160; + Blockly.defineBlocksWithJsonArray([ + { + 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,iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpPU2iAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAdhgAAHYYBXaITgQAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMS42/U4J6AAAAP1JREFUOE+Vks0KQUEYhjmRIja4ABtZ2dm5A3t3Ia6AUm7CylYuQRaUhZSlLZJiQbFAyRnPN33y01HOW08z8873zpwzM4F3GWOCruvGIE4/rLaV+Nq1hVGMBqzhqlxgCys4wJA65xnogMHsQ5lujnYHTejBBCK2mE4abjCgMGhNxHgDFWjDSG07kdfVa2pZMf4ZyMAdWmpZMfYOsLiDMYMjlMB+K613QISRhTnITnsYg5yUd0DETmEoMlkFOeIT/A58iyK5E18BuTBfgYXfwNJv4P9/oEBerLylOnRhygmGdPpTTBZAPkde61lbQe4moWUvYUZYLfUNftIY4zwA5X2Z9AYnQrEAAAAASUVORK5CYII=", + 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: !1, + }, + { 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: !1 }, + { + 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: !0, + extensions: ["text_indexOf_tooltip"], + }, + { + type: "text_charAt", + message0: "%{BKY_TEXT_CHARAT_TITLE}", + 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: !0, + mutator: "text_charAt_mutator", + }, + ]); + Blockly.Blocks.text_getSubstring = { + init: function () { + this.WHERE_OPTIONS_1 = [ + [Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START, "FROM_START"], + [Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END, "FROM_END"], + [Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST, "FIRST"], + ]; + this.WHERE_OPTIONS_2 = [ + [Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START, "FROM_START"], + [Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END, "FROM_END"], + [Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST, "LAST"], + ]; + this.setHelpUrl(Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL); + this.setStyle("text_blocks"); + this.appendValueInput("STRING").setCheck("String").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT); + this.appendDummyInput("AT1"); + this.appendDummyInput("AT2"); + Blockly.Msg.TEXT_GET_SUBSTRING_TAIL && this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL); + this.setInputsInline(!0); + this.setOutput(!0, "String"); + this.updateAt_(1, !0); + this.updateAt_(2, !0); + this.setTooltip(Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"), + b = this.getInput("AT1").type == Blockly.INPUT_VALUE; + a.setAttribute("at1", b); + b = this.getInput("AT2").type == Blockly.INPUT_VALUE; + a.setAttribute("at2", b); + return a; + }, + domToMutation: function (a) { + var b = "true" == a.getAttribute("at1"); + a = "true" == a.getAttribute("at2"); + this.updateAt_(1, b); + this.updateAt_(2, a); + }, + updateAt_: function (a, b) { + this.removeInput("AT" + a); + this.removeInput("ORDINAL" + a, !0); + b ? (this.appendValueInput("AT" + a).setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL" + a).appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT" + a); + 2 == a && Blockly.Msg.TEXT_GET_SUBSTRING_TAIL && (this.removeInput("TAIL", !0), this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL)); + var c = new Blockly.FieldDropdown(this["WHERE_OPTIONS_" + a], function (d) { + var e = "FROM_START" == d || "FROM_END" == d; + if (e != b) { + var f = this.getSourceBlock(); + f.updateAt_(a, e); + f.setFieldValue(d, "WHERE" + a); + return null; + } + }); + this.getInput("AT" + a).appendField(c, "WHERE" + a); + 1 == a && (this.moveInputBefore("AT1", "AT2"), this.getInput("ORDINAL1") && this.moveInputBefore("ORDINAL1", "AT2")); + }, + }; + Blockly.Blocks.text_changeCase = { + init: function () { + var a = [ + [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE, "UPPERCASE"], + [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE, "LOWERCASE"], + [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE, "TITLECASE"], + ]; + this.setHelpUrl(Blockly.Msg.TEXT_CHANGECASE_HELPURL); + this.setStyle("text_blocks"); + this.appendValueInput("TEXT").setCheck("String").appendField(new Blockly.FieldDropdown(a), "CASE"); + this.setOutput(!0, "String"); + this.setTooltip(Blockly.Msg.TEXT_CHANGECASE_TOOLTIP); + }, + }; + Blockly.Blocks.text_trim = { + init: function () { + var a = [ + [Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH, "BOTH"], + [Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT, "LEFT"], + [Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT, "RIGHT"], + ]; + this.setHelpUrl(Blockly.Msg.TEXT_TRIM_HELPURL); + this.setStyle("text_blocks"); + this.appendValueInput("TEXT").setCheck("String").appendField(new Blockly.FieldDropdown(a), "MODE"); + this.setOutput(!0, "String"); + this.setTooltip(Blockly.Msg.TEXT_TRIM_TOOLTIP); + }, + }; + Blockly.Blocks.text_print = { + init: function () { + this.jsonInit({ + message0: Blockly.Msg.TEXT_PRINT_TITLE, + args0: [{ type: "input_value", name: "TEXT" }], + previousStatement: null, + nextStatement: null, + style: "text_blocks", + tooltip: Blockly.Msg.TEXT_PRINT_TOOLTIP, + helpUrl: Blockly.Msg.TEXT_PRINT_HELPURL, + }); + }, + }; + Blockly.Blocks.text_prompt_ext = { + init: function () { + var a = [ + [Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, "TEXT"], + [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, "NUMBER"], + ]; + this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); + this.setStyle("text_blocks"); + var b = this; + a = new Blockly.FieldDropdown(a, function (c) { + b.updateType_(c); + }); + this.appendValueInput("TEXT").appendField(a, "TYPE"); + this.setOutput(!0, "String"); + this.setTooltip(function () { + return "TEXT" == b.getFieldValue("TYPE") ? Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER; + }); + }, + updateType_: function (a) { + this.outputConnection.setCheck("NUMBER" == a ? "Number" : "String"); + }, + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"); + a.setAttribute("type", this.getFieldValue("TYPE")); + return a; + }, + domToMutation: function (a) { + this.updateType_(a.getAttribute("type")); + }, + }; + Blockly.Blocks.text_prompt = { + init: function () { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + var a = [ + [Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, "TEXT"], + [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, "NUMBER"], + ], + b = this; + this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); + this.setStyle("text_blocks"); + a = new Blockly.FieldDropdown(a, function (c) { + b.updateType_(c); + }); + this.appendDummyInput().appendField(a, "TYPE").appendField(this.newQuote_(!0)).appendField(new Blockly.FieldTextInput(""), "TEXT").appendField(this.newQuote_(!1)); + this.setOutput(!0, "String"); + this.setTooltip(function () { + return "TEXT" == b.getFieldValue("TYPE") ? Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER; + }); + }, + 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 = { + 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: !0, + style: "text_blocks", + tooltip: Blockly.Msg.TEXT_COUNT_TOOLTIP, + helpUrl: Blockly.Msg.TEXT_COUNT_HELPURL, + }); + }, + }; + Blockly.Blocks.text_replace = { + 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: !0, + style: "text_blocks", + tooltip: Blockly.Msg.TEXT_REPLACE_TOOLTIP, + helpUrl: Blockly.Msg.TEXT_REPLACE_HELPURL, + }); + }, + }; + Blockly.Blocks.text_reverse = { + init: function () { + this.jsonInit({ + message0: Blockly.Msg.TEXT_REVERSE_MESSAGE0, + args0: [{ type: "input_value", name: "TEXT", check: "String" }], + output: "String", + inputsInline: !0, + style: "text_blocks", + tooltip: Blockly.Msg.TEXT_REVERSE_TOOLTIP, + helpUrl: Blockly.Msg.TEXT_REVERSE_HELPURL, + }); + }, + }; + Blockly.Constants.Text.QUOTE_IMAGE_MIXIN = { + QUOTE_IMAGE_LEFT_DATAURI: + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC", + QUOTE_IMAGE_RIGHT_DATAURI: + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==", + QUOTE_IMAGE_WIDTH: 12, + QUOTE_IMAGE_HEIGHT: 12, + quoteField_: function (a) { + for (var b = 0, c; (c = this.inputList[b]); b++) + for (var d = 0, e; (e = c.fieldRow[d]); d++) + if (a == e.name) { + c.insertFieldAt(d, this.newQuote_(!0)); + c.insertFieldAt(d + 2, this.newQuote_(!1)); + return; + } + console.warn('field named "' + a + '" not found in ' + this.toDevString()); + }, + newQuote_: function (a) { + a = this.RTL ? !a : a; + return new Blockly.FieldImage(a ? this.QUOTE_IMAGE_LEFT_DATAURI : this.QUOTE_IMAGE_RIGHT_DATAURI, this.QUOTE_IMAGE_WIDTH, this.QUOTE_IMAGE_HEIGHT, a ? "\u201c" : "\u201d"); + }, + }; + Blockly.Constants.Text.TEXT_QUOTES_EXTENSION = function () { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + this.quoteField_("TEXT"); + }; + Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN = { + 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("text_create_join_container"); + b.initSvg(); + for (var c = b.getInput("STACK").connection, d = 0; d < this.itemCount_; d++) { + var e = a.newBlock("text_create_join_item"); + e.initSvg(); + c.connect(e.previousConnection); + c = e.nextConnection; + } + return b; + }, + compose: function (a) { + var b = a.getInputTargetBlock("STACK"); + for (a = []; b && !b.isInsertionMarker();) a.push(b.valueConnection_), (b = b.nextConnection && b.nextConnection.targetBlock()); + for (b = 0; b < this.itemCount_; b++) { + var c = this.getInput("ADD" + b).connection.targetConnection; + c && -1 == a.indexOf(c) && c.disconnect(); + } + this.itemCount_ = a.length; + this.updateShape_(); + for (b = 0; b < this.itemCount_; b++) Blockly.Mutator.reconnect(a[b], this, "ADD" + b); + }, + saveConnections: function (a) { + a = a.getInputTargetBlock("STACK"); + for (var b = 0; a;) { + var c = this.getInput("ADD" + b); + a.valueConnection_ = c && c.connection.targetConnection; + b++; + a = a.nextConnection && a.nextConnection.targetBlock(); + } + }, + updateShape_: function () { + this.itemCount_ && this.getInput("EMPTY") ? this.removeInput("EMPTY") : this.itemCount_ || this.getInput("EMPTY") || this.appendDummyInput("EMPTY").appendField(this.newQuote_(!0)).appendField(this.newQuote_(!1)); + for (var a = 0; a < this.itemCount_; a++) + if (!this.getInput("ADD" + a)) { + var b = this.appendValueInput("ADD" + a).setAlign(Blockly.ALIGN_RIGHT); + 0 == a && b.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH); + } + for (; this.getInput("ADD" + a);) this.removeInput("ADD" + a), a++; + }, + }; + Blockly.Constants.Text.TEXT_JOIN_EXTENSION = function () { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + this.itemCount_ = 2; + this.updateShape_(); + this.setMutator(new Blockly.Mutator(["text_create_join_item"])); + }; + Blockly.Extensions.register("text_append_tooltip", Blockly.Extensions.buildTooltipWithFieldText("%{BKY_TEXT_APPEND_TOOLTIP}", "VAR")); + Blockly.Constants.Text.TEXT_INDEXOF_TOOLTIP_EXTENSION = function () { + var a = this; + this.setTooltip(function () { + return Blockly.Msg.TEXT_INDEXOF_TOOLTIP.replace("%1", a.workspace.options.oneBasedIndex ? "0" : "-1"); + }); + }; + Blockly.Constants.Text.TEXT_CHARAT_MUTATOR_MIXIN = { + mutationToDom: function () { + var a = Blockly.utils.xml.createElement("mutation"); + a.setAttribute("at", !!this.isAt_); + return a; + }, + domToMutation: function (a) { + a = "false" != a.getAttribute("at"); + this.updateAt_(a); + }, + updateAt_: function (a) { + this.removeInput("AT", !0); + this.removeInput("ORDINAL", !0); + a && (this.appendValueInput("AT").setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)); + Blockly.Msg.TEXT_CHARAT_TAIL && (this.removeInput("TAIL", !0), this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_CHARAT_TAIL)); + this.isAt_ = a; + }, + }; + Blockly.Constants.Text.TEXT_CHARAT_EXTENSION = function () { + this.getField("WHERE").setValidator(function (b) { + b = "FROM_START" == b || "FROM_END" == b; + b != this.isAt_ && this.getSourceBlock().updateAt_(b); + }); + this.updateAt_(!0); + var a = this; + this.setTooltip(function () { + var b = a.getFieldValue("WHERE"), + c = Blockly.Msg.TEXT_CHARAT_TOOLTIP; + ("FROM_START" == b || "FROM_END" == b) && + (b = "FROM_START" == b ? Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP : Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP) && + (c += " " + b.replace("%1", a.workspace.options.oneBasedIndex ? "#1" : "#0")); + return c; + }); + }; + 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); + Blockly.Blocks.variables = {}; + Blockly.Constants.Variables = {}; + Blockly.Constants.Variables.HUE = 330; + Blockly.defineBlocksWithJsonArray([ + { + 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"], + }, + { + 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"], + }, + ]); + Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { + customContextMenu: function (a) { + if (!this.isInFlyout) { + if ("variables_get" == this.type) + var b = "variables_set", + c = Blockly.Msg.VARIABLES_GET_CREATE_SET; + else (b = "variables_get"), (c = Blockly.Msg.VARIABLES_SET_CREATE_GET); + var d = { enabled: 0 < this.workspace.remainingCapacity() }, + e = this.getField("VAR").getText(); + d.text = c.replace("%1", e); + c = Blockly.utils.xml.createElement("field"); + c.setAttribute("name", "VAR"); + c.appendChild(Blockly.utils.xml.createTextNode(e)); + e = Blockly.utils.xml.createElement("block"); + e.setAttribute("type", b); + e.appendChild(c); + d.callback = Blockly.ContextMenu.callbackFactory(this, e); + a.push(d); + } else if ("variables_get" == this.type || "variables_get_reporter" == this.type) + (b = { text: Blockly.Msg.RENAME_VARIABLE, enabled: !0, callback: Blockly.Constants.Variables.RENAME_OPTION_CALLBACK_FACTORY(this) }), + (e = this.getField("VAR").getText()), + (d = { text: Blockly.Msg.DELETE_VARIABLE.replace("%1", e), enabled: !0, callback: Blockly.Constants.Variables.DELETE_OPTION_CALLBACK_FACTORY(this) }), + a.unshift(b), + a.unshift(d); + }, + }; + Blockly.Constants.Variables.RENAME_OPTION_CALLBACK_FACTORY = function (a) { + return function () { + var b = a.workspace, + c = a.getField("VAR").getVariable(); + Blockly.Variables.renameVariable(b, c); + }; + }; + Blockly.Constants.Variables.DELETE_OPTION_CALLBACK_FACTORY = function (a) { + return function () { + var b = a.workspace, + c = a.getField("VAR").getVariable(); + b.deleteVariableById(c.getId()); + b.refreshToolboxSelection(); + }; + }; + Blockly.Extensions.registerMixin("contextMenu_variableSetterGetter", Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN); + Blockly.Constants.VariablesDynamic = {}; + Blockly.Constants.VariablesDynamic.HUE = 310; + Blockly.defineBlocksWithJsonArray([ + { + 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"], + }, + { + 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"], + }, + ]); + Blockly.Constants.VariablesDynamic.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { + customContextMenu: function (a) { + if (!this.isInFlyout) { + var b = this.getFieldValue("VAR"); + var c = this.workspace.getVariableById(b).type; + if ("variables_get_dynamic" == this.type) { + b = "variables_set_dynamic"; + var d = Blockly.Msg.VARIABLES_GET_CREATE_SET; + } else (b = "variables_get_dynamic"), (d = Blockly.Msg.VARIABLES_SET_CREATE_GET); + var e = { enabled: 0 < this.workspace.remainingCapacity() }, + f = this.getField("VAR").getText(); + e.text = d.replace("%1", f); + d = Blockly.utils.xml.createElement("field"); + d.setAttribute("name", "VAR"); + d.setAttribute("variabletype", c); + d.appendChild(Blockly.utils.xml.createTextNode(f)); + f = Blockly.utils.xml.createElement("block"); + f.setAttribute("type", b); + f.appendChild(d); + e.callback = Blockly.ContextMenu.callbackFactory(this, f); + a.push(e); + } else if ("variables_get_dynamic" == this.type || "variables_get_reporter_dynamic" == this.type) + (b = { text: Blockly.Msg.RENAME_VARIABLE, enabled: !0, callback: Blockly.Constants.Variables.RENAME_OPTION_CALLBACK_FACTORY(this) }), + (f = this.getField("VAR").getText()), + (e = { text: Blockly.Msg.DELETE_VARIABLE.replace("%1", f), enabled: !0, callback: Blockly.Constants.Variables.DELETE_OPTION_CALLBACK_FACTORY(this) }), + a.unshift(b), + a.unshift(e); + }, + onchange: function (a) { + a = this.getFieldValue("VAR"); + a = Blockly.Variables.getVariable(this.workspace, a); + "variables_get_dynamic" == this.type ? this.outputConnection.setCheck(a.type) : this.getInput("VALUE").connection.setCheck(a.type); + }, + }; + Blockly.Constants.VariablesDynamic.RENAME_OPTION_CALLBACK_FACTORY = function (a) { + return function () { + var b = a.workspace, + c = a.getField("VAR").getVariable(); + Blockly.Variables.renameVariable(b, c); + }; + }; + Blockly.Constants.VariablesDynamic.DELETE_OPTION_CALLBACK_FACTORY = function (a) { + return function () { + var b = a.workspace, + c = a.getField("VAR").getVariable(); + b.deleteVariableById(c.getId()); + b.refreshToolboxSelection(); + }; + }; + Blockly.Extensions.registerMixin("contextMenu_variableDynamicSetterGetter", Blockly.Constants.VariablesDynamic.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN); + return Blockly.Blocks; +}); + +//# sourceMappingURL=blocks_compressed.js.map diff --git a/static/js/blocks_compressed.js b/static/js/blocks_compressed.js new file mode 100644 index 0000000..4d216d8 --- /dev/null +++ b/static/js/blocks_compressed.js @@ -0,0 +1,182 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.Blocks = factory(root.Blockly); + } +}(this, function(Blockly) { + '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,d=0;d","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,d=1;d<=this.elseifCount_;d++){var e=a.newBlock("controls_if_elseif");e.initSvg();c.connect(e.previousConnection);c=e.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],d=null;a&&!a.isInsertionMarker();){switch(a.type){case "controls_if_elseif":this.elseifCount_++; +b.push(a.valueConnection_);c.push(a.statementConnection_);break;case "controls_if_else":this.elseCount_++;d=a.statementConnection_;break;default:throw TypeError("Unknown block type: "+a.type);}a=a.nextConnection&&a.nextConnection.targetBlock()}this.updateShape_();this.reconnectChildBlocks_(b,c,d)},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),d=this.getInput("DO"+b);a.valueConnection_=c&&c.connection.targetConnection; +a.statementConnection_=d&&d.connection.targetConnection;b++;break;case "controls_if_else":d=this.getInput("ELSE");a.statementConnection_=d&&d.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 d=1;this.getInput("IF"+d);){var e=this.getInput("IF"+d),f=this.getInput("DO"+ +d);a.push(e.connection.targetConnection);b.push(f.connection.targetConnection);d++}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 d=1;d<=this.elseifCount_;d++)Blockly.Mutator.reconnect(a[d],this,"IF"+d),Blockly.Mutator.reconnect(b[d],this,"DO"+d);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&&!this.workspace.connectionChecker.doTypeChecks(b.outputConnection,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"),d=this.outputConnection.targetConnection;if((b||c)&&d)for(var e=0;2>e;e++){var f=1==e?b:c;f&&!f.workspace.connectionChecker.doTypeChecks(f.outputConnection,d)&&(Blockly.Events.setGroup(a.group),d===this.prevParentConnection_?(this.unplug(),d.getSourceBlock().bumpNeighbours()):(f.unplug(),f.bumpNeighbours()),Blockly.Events.setGroup(!1))}this.prevParentConnection_= +d}};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 d={enabled:!0};d.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);d.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(d)}}}}; +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){if(this.workspace.isDragging&&!this.workspace.isDragging()&&a.type==Blockly.Events.BLOCK_MOVE){var b=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(this); +this.setWarningText(b?null:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);if(!this.isInFlyout){var c=Blockly.Events.getGroup();Blockly.Events.setGroup(a.group);this.setEnabled(b);Blockly.Events.setGroup(c)}}}};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=Blockly.Procedures.findLegalName("",this);a=new Blockly.FieldTextInput(a,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;cCLOSURE_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(' +``` + +## 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/static/js/dist/blockly.d.ts b/static/js/dist/blockly.d.ts new file mode 100644 index 0000000..d6da61d --- /dev/null +++ b/static/js/dist/blockly.d.ts @@ -0,0 +1,21951 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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; + maxInstances?: {[type: string]: number;}; + 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; + pinch?: boolean; + }; + renderer?: string; + parentWorkspace?: Blockly.WorkspaceSvg; + } + + interface BlocklyThemeOptions { + base?: string; + blockStyles?: {[blocks: string]: Blockly.Theme.BlockStyle;}; + categoryStyles?: {[category: string]: Blockly.Theme.CategoryStyle;}; + componentStyles?: {[component: string]: any;}; + fontStyle?: Blockly.Theme.FontStyle; + startHats?: boolean; + } + + /** + * 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.utils { + interface Metrics { + viewHeight: number; + viewWidth: number; + contentHeight: number; + contentWidth: number; + viewTop: number; + viewLeft: number; + contentTop: number; + contentLeft: number; + absoluteTop: number; + absoluteLeft: number; + svgHeight?: number; + svgWidth?: number; + toolboxWidth?: number; + toolboxHeight?: number; + flyoutWidth?: number; + flyoutHeight?: number; + toolboxPosition?: number; + } +} + + +declare module Blockly { + + class Block extends Block__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Block__Class implements Blockly.IASTNodeLocation { + + /** + * 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 + * @implements {Blockly.IASTNodeLocation} + * @throws When the prototypeName is not valid or 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 {!Blockly.Tooltip.TipInfo} */ + tooltip: Blockly.Tooltip.TipInfo; + + /** @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 {?boolean} */ + rendered: boolean; + + /** + * A count of statement inputs on the block. + * @type {number} + * @package + */ + statementInputCount: number; + + /** @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. The parent + * block is either the block connected to the previous connection (for a statement + * block) or the block connected to the output connection (for a value block). + * @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; + + /** + * Returns the block connected to the previous connection. + * @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. + */ + 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; + + /** + * Sets the tooltip for this block. + * @param {!Blockly.Tooltip.TipInfo} newTip The text for the tooltip, a function + * that returns the text for the tooltip, or a parent object whose tooltip + * will be used. To not display a tooltip pass the empty string. + */ + setTooltip(newTip: Blockly.Tooltip.TipInfo): void; + + /** + * Returns the tooltip text for this block. + * @returns {!string} The tooltip text for this block. + */ + getTooltip(): string; + + /** + * 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 and not 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. + */ + 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 of the given field. + * @param {string} name The name of the field. + * @return {*} Value of the field or null if field does not exist. + */ + getFieldValue(name: string): any; + + /** + * Sets the value of the given field for this block. + * @param {*} newValue The value to set. + * @param {!string} name The name of the field to set the value of. + */ + setFieldValue(newValue: any, 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; + + /** + * 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 an error if input is not present. + * @return {boolean} True if operation succeeds, false if input is not present and opt_quiet is true + * @throws {Error} if the input is not present and opt_quiet is not true. + */ + removeInput(name: string, opt_quiet?: boolean): boolean; + + /** + * 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 + } + + /** + * The language-neutral id given to the collapsed input. + * @const {string} + */ + var COLLAPSED_INPUT_NAME: any /*missing*/; + + /** + * The language-neutral id given to the collapsed field. + * @const {string} + */ + var COLLAPSED_FIELD_NAME: any /*missing*/; +} + + +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 { + + class BlockSvg extends BlockSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockSvg__Class extends Blockly.Block__Class implements Blockly.IASTNodeLocationSvg, Blockly.IBoundedElement, Blockly.ICopyable { + + /** + * 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} + * @implements {Blockly.IASTNodeLocationSvg} + * @implements {Blockly.IBoundedElement} + * @implements {Blockly.ICopyable} + * @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; + + /** + * Get the secondary colour of a block. + * @return {?string} #RRGGBB string. + */ + getColourSecondary(): string; + + /** + * Get the tertiary colour of a block. + * @return {?string} #RRGGBB string. + */ + getColourTertiary(): string; + + /** + * Get the shadow colour of a block. + * @return {?string} #RRGGBB string. + * @deprecated Use style.colourSecondary. (2020 January 21) + */ + getColourShadow(): string; + + /** + * Get the border colour(s) of a block. + * @return {{colourDark, colourLight, colourBorder}} An object containing + * colour values for the border(s) of the block. If the block is using a + * style the colourBorder will be defined and equal to the tertiary colour + * of the style (#RRGGBB string). Otherwise the colourDark and colourLight + * attributes will be defined (#RRGGBB strings). + * @deprecated Use style.colourTertiary. (2020 January 21) + */ + getColourBorder(): { colourDark: any /*missing*/; colourLight: any /*missing*/; colourBorder: any /*missing*/ }; + + /** + * 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-rendered. + */ + 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 {!SVGGElement} The root SVG node (probably a group). + */ + getSvgRoot(): SVGGElement; + + /** + * 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; + + /** + * Encode a block for copying. + * @return {?Blockly.ICopyable.CopyData} Copy metadata, or null if the block is + * an insertion marker. + * @package + */ + toCopyData(): Blockly.ICopyable.CopyData; + + /** + * 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 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. + * @return {boolean} True if operation succeeds, false if input is not present and opt_quiet is true + * @throws {Error} if the input is not present and + * opt_quiet is not true. + */ + removeInput(name: string, opt_quiet?: boolean): boolean; + + /** + * 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; + + /** + * 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; + + /** + * Redraw any attached marker or cursor svgs if needed. + * @protected + */ + updateMarkers_(): 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 + */ + fadeForReplacement(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.ICopyable} + */ + var selected: Blockly.ICopyable; + + /** + * All of the connections on blocks that are currently being dragged. + * @type {!Array.} + * @package + */ + var draggingConnections: Blockly.Connection[]; + + /** + * Container element to render the WidgetDiv, DropDownDiv and Tooltip. + * @type {?Element} + * @package + */ + var parentContainer: Element; + + /** + * 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 {!Blockly.utils.Size} Contains width and height properties. + */ + function svgSize(svg: SVGElement): Blockly.utils.Size; + + /** + * 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 {!KeyboardEvent} e Key down event. + * @package + */ + function onKeyDown(e: KeyboardEvent): void; + + /** + * Delete the given block. + * @param {!Blockly.BlockSvg} selected The block to delete. + * @package + */ + function deleteBlock(selected: Blockly.BlockSvg): void; + + /** + * Copy a block or workspace comment onto the local clipboard. + * @param {!Blockly.ICopyable} toCopy Block or Workspace Comment to be copied. + * @package + */ + function copy(toCopy: Blockly.ICopyable): void; + + /** + * Paste a block or workspace comment on to the main workspace. + * @return {boolean} True if the paste was successful, false otherwise. + * @package + */ + function paste(): boolean; + + /** + * Duplicate this block and its children, or a workspace comment. + * @param {!Blockly.ICopyable} toDuplicate Block or Workspace Comment to be + * copied. + * @package + */ + function duplicate(toDuplicate: Blockly.ICopyable): 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; + + /** + * Set the parent container. This is the container element that the WidgetDiv, + * DropDownDiv, and Tooltip are rendered into the first time `Blockly.inject` + * is called. + * This method is a NOP if called after the first ``Blockly.inject``. + * @param {!Element} container The container element. + */ + function setParentContainer(container: Element): 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 implements Blockly.IBubble { + + /** + * 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. + * @implements {Blockly.IBubble} + * @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; + + /** + * Update the style of this bubble when it is dragged over a delete area. + * @param {boolean} _enable True if the bubble is about to be deleted, false + * otherwise. + */ + setDeleteStyle(_enable: boolean): void; + + /** + * 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*/; + + /** + * Create the text for a non editable bubble. + * @param {string} text The text to display. + * @return {!SVGTextElement} The top-level node of the text. + * @package + */ + function textToDom(text: string): SVGTextElement; + + /** + * Creates a bubble that can not be edited. + * @param {!SVGTextElement} paragraphElement The text element for the non editable bubble. + * @param {!Blockly.BlockSvg} block The block that the bubble is attached to. + * @param {!Blockly.utils.Coordinate} iconXY The coordinate of the icon. + * @return {!Blockly.Bubble} The non editable bubble. + * @package + */ + function createNonEditableBubble(paragraphElement: SVGTextElement, block: Blockly.BlockSvg, iconXY: Blockly.utils.Coordinate): Blockly.Bubble; +} + + +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.IBubble} bubble The item on the bubble canvas to drag. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. + * @constructor + */ + constructor(bubble: Blockly.IBubble, 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); + + /** + * Draw the comment icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * 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; + + /** + * 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 implements Blockly.IASTNodeLocationWithBlock { + + /** + * Class for a connection between blocks. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @constructor + * @implements {Blockly.IASTNodeLocationWithBlock} + */ + 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + 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 + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + checkConnection(target: Blockly.Connection): void; + + /** + * Get the workspace's connection type checker object. + * @return {!Blockly.IConnectionChecker} The connection type checker for the + * source block's workspace. + * @package + */ + getConnectionChecker(): Blockly.IConnectionChecker; + + /** + * 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + 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[]; + + /** + * Changes the connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + */ + setShadowDom(shadow: Element): void; + + /** + * Returns the xml representation of the 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 ConnectionChecker extends ConnectionChecker__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ConnectionChecker__Class implements Blockly.IConnectionChecker { + + /** + * Class for connection type checking logic. + * @implements {Blockly.IConnectionChecker} + * @constructor + */ + constructor(); + + /** + * Check whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {boolean} Whether the connection is legal. + * @public + */ + canConnect(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): boolean; + + /** + * Checks whether the current connection can connect with the target + * connection, and return an error code if there are problems. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @public + */ + canConnectWithReason(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): number; + + /** + * Helper method that translates a connection error code into a string. + * @param {number} errorCode The error code. + * @param {Blockly.Connection} a One of the two connections being checked. + * @param {Blockly.Connection} b The second of the two connections being + * checked. + * @return {string} A developer-readable error string. + * @public + */ + getErrorMessage(errorCode: number, a: Blockly.Connection, b: Blockly.Connection): string; + + /** + * Check that connecting the given connections is safe, meaning that it would + * not break any of Blockly's basic assumptions (e.g. no self connections). + * @param {Blockly.Connection} a The first of the connections to check. + * @param {Blockly.Connection} b The second of the connections to check. + * @return {number} An enum with the reason this connection is safe or unsafe. + * @public + */ + doSafetyChecks(a: Blockly.Connection, b: Blockly.Connection): number; + + /** + * Check whether this connection is compatible with another connection with + * respect to the value type system. E.g. square_root("Hello") is not + * compatible. + * @param {!Blockly.Connection} a Connection to compare. + * @param {!Blockly.Connection} b Connection to compare against. + * @return {boolean} True if the connections share a type. + * @public + */ + doTypeChecks(a: Blockly.Connection, b: Blockly.Connection): boolean; + + /** + * Check whether this connection can be made by dragging. + * @param {!Blockly.RenderedConnection} a Connection to compare. + * @param {!Blockly.RenderedConnection} b Connection to compare against. + * @param {number} distance The maximum allowable distance between connections. + * @return {boolean} True if the connection is allowed during a drag. + * @public + */ + doDragChecks(a: Blockly.RenderedConnection, b: Blockly.RenderedConnection, distance: number): boolean; + + /** + * Helper function for drag checking. + * @param {!Blockly.Connection} a The connection to check, which must be a + * statement input or next connection. + * @param {!Blockly.Connection} b A nearby connection to check, which + * must be a previous connection. + * @return {boolean} True if the connection is allowed, false otherwise. + * @protected + */ + canConnectToPrevious_(a: Blockly.Connection, b: Blockly.Connection): boolean; + } + +} + + +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. + * @param {!Blockly.IConnectionChecker} checker The workspace's + * connection type checker, used to decide if connections are valid during a + * drag. + * @constructor + */ + constructor(checker: Blockly.IConnectionChecker); + + /** + * 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. + * @param {!Blockly.IConnectionChecker} checker The workspace's + * connection checker, used to decide if connections are valid during a drag. + * @return {!Array.} Array of databases. + */ + function init(checker: Blockly.IConnectionChecker): 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*/; + + /** + * 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; + + /** + * Dispose of the menu. + */ + function dispose(): 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 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.ContextMenuItems { + + /** Option to undo previous action. */ + function registerUndo(): void; + + /** Option to redo previous action. */ + function registerRedo(): void; + + /** Option to clean up blocks. */ + function registerCleanup(): void; + + /** Option to collapse all blocks. */ + function registerCollapse(): void; + + /** Option to expand all blocks. */ + function registerExpand(): void; + + /** Option to delete all blocks. */ + function registerDeleteAll(): void; + + /** Option to duplicate a block. */ + function registerDuplicate(): void; + + /** Option to add or remove block-level comment. */ + function registerComment(): void; + + /** Option to inline variables. */ + function registerInline(): void; + + /** Option to collapse or expand a block. */ + function registerCollapseExpandBlock(): void; + + /** Option to disable or enable a block. */ + function registerDisable(): void; + + /** Option to delete a block. */ + function registerDelete(): void; + + /** Option to open help for a block. */ + function registerHelp(): void; + + /** + * Registers all default context menu items. This should be called once per instance of + * ContextMenuRegistry. + * @package + */ + function registerDefaultOptions(): void; +} + + +declare module Blockly { + + class ContextMenuRegistry extends ContextMenuRegistry__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ContextMenuRegistry__Class { + + /** + * Class for the registry of context menu items. This is intended to be a singleton. You should + * not create a new instance, and only access this class from Blockly.ContextMenuRegistry.registry. + * @constructor + */ + constructor(); + + /** + * Registers a RegistryItem. + * @param {!Blockly.ContextMenuRegistry.RegistryItem} item Context menu item to register. + * @throws {Error} if an item with the given id already exists. + */ + register(item: Blockly.ContextMenuRegistry.RegistryItem): void; + + /** + * Unregisters a RegistryItem with the given id. + * @param {string} id The id of the RegistryItem to remove. + * @throws {Error} if an item with the given id does not exist. + */ + unregister(id: string): void; + + /** + * @param {string} id The id of the RegistryItem to get. + * @returns {?Blockly.ContextMenuRegistry.RegistryItem} RegistryItem or null if not found + */ + getItem(id: string): Blockly.ContextMenuRegistry.RegistryItem; + + /** + * Gets the valid context menu options for the given scope type (e.g. block or workspace) and scope. + * Blocks are only shown if the preconditionFn shows they should not be hidden. + * @param {!Blockly.ContextMenuRegistry.ScopeType} scopeType Type of scope where menu should be + * shown (e.g. on a block or on a workspace) + * @param {!Blockly.ContextMenuRegistry.Scope} scope Current scope of context menu + * (i.e., the exact workspace or block being clicked on) + * @returns {!Array.} the list of ContextMenuOptions + */ + getContextMenuOptions(scopeType: Blockly.ContextMenuRegistry.ScopeType, scope: Blockly.ContextMenuRegistry.Scope): Blockly.ContextMenuRegistry.ContextMenuOption[]; + } + +} + +declare module Blockly.ContextMenuRegistry { + + /** + * Where this menu item should be rendered. If the menu item should be rendered in multiple + * scopes, e.g. on both a block and a workspace, it should be registered for each scope. + * @enum {string} + */ + enum ScopeType { BLOCK, WORKSPACE } + + /** + * The actual workspace/block where the menu is being rendered. This is passed to callback and + * displayText functions that depend on this information. + * @typedef {{ + * block: (Blockly.BlockSvg|undefined), + * workspace: (Blockly.WorkspaceSvg|undefined) + * }} + */ + interface Scope { + block: Blockly.BlockSvg|any /*undefined*/; + workspace: Blockly.WorkspaceSvg|any /*undefined*/ + } + + /** + * A menu item as entered in the registry. + * @typedef {{ + * callback: function(!Blockly.ContextMenuRegistry.Scope), + * scopeType: !Blockly.ContextMenuRegistry.ScopeType, + * displayText: ((function(!Blockly.ContextMenuRegistry.Scope):string)|string), + * preconditionFn: function(!Blockly.ContextMenuRegistry.Scope):string, + * weight: number, + * id: string + * }} + */ + interface RegistryItem { + callback: { (_0: Blockly.ContextMenuRegistry.Scope): any /*missing*/ }; + scopeType: Blockly.ContextMenuRegistry.ScopeType; + displayText: { (_0: Blockly.ContextMenuRegistry.Scope): string }|string; + preconditionFn: { (_0: Blockly.ContextMenuRegistry.Scope): string }; + weight: number; + id: string + } + + /** + * A menu item as presented to contextmenu.js. + * @typedef {{ + * text: string, + * enabled: boolean, + * callback: function(!Blockly.ContextMenuRegistry.Scope), + * scope: !Blockly.ContextMenuRegistry.Scope, + * weight: number + * }} + */ + interface ContextMenuOption { + text: string; + enabled: boolean; + callback: { (_0: Blockly.ContextMenuRegistry.Scope): any /*missing*/ }; + scope: Blockly.ContextMenuRegistry.Scope; + weight: number + } + + /** + * Singleton instance of this class. All interactions with this class should be done on this object. + * @type {?Blockly.ContextMenuRegistry} + */ + var registry: Blockly.ContextMenuRegistry; +} + + +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; + + /** + * 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; + + /** + * Dropdown bounds info object used to encapsulate sizing information about a + * bounding element (bounding box and width/height). + * @typedef {{ + * top:number, + * left:number, + * bottom:number, + * right:number, + * width:number, + * height:number + * }} + */ + interface BoundsInfo { + top: number; + left: number; + bottom: number; + right: number; + width: number; + height: number + } + + /** + * Dropdown position metrics. + * @typedef {{ + * initialX:number, + * initialY:number, + * finalX:number, + * finalY:number, + * arrowX:?number, + * arrowY:?number, + * arrowAtTop:?boolean, + * arrowVisible:boolean + * }} + */ + interface PositionMetrics { + initialX: number; + initialY: number; + finalX: number; + finalY: number; + arrowX: number; + arrowY: number; + arrowAtTop: boolean; + arrowVisible: boolean + } + + /** + * 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.BlockSvg} 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.BlockSvg, 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.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 implements Blockly.IASTNodeLocationSvg, Blockly.IASTNodeLocationWithBlock, Blockly.IBlocklyActionable, Blockly.IRegistrable { + + /** + * 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 + * @implements {Blockly.IASTNodeLocationSvg} + * @implements {Blockly.IASTNodeLocationWithBlock} + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IRegistrable} + */ + 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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 programmatically. + * @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 renderer constant provider. + * @return {?Blockly.blockRendering.ConstantProvider} The renderer constant + * provider. + */ + getConstants(): Blockly.blockRendering.ConstantProvider; + + /** + * 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; + + /** + * 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 programmatically. + * @package + */ + showEditor(opt_e?: Event): void; + + /** + * Updates the size of the field based on the text. + * @param {number=} opt_margin margin to use when positioning the text element. + * @protected + */ + updateSize_(opt_margin?: number): void; + + /** + * Position a field's text element after a size change. This handles both LTR + * and RTL positioning. + * @param {number} xOffset x offset to use when positioning the text element. + * @param {number} contentWidth The content width. + * @protected + */ + positionTextElement_(xOffset: number, contentWidth: number): void; + + /** + * Position a field's border rect after a size change. + * @protected + */ + positionBorderRect_(): 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 {!Blockly.utils.Rect} An object with top, bottom, left, and right in + * pixels relative to the top left corner of the page (window coordinates). + * @package + */ + getScaledBBox(): Blockly.utils.Rect; + + /** + * 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; + + /** + * 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 + */ + 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 overridden 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; + + /** + * Sets the tooltip for this field. + * @param {?Blockly.Tooltip.TipInfo} newTip The + * text for the tooltip, a function that returns the text for the tooltip, a + * parent object whose tooltip will be used, or null to display the tooltip + * of the parent block. To not display a tooltip pass the empty string. + */ + setTooltip(newTip: Blockly.Tooltip.TipInfo): void; + + /** + * Returns the tooltip text for this field. + * @returns {string} The tooltip text for this field. + */ + getTooltip(): string; + + /** + * 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.ShortcutRegistry.KeyboardShortcut} _action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(_action: Blockly.ShortcutRegistry.KeyboardShortcut): 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; + + /** + * Redraw any attached marker or cursor svgs if needed. + * @protected + */ + updateMarkers_(): 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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; + + /** + * Create and show the angle field's editor. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @protected + */ + showEditor_(opt_e?: Event): 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); + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: 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 editability. + */ + CURSOR: any /*missing*/; + + /** + * 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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; + + /** + * Create and show the colour field's editor. + * @protected + */ + showEditor_(): void; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): 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 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[][] }; + + /** + * The prefix field label, of common words set after options are trimmed. + * @type {?string} + * @package + */ + prefixField: string; + + /** + * The suffix field label, of common words set after options are trimmed. + * @type {?string} + * @package + */ + suffixField: string; + + /** + * The dropdown menu. + * @type {Blockly.Menu} + * @protected + */ + menu_: Blockly.Menu; + + /** + * 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; + + /** + * Create a dropdown menu under the text. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @protected + */ + showEditor_(opt_e?: Event): 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; + + /** + * Draws the border with the correct width. + * @protected + */ + render_(): void; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): 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. + * @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); + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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); + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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/multiline-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; + + /** + * 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; + + /** + * 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; + + /** + * 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; + + /** + * 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 { + + /** + * 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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 {!Blockly.IRegistrableField} 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: Blockly.IRegistrableField): 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; + + /** + * The workspace that this field belongs to. + * @type {?Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: 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*/; + + /** + * 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 programmatically. + * @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; + + /** + * Closes the editor, saves the results, and disposes of any events or + * dom-references belonging to the editor. + * @protected + */ + widgetDispose_(): void; + + /** + * 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; + + /** + * Unbind handlers for user input and workspace size changes. + * @protected + */ + unbindInputEvents_(): void; + + /** + * Handle key down to the editor. + * @param {!Event} e Keyboard event. + * @protected + */ + onHtmlInputKeyDown_(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*/; +} + + +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 implements Blockly.IBlocklyActionable, Blockly.IDeleteArea, Blockly.IFlyout { + + /** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @constructor + * @abstract + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IDeleteArea} + * @implements {Blockly.IFlyout} + */ + constructor(workspaceOptions: Blockly.Options); + + /** + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * Whether the flyout should be laid out horizontally or not. + * @type {boolean} + * @package + */ + horizontalLayout: 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; + + /** + * The target workspace + * @type {?Blockly.WorkspaceSvg} + * @package + */ + targetWorkspace: Blockly.WorkspaceSvg; + + /** + * 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName The type of tag to + * put the flyout in. This should be or . + * @return {!SVGElement} The flyout's SVG group. + */ + createDom(tagName: string|Blockly.utils.Svg|Blockly.utils.Svg): SVGElement; + + /** + * Initializes the flyout. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The workspace in which to + * create new blocks. + */ + init(targetWorkspace: Blockly.WorkspaceSvg): void; + + /** + * @type {!Blockly.Scrollbar} + * @package + */ + scrollbar: Blockly.Scrollbar; + + /** + * 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 {!Blockly.utils.toolbox.FlyoutDefinition|string} flyoutDef Contents to display + * in the flyout. This is either an array of Nodes, a NodeList, a + * toolbox definition, or a string with the name of the dynamic category. + */ + show(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition|string): void; + + /** + * Create a block from the xml and permanently disable any blocks that were + * defined as disabled. + * @param {!Element} blockXml The xml of the block. + * @return {!Blockly.BlockSvg} The block created from the blockXml. + * @protected + */ + createBlock_(blockXml: Element): Blockly.BlockSvg; + + /** + * Delete blocks, mats and buttons from a previous showing of the flyout. + * @protected + */ + clearOldBlocks_(): 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.BlockSvg} 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.BlockSvg, 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. + * @throws {Error} 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.BlockSvg} 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.BlockSvg, 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.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the flyout handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): boolean; + + /** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + + /** + * Position the flyout. + * @return {void} + */ + position(): 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 an object with all the metrics required to size scrollbars for the + * flyout. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ + getMetrics_(): Blockly.utils.Metrics; + + /** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ + setMetrics_(xyRatio: { x: number; y: number }): void; + + /** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ + layout_(contents: Object[], gaps: number[]): void; + + /** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ + wheel_(e: Event): void; + + /** + * Compute height of flyout. Position mat under each block. + * For RTL: Lay out the blocks right-aligned. + * @return {void} + * @protected + */ + reflowInternal_(): void; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + } + +} + + +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 {!Blockly.utils.toolbox.ButtonOrLabelInfo} json + * The JSON specifying the label/button. + * @param {boolean} isLabel Whether this button should be styled as a label. + * @constructor + * @package + */ + constructor(workspace: Blockly.WorkspaceSvg, targetWorkspace: Blockly.WorkspaceSvg, json: Blockly.utils.toolbox.ButtonOrLabelInfo, isLabel: boolean); + + /** + * The JSON specifying the label / button. + * @type {!Blockly.utils.toolbox.ButtonOrLabelInfo} + */ + info: Blockly.utils.toolbox.ButtonOrLabelInfo; + + /** + * 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; + + /** + * @return {boolean} Whether or not the button is a label. + */ + isLabel(): boolean; + + /** + * Location of the button. + * @return {!Blockly.utils.Coordinate} x, y coordinates. + * @package + */ + getPosition(): Blockly.utils.Coordinate; + + /** + * @return {string} Text of the button. + */ + getButtonText(): string; + + /** + * 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 horizontal margin around the text in the button. + */ + var MARGIN_X: any /*missing*/; + + /** + * The vertical margin around the text in the button. + */ + var MARGIN_Y: 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.IFlyout} flyout The flyout to drag. + * @extends {Blockly.WorkspaceDragger} + * @constructor + */ + constructor(flyout: Blockly.IFlyout); + + /** + * 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); + + /** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ + getMetrics_(): Blockly.utils.Metrics; + + /** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ + setMetrics_(xyRatio: { x: number; y: number }): void; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + + /** + * Move the flyout to the edge of the workspace. + */ + position(): void; + + /** + * Scroll the flyout to the top. + */ + scrollToStart(): void; + + /** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ + wheel_(e: Event): void; + + /** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ + layout_(contents: Object[], gaps: number[]): 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; + + /** + * Compute height of flyout. Position mat under each block. + * For RTL: Lay out the blocks right-aligned. + * @protected + */ + reflowInternal_(): void; + } + +} + + +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); + + /** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ + getMetrics_(): Blockly.utils.Metrics; + + /** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ + setMetrics_(xyRatio: { x: number; y: number }): void; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + + /** + * Move the flyout to the edge of the workspace. + */ + position(): void; + + /** + * Scroll the flyout to the top. + */ + scrollToStart(): void; + + /** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ + wheel_(e: Event): void; + + /** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ + layout_(contents: Object[], gaps: number[]): 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; + + /** + * Compute width of flyout. Position mat under each block. + * For RTL: Lay out the blocks and buttons to be right-aligned. + * @protected + */ + reflowInternal_(): void; + } + +} + +declare module Blockly.VerticalFlyout { + + /** + * The name of the vertical flyout in the registry. + * @type {string} + */ + var registryName: string; +} + + +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[][]; + + /** + * Whether the init method has been called. + * Generators that set this flag to false after creation and true in init + * will cause blockToCode to emit a warning if the generator has not been + * initialized. If this flag is untouched, it will have no effect. + * @type {?boolean} + */ + isInitialized: boolean; + + /** + * 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). + * The generator must be initialized before calling this function. + * @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.IFlyout} flyout The flyout the event hit. + * @package + */ + handleFlyoutStart(e: Event, flyout: Blockly.IFlyout): 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.IBubble} bubble The bubble the event hit. + * @package + */ + handleBubbleStart(e: Event, bubble: Blockly.IBubble): 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.IBubble} bubble The bubble the gesture started on. + * @package + */ + setStartBubble(bubble: Blockly.IBubble): 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 of the 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 + * @abstract + */ + constructor(block: Blockly.BlockSvg); + + /** + * The block this icon is attached to. + * @type {Blockly.BlockSvg} + * @protected + */ + block_: Blockly.BlockSvg; + + /** + * The icon SVG group. + * @type {?SVGGElement} + */ + iconGroup_: SVGGElement; + + /** + * 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; + + /** + * Draw the icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * Show or hide the icon. + * @param {boolean} visible True if the icon should be visible. + */ + setVisible(visible: boolean): void; + } + +} + + +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. + * @param {boolean=} opt_quiet True to prevent an error if field is not present. + * @return {boolean} True if operation succeeds, false if field is not present + * and opt_quiet is true. + * @throws {Error} if the field is not present and opt_quiet is false. + */ + removeField(name: string, opt_quiet?: boolean): boolean; + + /** + * 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.BlockSvg[]; + + /** + * 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; + + /** + * Changes the connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + * @return {Blockly.Input} The input being modified (to allow chaining). + */ + setShadowDom(shadow: Element): Blockly.Input; + + /** + * Returns the xml representation of the connection's shadow block. + * @return {Element} Shadow DOM representation of a block or null. + */ + getShadowDom(): Element; + + /** + * 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; + + /** + * Update the available connections for the top block. These connections can + * change if a block is unplugged and the stack is healed. + * @package + */ + updateAvailableConnections(): 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 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.InsertionMarkerManager { + + /** + * An enum describing different kinds of previews the InsertionMarkerManager + * could display. + * @enum {number} + */ + enum PREVIEW_TYPE { INSERTION_MARKER, INPUT_OUTLINE, REPLACEMENT_FADE } +} + + +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; + + /** + * Redraw the attached cursor svg if needed. + * @package + */ + updateMarkers(): 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 Menu extends Menu__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Menu__Class { + + /** + * A basic menu class. + * @constructor + */ + 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; + + /** + * Add a new menu item to the bottom of this menu. + * @param {!Blockly.MenuItem} menuItem Menu item to append. + */ + addChild(menuItem: Blockly.MenuItem): void; + + /** + * Creates the menu DOM. + * @param {!Element} container Element upon which to append this menu. + */ + render(container: Element): void; + + /** + * Gets the menu's element. + * @return {Element} The DOM element. + * @package + */ + getElement(): Element; + + /** + * Focus the menu element. + * @package + */ + focus(): void; + + /** + * Set the menu accessibility role. + * @param {!Blockly.utils.aria.Role} roleName role name. + * @package + */ + setRole(roleName: Blockly.utils.aria.Role): void; + + /** + * Dispose of this menu. + */ + dispose(): void; + + /** + * Highlights the given menu item, or clears highlighting if null. + * @param {Blockly.MenuItem} item Item to highlight, or null. + * @package + */ + 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; + + /** + * Get the size of a rendered menu. + * @return {!Blockly.utils.Size} Object with width and height properties. + * @package + */ + getSize(): Blockly.utils.Size; + } + +} + + +declare module Blockly { + + class MenuItem extends MenuItem__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MenuItem__Class { + + /** + * Class representing an item in a menu. + * + * @param {string|!HTMLElement} content Text caption to display as the content + * of the item, or a HTML element to display. + * @param {string=} opt_value Data/model associated with the menu item. + * @constructor + */ + constructor(content: string|HTMLElement, opt_value?: string); + + /** + * Creates the menuitem's DOM. + * @return {!Element} Completed DOM. + */ + createDom(): Element; + + /** + * Dispose of this menu item. + */ + dispose(): void; + + /** + * Gets the menu item's element. + * @return {Element} The DOM element. + * @package + */ + getElement(): Element; + + /** + * Gets the unique ID for this menu item. + * @return {string} Unique component ID. + * @package + */ + getId(): string; + + /** + * Gets the value associated with the menu item. + * @return {*} value Value associated with the menu item. + * @package + */ + getValue(): any; + + /** + * Set menu item's rendering direction. + * @param {boolean} rtl True if RTL, false if LTR. + * @package + */ + setRightToLeft(rtl: boolean): void; + + /** + * Set the menu item's 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; + + /** + * Performs the appropriate action when the menu item is activated + * by the user. + * @package + */ + performAction(): void; + + /** + * Set the handler that's called when the menu item is activated by the user. + * `obj` will be used as the 'this' object in the function when called. + * @param {function(!Blockly.MenuItem)} fn The handler. + * @param {!Object} obj Used as the 'this' object in fn when called. + * @package + */ + onAction(fn: { (_0: Blockly.MenuItem): any /*missing*/ }, obj: Object): 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; + + /** + * Draw the mutator icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * 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); + + /** @type {boolean} */ + RTL: boolean; + + /** @type {boolean} */ + oneBasedIndex: boolean; + + /** @type {boolean} */ + collapse: boolean; + + /** @type {boolean} */ + comments: boolean; + + /** @type {boolean} */ + disable: boolean; + + /** @type {boolean} */ + readOnly: boolean; + + /** @type {number} */ + maxBlocks: number; + + /** @type {?Object.} */ + maxInstances: { [key: string]: number }; + + /** @type {string} */ + pathToMedia: string; + + /** @type {boolean} */ + hasCategories: boolean; + + /** @type {!Blockly.Options.MoveOptions} */ + moveOptions: Blockly.Options.MoveOptions; + + /** @deprecated January 2019 */ + hasScrollbars: any /*missing*/; + + /** @type {boolean} */ + hasTrashcan: boolean; + + /** @type {number} */ + maxTrashcanContents: number; + + /** @type {boolean} */ + hasSounds: boolean; + + /** @type {boolean} */ + hasCss: boolean; + + /** @type {boolean} */ + horizontalLayout: boolean; + + /** @type {?Blockly.utils.toolbox.ToolboxInfo} */ + languageTree: Blockly.utils.toolbox.ToolboxInfo; + + /** @type {!Blockly.Options.GridOptions} */ + gridOptions: Blockly.Options.GridOptions; + + /** @type {!Blockly.Options.ZoomOptions} */ + zoomOptions: Blockly.Options.ZoomOptions; + + /** @type {!Blockly.utils.toolbox.Position} */ + toolboxPosition: Blockly.utils.toolbox.Position; + + /** @type {!Blockly.Theme} */ + theme: Blockly.Theme; + + /** @type {string} */ + renderer: string; + + /** @type {?Object} */ + rendererOverrides: Object; + + /** + * 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. We can assert that this is of type WorkspaceSvg as opposed to + * Workspace as this is only used in a rendered workspace. + * @type {Blockly.WorkspaceSvg} + */ + parentWorkspace: Blockly.WorkspaceSvg; + + /** + * Map of plugin type to name of registered plugin or plugin class. + * @type {!Object.} + */ + plugins: any /*missing*/; + + /** + * If set, sets the translation of the workspace to match the scrollbars. + * @param {!{x:number,y:number}} 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: { x: number; y: number }): void; + + /** + * Return an object with the metrics required to size the workspace. + * @return {!Blockly.utils.Metrics} Contains size and position metrics. + */ + getMetrics(): Blockly.utils.Metrics; + } + + + interface BlocklyOptions { + } +} + +declare module Blockly.Options { + + /** + * Grid Options. + * @typedef {{ + * colour: string, + * length: number, + * snap: boolean, + * spacing: number + * }} + */ + interface GridOptions { + colour: string; + length: number; + snap: boolean; + spacing: number + } + + /** + * Move Options. + * @typedef {{ + * drag: boolean, + * scrollbars: boolean, + * wheel: boolean + * }} + */ + interface MoveOptions { + drag: boolean; + scrollbars: boolean; + wheel: boolean + } + + /** + * Zoom Options. + * @typedef {{ + * controls: boolean, + * maxScale: number, + * minScale: number, + * pinch: boolean, + * scaleSpeed: number, + * startScale: number, + * wheel: boolean + * }} + */ + interface ZoomOptions { + controls: boolean; + maxScale: number; + minScale: number; + pinch: boolean; + scaleSpeed: number; + startScale: number; + wheel: boolean + } + + /** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {?Node|?string} toolboxDef DOM tree of blocks, or text representation + * of same. + * @return {?Node} DOM tree of blocks, or null. + * @deprecated Use Blockly.utils.toolbox.parseToolboxTree. (2020 September 28) + */ + function parseToolboxTree(toolboxDef: 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.registry { + + class Type extends Type__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Type__Class { + + /** + * A name with the type of the element stored in the generic. + * @param {string} name The name of the registry type. + * @constructor + * @template T + */ + constructor(name: string); + } + + + /** + * A map of maps. With the keys being the type and name of the class we are + * registering and the value being the constructor function. + * e.g. {'field': {'field_angle': Blockly.FieldAngle}} + * + * @type {Object>} + */ + var typeMap_: any /*missing*/; + + /** + * The string used to register the default class for a type of plugin. + * @type {string} + */ + var DEFAULT: string; + + /** + * Registers a class based on a type and name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @param {?function(new:T, ...?)|Object} registryItem The class or object to + * register. + * @param {boolean=} opt_allowOverrides True to prevent an error when overriding an + * already registered item. + * @throws {Error} if the type or name is empty, a name with the given type has + * already been registered, or if the given class or object is not valid for it's type. + * @template T + */ + function register(type: string|Blockly.registry.Type, name: string, registryItem: { (_0: any[]): any /*missing*/ }|Object, opt_allowOverrides?: boolean): void; + + /** + * Unregisters the registry item with the given type and name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @template T + */ + function unregister(type: string|Blockly.registry.Type, name: string): void; + + /** + * Gets the registry item for the given name and type. This can be either a + * class or an object. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {?function(new:T, ...?)|Object} The class or object with the given + * name and type or null if none exists. + * @template T + */ + function getItem_(type: string|Blockly.registry.Type, name: string): { (_0: any[]): any /*missing*/ }|Object; + + /** + * Returns whether or not the registry contains an item with the given type and + * name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {boolean} True if the registry has an item with the given type and + * name, false otherwise. + * @template T + */ + function hasItem(type: string|Blockly.registry.Type, name: string): boolean; + + /** + * Gets the class for the given name and type. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {?function(new:T, ...?)} The class with the given name and type or + * null if none exists. + * @template T + */ + function getClass(type: string|Blockly.registry.Type, name: string): { (_0: any[]): any /*missing*/ }; + + /** + * Gets the object for the given name and type. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Category) + * @param {string} name The plugin's name. (Ex. logic_category) + * @returns {T} The object with the given name and type or null if none exists. + * @template T + */ + function getObject(type: string|Blockly.registry.Type, name: string): T; + + /** + * Gets the class from Blockly options for the given type. + * This is used for plugins that override a built in feature. (e.g. Toolbox) + * @param {!Blockly.registry.Type} type The type of the plugin. + * @param {!Blockly.Options} options The option object to check for the given + * plugin. + * @return {?function(new:T, ...?)} The class for the plugin. + * @template T + */ + function getClassFromOptions(type: Blockly.registry.Type, options: Blockly.Options): { (_0: any[]): any /*missing*/ }; +} + +declare module Blockly.registry.Type { + + /** @type {!Blockly.registry.Type} */ + var CONNECTION_CHECKER: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var EVENT: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var FIELD: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var RENDERER: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var TOOLBOX: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var THEME: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var TOOLBOX_ITEM: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var FLYOUTS_VERTICAL_TOOLBOX: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var FLYOUTS_HORIZONTAL_TOOLBOX: Blockly.registry.Type; +} + + +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); + + /** + * Connection this connection connects to. Null if not connected. + * @type {Blockly.RenderedConnection} + */ + targetConnection: Blockly.RenderedConnection; + + /** + * 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. + * @deprecated July 2020 + */ + 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.WorkspaceSvg} workspace Workspace to bind the scrollbars to. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * 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.WorkspaceSvg} 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.WorkspaceSvg, horizontal: boolean, opt_pair?: boolean, opt_class?: string); + + /** + * @type {?number} + * @package + */ + ratio: number; + + /** + * The upper left corner of the scrollbar's SVG group in CSS pixels relative + * to the scrollbar's origin. This is usually relative to the injection div + * origin. + * @type {Blockly.utils.Coordinate} + * @package + */ + position: Blockly.utils.Coordinate; + + /** + * 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; + + /** + * Set the position of the scrollbar's SVG group in CSS pixels relative to the + * scrollbar's origin. This sets the scrollbar's location within the workspace. + * @param {number} x The new x coordinate. + * @param {number} y The new y coordinate. + * @package + */ + setPosition(x: number, y: number): void; + + /** + * Recalculate the scrollbar's location and its length. + * @param {Blockly.utils.Metrics=} 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?: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeViewHorizontal(hostMetrics: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeContentHorizontal(hostMetrics: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeViewVertical(hostMetrics: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeContentVertical(hostMetrics: Blockly.utils.Metrics): 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.ShortcutItems { + + /** + * Object holding the names of the default shortcut items. + * @enum {string} + */ + enum names { ESCAPE, DELETE, COPY, CUT, PASTE, UNDO, REDO } + + /** Keyboard shortcut to hide chaff on escape. */ + function registerEscape(): void; + + /** Keyboard shortcut to delete a block on delete or backspace */ + function registerDelete(): void; + + /** Keyboard shortcut to copy a block on ctrl+c, cmd+c, or alt+c. */ + function registerCopy(): void; + + /** Keyboard shortcut to copy and delete a block on ctrl+x, cmd+x, or alt+x. */ + function registerCut(): void; + + /** Keyboard shortcut to paste a block on ctrl+v, cmd+v, or alt+v. */ + function registerPaste(): void; + + /** Keyboard shortcut to undo the previous action on ctrl+z, cmd+z, or alt+z. */ + function registerUndo(): void; + + /** Keyboard shortcut to redo the previous action on ctrl+shift+z, cmd+shift+z, or alt+shift+z. */ + function registerRedo(): void; + + /** + * Registers all default keyboard shortcut item. This should be called once per instance of + * KeyboardShortcutRegistry. + * @package + */ + function registerDefaultShortcuts(): void; +} + + +declare module Blockly { + + class ShortcutRegistry extends ShortcutRegistry__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ShortcutRegistry__Class { + + /** + * Class for the registry of keyboard shortcuts. This is intended to be a + * singleton. You should not create a new instance, and only access this class + * from Blockly.ShortcutRegistry.registry. + * @constructor + */ + constructor(); + + /** + * Registers a keyboard shortcut. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} shortcut The + * shortcut for this key code. + * @param {boolean=} opt_allowOverrides True to prevent a warning when + * overriding an already registered item. + * @throws {Error} if a shortcut with the same name already exists. + * @public + */ + register(shortcut: Blockly.ShortcutRegistry.KeyboardShortcut, opt_allowOverrides?: boolean): void; + + /** + * Unregisters a keyboard shortcut registered with the given key code. This will + * also remove any key mappings that reference this shortcut. + * @param {string} shortcutName The name of the shortcut to unregister. + * @return {boolean} True if an item was unregistered, false otherwise. + * @public + */ + unregister(shortcutName: string): boolean; + + /** + * Adds a mapping between a keycode and a keyboard shortcut. + * @param {string} keyCode The key code for the keyboard shortcut. If + * registering a key code with a modifier (ex: ctrl+c) use + * Blockly.ShortcutRegistry.registry.createSerializedKey; + * @param {string} shortcutName The name of the shortcut to execute when the + * given keycode is pressed. + * @param {boolean=} opt_allowCollision True to prevent an error when adding a + * shortcut to a key that is already mapped to a shortcut. + * @throws {Error} if the given key code is already mapped to a shortcut. + * @public + */ + addKeyMapping(keyCode: string, shortcutName: string, opt_allowCollision?: boolean): void; + + /** + * Removes a mapping between a keycode and a keyboard shortcut. + * @param {string} keyCode The key code for the keyboard shortcut. If + * registering a key code with a modifier (ex: ctrl+c) use + * Blockly.ShortcutRegistry.registry.createSerializedKey; + * @param {string} shortcutName The name of the shortcut to execute when the + * given keycode is pressed. + * @param {boolean=} opt_quiet True to not console warn when there is no + * shortcut to remove. + * @return {boolean} True if a key mapping was removed, false otherwise. + * @public + */ + removeKeyMapping(keyCode: string, shortcutName: string, opt_quiet?: boolean): boolean; + + /** + * Removes all the key mappings for a shortcut with the given name. + * Useful when changing the default key mappings and the key codes registered to the shortcut are + * unknown. + * @param {string} shortcutName The name of the shortcut to remove from the key map. + * @public + */ + removeAllKeyMappings(shortcutName: string): void; + + /** + * Sets the key map. Setting the key map will override any default key mappings. + * @param {!Object>} keyMap The object with key code to + * shortcut names. + * @public + */ + setKeyMap(keyMap: { [key: string]: string[] }): void; + + /** + * Gets the current key map. + * @return {!Object>} + * The object holding key codes to Blockly.ShortcutRegistry.KeyboardShortcut. + * @public + */ + getKeyMap(): { [key: string]: Blockly.ShortcutRegistry.KeyboardShortcut[] }; + + /** + * Gets the registry of keyboard shortcuts. + * @return {!Object} + * The registry of keyboard shortcuts. + * @public + */ + getRegistry(): { [key: string]: Blockly.ShortcutRegistry.KeyboardShortcut }; + + /** + * Handles key down events. + * @param {!Blockly.Workspace} workspace The main workspace where the event was + * captured. + * @param {!Event} e The key down event. + * @return {boolean} True if the event was handled, false otherwise. + * @public + */ + onKeyDown(workspace: Blockly.Workspace, e: Event): boolean; + + /** + * Gets the shortcuts registered to the given key code. + * @param {string} keyCode The serialized key code. + * @return {!Array|undefined} The list of shortcuts to call when the + * given keyCode is used. Undefined if no shortcuts exist. + * @public + */ + getShortcutNamesByKeyCode(keyCode: string): string[]|any /*undefined*/; + + /** + * Gets the serialized key codes that the shortcut with the given name is + * registered under. + * @param {string} shortcutName The name of the shortcut. + * @return {!Array} An array with all the key codes the shortcut is + * registered under. + * @public + */ + getKeyCodesByShortcutName(shortcutName: string): string[]; + + /** + * Creates 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 modifier key codes to be used with + * the key. All valid modifiers can be found in the + * Blockly.ShortcutRegistry.modifierKeys. + * @return {string} The serialized key code for the given modifiers and key. + * @public + */ + createSerializedKey(keyCode: number, modifiers: string[]): string; + } + +} + +declare module Blockly.ShortcutRegistry { + + /** + * Enum of valid modifiers. + * @enum {!Blockly.utils.KeyCodes} + */ + enum modifierKeys { Shift, Control, Alt, Meta } + + /** + * A keyboard shortcut. + * @typedef {{ + * callback: ((function(!Blockly.Workspace, Event, + * !Blockly.ShortcutRegistry.KeyboardShortcut):boolean)|undefined), + * name: string, + * preconditionFn: ((function(!Blockly.Workspace):boolean)|undefined), + * metadata: (Object|undefined) + * }} + */ + interface KeyboardShortcut { + callback: { (_0: Blockly.Workspace, _1: Event, _2: Blockly.ShortcutRegistry.KeyboardShortcut): boolean }|any /*undefined*/; + name: string; + preconditionFn: { (_0: Blockly.Workspace): boolean }|any /*undefined*/; + metadata: Object|any /*undefined*/ + } +} + + +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.=} opt_blockStyles A map + * from style names (strings) to objects with style attributes for blocks. + * @param {!Object.=} opt_categoryStyles A + * map from style names (strings) to objects with style attributes for + * categories. + * @param {!Blockly.Theme.ComponentStyle=} opt_componentStyles A map of Blockly + * component names to style value. + * @constructor + */ + constructor(name: string, opt_blockStyles?: { [key: string]: Blockly.Theme.BlockStyle }, opt_categoryStyles?: { [key: string]: Blockly.Theme.CategoryStyle }, opt_componentStyles?: Blockly.Theme.ComponentStyle); + + /** + * The theme name. This can be used to reference a specific theme in CSS. + * @type {string} + */ + 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 }; + + /** + * The UI components styles map. + * @type {!Blockly.Theme.ComponentStyle} + * @package + */ + componentStyles: Blockly.Theme.ComponentStyle; + + /** + * The font style. + * @type {!Blockly.Theme.FontStyle} + * @package + */ + fontStyle: Blockly.Theme.FontStyle; + + /** + * Whether or not to add a 'hat' on top of all blocks with no previous or + * output connections. + * @type {?boolean} + * @package + */ + startHats: boolean; + + /** + * Gets the class name that identifies this theme. + * @return {string} The CSS class name. + * @package + */ + getClassName(): string; + + /** + * Overrides or adds a style to the blockStyles map. + * @param {string} blockStyleName The name of the block style. + * @param {Blockly.Theme.BlockStyle} blockStyle The block style. + */ + setBlockStyle(blockStyleName: string, blockStyle: Blockly.Theme.BlockStyle): void; + + /** + * Overrides or adds a style to the categoryStyles map. + * @param {string} categoryStyleName The name of the category style. + * @param {Blockly.Theme.CategoryStyle} categoryStyle The category style. + */ + setCategoryStyle(categoryStyleName: string, categoryStyle: Blockly.Theme.CategoryStyle): void; + + /** + * 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; + + /** + * Configure a theme's font style. + * @param {Blockly.Theme.FontStyle} fontStyle The font style. + */ + setFontStyle(fontStyle: Blockly.Theme.FontStyle): void; + + /** + * Configure a theme's start hats. + * @param {boolean} startHats True if the theme enables start hats, false + * otherwise. + */ + setStartHats(startHats: boolean): 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 + } + + /** + * A component style. + * @typedef {{ + * workspaceBackgroundColour:?string, + * toolboxBackgroundColour:?string, + * toolboxForegroundColour:?string, + * flyoutBackgroundColour:?string, + * flyoutForegroundColour:?string, + * flyoutOpacity:?number, + * scrollbarColour:?string, + * scrollbarOpacity:?number, + * insertionMarkerColour:?string, + * insertionMarkerOpacity:?number, + * markerColour:?string, + * cursorColour:?string, + * selectedGlowColour:?string, + * selectedGlowOpacity:?number, + * replacementGlowColour:?string, + * replacementGlowOpacity:?number + * }} + */ + interface ComponentStyle { + workspaceBackgroundColour: string; + toolboxBackgroundColour: string; + toolboxForegroundColour: string; + flyoutBackgroundColour: string; + flyoutForegroundColour: string; + flyoutOpacity: number; + scrollbarColour: string; + scrollbarOpacity: number; + insertionMarkerColour: string; + insertionMarkerOpacity: number; + markerColour: string; + cursorColour: string; + selectedGlowColour: string; + selectedGlowOpacity: number; + replacementGlowColour: string; + replacementGlowOpacity: number + } + + /** + * A font style. + * @typedef {{ + * family:?string, + * weight:?string, + * size:?number + * }} + */ + interface FontStyle { + family: string; + weight: string; + size: number + } + + /** + * Define a new Blockly theme. + * @param {string} name The name of the theme. + * @param {!Object} themeObj An object containing theme properties. + * @return {!Blockly.Theme} A new Blockly theme. + */ + function defineTheme(name: string, themeObj: Object): Blockly.Theme; +} + + +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.Tooltip { + + /** + * A type which can define a tooltip. + * Either a string, an object containing a tooltip property, or a function which + * returns either a string, or another arbitrarily nested function which + * eventually unwinds to a string. + * @typedef {string|{tooltip}|function(): (string|!Function)} + */ + type TipInfo = string|{ tooltip: any /*missing*/ }|{ (): string|Function }; + + /** + * 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; + + /** + * Returns the tooltip text for the given element. + * @param {?Object} object The object to get the tooltip text of. + * @returns {string} The tooltip text of the element. + */ + function getTooltipOfObject(object: Object): string; + + /** + * 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; + + /** + * Unbinds tooltip mouse events from the SVG element. + * @param {!Element} element SVG element onto which tooltip is bound. + */ + function unbindMouseEvents(element: Element): void; + + /** + * Dispose of the tooltip. + * @package + */ + function dispose(): 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 implements Blockly.IDeleteArea { + + /** + * Class for a trash can. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to sit in. + * @constructor + * @implements {Blockly.IDeleteArea} + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * The trashcan flyout. + * @type {Blockly.IFlyout} + * @package + */ + flyout: Blockly.IFlyout; + + /** + * Current open/close state of the lid. + * @type {boolean} + */ + isLidOpen: 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; + + /** + * Returns true if the trashcan contents-flyout is currently open. + * @return {boolean} True if the trashcan contents-flyout is currently open. + */ + contentsIsOpen(): boolean; + + /** + * Opens the trashcan flyout. + */ + openFlyout(): void; + + /** + * Closes the trashcan flyout. + */ + closeFlyout(): void; + + /** + * Empties the trashcan's contents. If the contents-flyout is currently open + * it will be closed. + */ + emptyContents(): 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 + */ + setLidOpen(state: boolean): void; + + /** + * Flip the lid shut. + * Called externally after a drag. + */ + closeLid(): void; + + /** + * Inspect the contents of the trash. + */ + click(): 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 {!Blockly.utils.Rect} An object containing window width, height, and + * scroll position in window coordinates. + * @package + */ + function getViewportBBox(): Blockly.utils.Rect; + + /** + * 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 coordinates + * @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 { + + 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 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; + + /** + * Opens a prompt that allows the user to enter a new name for a variable. + * Triggers a rename if the new name is valid. Or re-prompts if there is a + * collision. + * @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; + + /** + * Check whether there exists a variable with the given name of any type. + * @param {string} name The name to search for. + * @param {!Blockly.Workspace} workspace The workspace to search for the + * variable. + * @return {Blockly.VariableModel} The variable with the given name, + * or null if none was found. + */ + function nameUsedWithAnyType(name: string, workspace: Blockly.Workspace): Blockly.VariableModel; + + /** + * 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*/; + + /** + * Draw the warning icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * Show or hide the warning bubble. + * @param {boolean} visible True if the bubble should be visible. + */ + setVisible(visible: boolean): 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 {!Blockly.utils.Rect} viewportBBox The bounding rectangle of the + * current viewport, in window coordinates. + * @param {!Blockly.utils.Rect} 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: Blockly.utils.Rect, anchorBBox: Blockly.utils.Rect, 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 implements Blockly.IASTNodeLocation { + + /** + * 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 + * @implements {Blockly.IASTNodeLocation} + */ + 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; + + /** + * An object that encapsulates logic for safety, type, and dragging checks. + * @type {!Blockly.IConnectionChecker} + */ + connectionChecker: Blockly.IConnectionChecker; + + /** + * @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; + + /** + * Adds a block to the list of top blocks. + * @param {!Blockly.Block} block Block to add. + */ + addTopBlock(block: Blockly.Block): void; + + /** + * Removes 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[]; + + /** + * Adds a comment to the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to add. + * @package + */ + addTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Removes 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; + + /** + * 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; + + /** + * Gets the undo stack for workplace. + * @return {!Array.} undo stack + * @package + */ + getUndoStack(): Blockly.Events.Abstract[]; + + /** + * Gets the redo stack for workplace. + * @return {!Array.} redo stack + * @package + */ + getRedoStack(): Blockly.Events.Abstract[]; + + /** + * 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 implements Blockly.IBoundedElement, Blockly.IBubble, Blockly.ICopyable { + + /** + * 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} + * @implements {Blockly.IBoundedElement} + * @implements {Blockly.IBubble} + * @implements {Blockly.ICopyable} + * @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. + * + * @param {boolean=} opt_noSelect Text inside text area will be selected if false + * + * @package + */ + initSvg(opt_noSelect?: boolean): 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; + + /** + * 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; + + /** + * 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 for copying. + * @return {!Blockly.ICopyable.CopyData} Copy metadata. + * @package + */ + toCopyData(): Blockly.ICopyable.CopyData; + } + +} + +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 { + + class WorkspaceSvg extends WorkspaceSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceSvg__Class extends Blockly.Workspace__Class implements Blockly.IASTNodeLocationSvg { + + /** + * 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} + * @implements {Blockly.IASTNodeLocationSvg} + * @constructor + */ + constructor(options: Blockly.Options, opt_blockDragSurface?: Blockly.BlockDragSurfaceSvg, opt_wsDragSurface?: Blockly.WorkspaceDragSurfaceSvg); + + /** @type {function():!Blockly.utils.Metrics} */ + getMetrics: { (): Blockly.utils.Metrics }; + + /** @type {function(!{x:number, y:number}):void} */ + setMetrics: { (_0: { x: number; y: number }): 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} + */ + 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. + * @param {!Event} e The right-click event that triggered the context menu. + */ + configureContextMenu(options: Object[], e: Event): 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName What type of tag the + * flyout belongs in. + * @return {!Element} The element containing the flyout DOM. + * @package + */ + addFlyout(tagName: string|Blockly.utils.Svg|Blockly.utils.Svg): 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.IFlyout} The flyout on this workspace. + * @package + */ + getFlyout(opt_own?: boolean): Blockly.IFlyout; + + /** + * Getter for the toolbox associated with this workspace, if one exists. + * @return {Blockly.IToolbox} The toolbox on this workspace. + * @package + */ + getToolbox(): Blockly.IToolbox; + + /** + * 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; + + /** + * Fires a viewport event if events are enabled and there is a change in + * viewport values. + * @package + */ + maybeFireViewportChangeEvent(): void; + + /** + * 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; + + /** + * 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|!DocumentFragment} xmlBlock XML block element or an empty + * DocumentFragment if the block was an insertion marker. + */ + paste(xmlBlock: Element|DocumentFragment): 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 {?Blockly.utils.toolbox.ToolboxDefinition} toolboxDef + * DOM tree of toolbox contents, string of toolbox contents, or JSON + * representing toolbox definition. + */ + updateToolbox(toolboxDef: Blockly.utils.toolbox.ToolboxDefinition): 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; + + /** + * Get the workspace's zoom factor. If the workspace has a parent, we call into + * the parent to get the workspace scale. + * @return {number} The workspace zoom factor. Units: (pixels / workspaceUnit). + */ + getScale(): number; + + /** + * 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; + + /** + * Adds a block to the list of top blocks. + * @param {!Blockly.Block} block Block to add. + */ + addTopBlock(block: Blockly.Block): void; + + /** + * Removes a block from the list of top blocks. + * @param {!Blockly.Block} block Block to remove. + */ + removeTopBlock(block: Blockly.Block): void; + + /** + * Adds a comment to the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to add. + */ + addTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Removes a comment from the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to remove. + */ + removeTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Adds a bounded element to the list of top bounded elements. + * @param {!Blockly.IBoundedElement} element Bounded element to add. + */ + addTopBoundedElement(element: Blockly.IBoundedElement): void; + + /** + * Removes a bounded element from the list of top bounded elements. + * @param {!Blockly.IBoundedElement} element Bounded element to remove. + */ + removeTopBoundedElement(element: Blockly.IBoundedElement): void; + + /** + * Finds the top-level bounded elements and returns them. + * @return {!Array.} The top-level bounded elements. + */ + getTopBoundedElements(): Blockly.IBoundedElement[]; + + /** + * 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.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|!DocumentFragment} Tree of XML elements or an empty document + * fragment if the block was an insertion marker. + */ + function blockToDomWithXY(block: Blockly.Block, opt_noId?: boolean): Element|DocumentFragment; + + /** + * 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|!DocumentFragment} Tree of XML elements or an empty document + * fragment if the block was an insertion marker. + */ + function blockToDom(block: Blockly.Block, opt_noId?: boolean): Element|DocumentFragment; + + /** + * 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|!DocumentFragment} xmlBlock XML block element or an empty + * DocumentFragment if the block was an insertion marker. + */ + function deleteNext(xmlBlock: Element|DocumentFragment): 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.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=} opt_block The block this event corresponds to. + * Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_block?: Blockly.Block); + + /** + * The block id for the block this event pertains to + * @type {string} + */ + blockId: string; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: 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=} opt_block The changed block. Undefined for a blank + * event. + * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc. + * @param {?string=} opt_name Name of input or field affected, or null. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_element?: string, opt_name?: string, opt_oldValue?: any, opt_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=} opt_block The changed block. Undefined for a blank + * event. + * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc. + * @param {?string=} opt_name Name of input or field affected, or null. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_element?: string, opt_name?: string, opt_oldValue?: any, opt_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=} opt_block The created block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_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. Undefined 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=} opt_block The deleted block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_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=} opt_block The moved block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_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.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 generic event that records a UI change. + * @const + */ + var UI: any /*missing*/; + + /** + * Name of event that record a block drags a block. + * @const + */ + var BLOCK_DRAG: any /*missing*/; + + /** + * Name of event that records a change in selected element. + * @const + */ + var SELECTED: any /*missing*/; + + /** + * Name of event that records a click. + * @const + */ + var CLICK: any /*missing*/; + + /** + * Name of event that records a marker move. + * @const + */ + var MARKER_MOVE: any /*missing*/; + + /** + * Name of event that records a bubble open. + * @const + */ + var BUBBLE_OPEN: any /*missing*/; + + /** + * Name of event that records a trashcan open. + * @const + */ + var TRASHCAN_OPEN: any /*missing*/; + + /** + * Name of event that records a toolbox item select. + * @const + */ + var TOOLBOX_ITEM_SELECT: any /*missing*/; + + /** + * Name of event that records a theme change. + * @const + */ + var THEME_CHANGE: any /*missing*/; + + /** + * Name of event that records a viewport change. + * @const + */ + var VIEWPORT_CHANGE: 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. + * @throws {Error} if an event type is not found in the registry. + */ + 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(); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {?boolean} + */ + isBlank: boolean; + + /** + * 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; + + /** + * Whether or not the event is a ui event. + * @type {boolean} + */ + isUiEvent: 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.Events { + + class BlockDrag extends BlockDrag__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockDrag__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a block drag event. + * @param {!Blockly.Block=} opt_block The top block in the stack that is being + * dragged. Undefined for a blank event. + * @param {boolean=} opt_isStart Whether this is the start of a block drag. + * Undefined for a blank event. + * @param {!Array.=} opt_blocks The blocks affected by this + * drag. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_isStart?: boolean, opt_blocks?: Blockly.Block[]); + + /** + * Whether this is the start of a block drag. + * @type {boolean|undefined} + */ + isStart: boolean|any /*undefined*/; + + /** + * The blocks affected by this drag event. + * @type {!Array.|undefined} + */ + blocks: Blockly.Block[]|any /*undefined*/; + + /** + * 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.Events { + + class BubbleOpen extends BubbleOpen__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BubbleOpen__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a bubble open event. + * @param {Blockly.BlockSvg} opt_block The associated block. Undefined for a + * blank event. + * @param {boolean=} opt_isOpen Whether the bubble is opening (false if + * closing). Undefined for a blank event. + * @param {string=} opt_bubbleType The type of bubble. One of 'mutator', 'comment' + * or 'warning'. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block: Blockly.BlockSvg, opt_isOpen?: boolean, opt_bubbleType?: string); + + /** + * Whether the bubble is opening (false if closing). + * @type {boolean|undefined} + */ + isOpen: boolean|any /*undefined*/; + + /** + * The type of bubble. One of 'mutator', 'comment', or 'warning'. + * @type {string|undefined} + */ + bubbleType: string|any /*undefined*/; + + /** + * 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.Events { + + class Click extends Click__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Click__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a click event. + * @param {?Blockly.Block=} opt_block The affected block. Null for click events + * that do not have an associated block (i.e. workspace click). Undefined + * for a blank event. + * @param {?string=} opt_workspaceId The workspace identifier for this event. + * Not used if block is passed. Undefined for a blank event. + * @param {string=} opt_targetType The type of element targeted by this click + * event. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_workspaceId?: string, opt_targetType?: string); + + /** + * The type of element targeted by this click event. + * @type {string|undefined} + */ + targetType: string|any /*undefined*/; + + /** + * 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.Events { + + class MarkerMove extends MarkerMove__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MarkerMove__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a marker move event. + * @param {?Blockly.Block=} opt_block The affected block. Null if current node + * is of type workspace. Undefined for a blank event. + * @param {boolean=} isCursor Whether this is a cursor event. Undefined for a + * blank event. + * @param {?Blockly.ASTNode=} opt_oldNode The old node the marker used to be on. + * Undefined for a blank event. + * @param {!Blockly.ASTNode=} opt_newNode The new node the marker is now on. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, isCursor?: boolean, opt_oldNode?: Blockly.ASTNode, opt_newNode?: Blockly.ASTNode); + + /** + * The workspace identifier for this event. + * @type {?string} + */ + blockId: string; + + /** + * The old node the marker used to be on. + * @type {?Blockly.ASTNode|undefined} + */ + oldNode: Blockly.ASTNode|any /*undefined*/; + + /** + * The new node the marker is now on. + * @type {Blockly.ASTNode|undefined} + */ + newNode: Blockly.ASTNode|any /*undefined*/; + + /** + * Whether this is a cursor event. + * @type {boolean|undefined} + */ + isCursor: boolean|any /*undefined*/; + + /** + * 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.Events { + + class Selected extends Selected__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Selected__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a selected event. + * @param {?string=} opt_oldElementId The id of the previously selected + * element. Null if no element last selected. Undefined for a blank event. + * @param {?string=} opt_newElementId The id of the selected element. Null if no + * element currently selected (deselect). Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Null if no element previously selected. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_oldElementId?: string, opt_newElementId?: string, opt_workspaceId?: string); + + /** + * The id of the last selected element. + * @type {?string|undefined} + */ + oldElementId: string|any /*undefined*/; + + /** + * The id of the selected element. + * @type {?string|undefined} + */ + newElementId: string|any /*undefined*/; + + /** + * 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.Events { + + class ThemeChange extends ThemeChange__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ThemeChange__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a theme change event. + * @param {string=} opt_themeName The theme name. Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * event. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_themeName?: string, opt_workspaceId?: string); + + /** + * The theme name. + * @type {string|undefined} + */ + themeName: string|any /*undefined*/; + + /** + * 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.Events { + + class ToolboxItemSelect extends ToolboxItemSelect__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxItemSelect__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a toolbox item select event. + * @param {?string=} opt_oldItem The previously selected toolbox item. Undefined + * for a blank event. + * @param {?string=} opt_newItem The newly selected toolbox item. Undefined for + * a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_oldItem?: string, opt_newItem?: string, opt_workspaceId?: string); + + /** + * The previously selected toolbox item. + * @type {?string|undefined} + */ + oldItem: string|any /*undefined*/; + + /** + * The newly selected toolbox item. + * @type {?string|undefined} + */ + newItem: string|any /*undefined*/; + + /** + * 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.Events { + + class TrashcanOpen extends TrashcanOpen__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TrashcanOpen__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a trashcan open event. + * @param {boolean=} opt_isOpen Whether the trashcan flyout is opening (false if + * opening). Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_isOpen?: boolean, opt_workspaceId?: string); + + /** + * Whether the trashcan flyout is opening (false if closing). + * @type {boolean|undefined} + */ + isOpen: boolean|any /*undefined*/; + + /** + * 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.Events { + + class ViewportChange extends ViewportChange__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ViewportChange__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a viewport change event. + * @param {number=} opt_top Top-edge of the visible portion of the workspace, + * relative to the workspace origin. Undefined for a blank event. + * @param {number=} opt_left Left-edge of the visible portion of the workspace, + * relative to the workspace origin. Undefined for a blank event. + * @param {number=} opt_scale The scale of the workspace. Undefined for a blank + * event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_top?: number, opt_left?: number, opt_scale?: number, opt_workspaceId?: string); + + /** + * Top-edge of the visible portion of the workspace, relative to the workspace + * origin. + * @type {number|undefined} + */ + viewTop: number|any /*undefined*/; + + /** + * Left-edge of the visible portion of the workspace, relative to the + * workspace origin. + * @type {number|undefined} + */ + viewLeft: number|any /*undefined*/; + + /** + * The scale of the workspace. + * @type {number|undefined} + */ + scale: number|any /*undefined*/; + + /** + * 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.Events { + + class UiBase extends UiBase__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class UiBase__Class extends Blockly.Events.Abstract__Class { + + /** + * Base 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 {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_workspaceId?: string); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {boolean} + */ + isBlank: boolean; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: string; + + /** + * Whether or not the event is a UI event. + * @type {boolean} + */ + isUiEvent: boolean; + } + + + class Ui extends Ui__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Ui__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a UI event. + * @param {?Blockly.Block=} opt_block The affected block. Null for UI events + * that do not have an associated block. Undefined for a blank event. + * @param {string=} opt_element One of 'selected', 'comment', 'mutatorOpen', + * etc. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.UiBase} + * @deprecated December 2020. Instead use a more specific UI event. + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_element?: string, opt_oldValue?: any, opt_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.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=} opt_variable The variable this event + * corresponds to. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_variable?: Blockly.VariableModel); + + /** + * The variable id for the variable this event pertains to. + * @type {string} + */ + varId: string; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: 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=} opt_variable The created variable. Undefined + * for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(opt_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=} opt_variable The deleted variable. Undefined + * for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(opt_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=} opt_variable The renamed variable. Undefined + * for a blank event. + * @param {string=} newName The new name the variable will be changed to. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(opt_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.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=} opt_workspace The workspace that has finished + * loading. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_workspace?: Blockly.Workspace); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {boolean} + */ + isBlank: boolean; + + /** + * 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.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=} opt_comment The comment this event + * corresponds to. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_comment?: Blockly.WorkspaceComment); + + /** + * Whether or not an event is blank. + * @type {boolean} + */ + isBlank: boolean; + + /** + * 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=} opt_comment The comment that is being + * changed. Undefined for a blank event. + * @param {string=} opt_oldContents Previous contents of the comment. + * @param {string=} opt_newContents New contents of the comment. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_comment?: Blockly.WorkspaceComment, opt_oldContents?: string, opt_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=} opt_comment The created comment. + * Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_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=} opt_comment The deleted comment. + * Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_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=} opt_comment The comment that is being + * moved. Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_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 { + + interface IASTNodeLocation { + } + + interface IASTNodeLocationSvg extends Blockly.IASTNodeLocation { + + /** + * Add the marker svg to this node's svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * svg group. + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * Add the cursor svg to this node's svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * svg group. + */ + setCursorSvg(cursorSvg: SVGElement): void; + } + + interface IASTNodeLocationWithBlock extends Blockly.IASTNodeLocation { + + /** + * Get the source block associated with this node. + * @return {Blockly.Block} The source block. + */ + getSourceBlock(): Blockly.Block; + } + + interface IBlocklyActionable { + + /** + * Handles the given action. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): boolean; + } +} + + +declare module Blockly { + + interface IBoundedElement { + + /** + * Returns the coordinates of a bounded element describing the dimensions of the + * element. + * Coordinate system: workspace coordinates. + * @return {!Blockly.utils.Rect} Object with coordinates of the bounded element. + */ + getBoundingRectangle(): Blockly.utils.Rect; + } +} + + +declare module Blockly { + + interface IBubble extends Blockly.IDeletable, Blockly.IContextMenu { + + /** + * 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; + + /** + * Return the root node of the bubble's SVG group. + * @return {!SVGElement} The root SVG node of the bubble's group. + */ + getSvgRoot(): SVGElement; + + /** + * 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. + */ + setAutoLayout(enable: boolean): void; + + /** + * Triggers a move callback if one exists at the end of a drag. + * @param {boolean} adding True if adding, false if removing. + */ + setDragging(adding: boolean): 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. + */ + moveDuringDrag(dragSurface: Blockly.BlockDragSurfaceSvg, newLoc: Blockly.utils.Coordinate): void; + + /** + * Move the bubble 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. + */ + moveTo(x: number, y: number): void; + + /** + * Update the style of this bubble when it is dragged over a delete area. + * @param {boolean} enable True if the bubble is about to be deleted, false + * otherwise. + */ + setDeleteStyle(enable: boolean): void; + + /** + * Dispose of this bubble. + */ + dispose: any /*missing*/; + } +} + + +declare module Blockly { + + interface IConnectionChecker { + + /** + * Check whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {boolean} Whether the connection is legal. + * @public + */ + canConnect(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): boolean; + + /** + * Checks whether the current connection can connect with the target + * connection, and return an error code if there are problems. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @public + */ + canConnectWithReason(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): number; + + /** + * Helper method that translates a connection error code into a string. + * @param {number} errorCode The error code. + * @param {Blockly.Connection} a One of the two connections being checked. + * @param {Blockly.Connection} b The second of the two connections being + * checked. + * @return {string} A developer-readable error string. + * @public + */ + getErrorMessage(errorCode: number, a: Blockly.Connection, b: Blockly.Connection): string; + + /** + * Check that connecting the given connections is safe, meaning that it would + * not break any of Blockly's basic assumptions (e.g. no self connections). + * @param {Blockly.Connection} a The first of the connections to check. + * @param {Blockly.Connection} b The second of the connections to check. + * @return {number} An enum with the reason this connection is safe or unsafe. + * @public + */ + doSafetyChecks(a: Blockly.Connection, b: Blockly.Connection): number; + + /** + * Check whether this connection is compatible with another connection with + * respect to the value type system. E.g. square_root("Hello") is not + * compatible. + * @param {!Blockly.Connection} a Connection to compare. + * @param {!Blockly.Connection} b Connection to compare against. + * @return {boolean} True if the connections share a type. + * @public + */ + doTypeChecks(a: Blockly.Connection, b: Blockly.Connection): boolean; + + /** + * Check whether this connection can be made by dragging. + * @param {!Blockly.RenderedConnection} a Connection to compare. + * @param {!Blockly.RenderedConnection} b Connection to compare against. + * @param {number} distance The maximum allowable distance between connections. + * @return {boolean} True if the connection is allowed during a drag. + * @public + */ + doDragChecks(a: Blockly.RenderedConnection, b: Blockly.RenderedConnection, distance: number): boolean; + } +} + + +declare module Blockly { + + interface IContextMenu { + + /** + * Show the context menu for this object. + * @param {!Event} e Mouse event. + */ + showContextMenu(e: Event): void; + } +} + + +declare module Blockly { + + interface ICopyable extends Blockly.ISelectable { + + /** + * Encode for copying. + * @return {?Blockly.ICopyable.CopyData} Copy metadata. + */ + toCopyData(): Blockly.ICopyable.CopyData; + } +} + +declare module Blockly.ICopyable { + + /** + * Copy Metadata. + * @typedef {{ + * xml:!Element, + * source:Blockly.WorkspaceSvg, + * typeCounts:?Object + * }} + */ + interface CopyData { + xml: Element; + source: Blockly.WorkspaceSvg; + typeCounts: Object + } +} + + +declare module Blockly { + + interface IDeletable { + + /** + * Get whether this object is deletable or not. + * @return {boolean} True if deletable. + */ + isDeletable(): boolean; + } +} + + +declare module Blockly { + + interface IDeleteArea { + + /** + * Return the deletion rectangle. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + } +} + + +declare module Blockly { + + interface IFlyout extends Blockly.IRegistrable { + + /** + * Whether the flyout is laid out horizontally or not. + * @type {boolean} + */ + horizontalLayout: boolean; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * The target workspace + * @type {?Blockly.WorkspaceSvg} + */ + targetWorkspace: Blockly.WorkspaceSvg; + + /** + * Margin around the edges of the blocks in the flyout. + * @type {number} + * @const + */ + MARGIN: 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; + + /** + * 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName The type of tag to + * put the flyout in. This should be or . + * @return {!SVGElement} The flyout's SVG group. + */ + createDom(tagName: string|Blockly.utils.Svg|Blockly.utils.Svg): 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. + */ + dispose: any /*missing*/; + + /** + * 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. + */ + 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; + + /** + * Hide and empty the flyout. + */ + hide: any /*missing*/; + + /** + * Show and populate the flyout. + * @param {!Blockly.utils.toolbox.FlyoutDefinition|string} flyoutDef Contents to + * display in the flyout. This is either an array of Nodes, a NodeList, a + * toolbox definition, or a string with the name of the dynamic category. + */ + show(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition|string): void; + + /** + * 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. + * @throws {Error} if something went wrong with deserialization. + */ + createBlock(originalBlock: Blockly.BlockSvg): Blockly.BlockSvg; + + /** + * Reflow blocks and their mats. + */ + reflow: any /*missing*/; + + /** + * @return {boolean} True if this flyout may be scrolled with a scrollbar or by + * dragging. + */ + isScrollable(): boolean; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + + /** + * Position the flyout. + * @return {void} + */ + position(): 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. + */ + isDragTowardWorkspace(currentDragDeltaXY: Blockly.utils.Coordinate): boolean; + } +} + + +declare module Blockly { + + interface IMovable { + + /** + * Get whether this is movable or not. + * @return {boolean} True if movable. + */ + isMovable(): boolean; + } +} + + +declare module Blockly { + + interface IRegistrable { + } +} + + +declare module Blockly { + + /** + * A registrable field. + * Note: We are not using an interface here as we are interested in defining the + * static methods of a field rather than the instance methods. + * @typedef {{ + * fromJson:Blockly.IRegistrableField.fromJson + * }} + */ + interface IRegistrableField { + fromJson: Blockly.IRegistrableField.fromJson + } +} + +declare module Blockly.IRegistrableField { + + /** + * @typedef {function(!Object): Blockly.Field} + */ + interface fromJson { + (_0: Object): Blockly.Field + } +} + + +declare module Blockly { + + interface ISelectable extends Blockly.IDeletable, Blockly.IMovable { + + /** + * @type {string} + */ + id: string; + + /** + * Select this. Highlight it visually. + * @return {void} + */ + select(): void; + + /** + * Unselect this. Unhighlight it visually. + * @return {void} + */ + unselect(): void; + } +} + + +declare module Blockly { + + interface IStyleable { + + /** + * Adds a style on the toolbox. Usually used to change the cursor. + * @param {string} style The name of the class to add. + */ + 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. + */ + removeStyle(style: string): void; + } +} + + +declare module Blockly { + + interface IToolbox extends Blockly.IRegistrable { + + /** + * Initializes the toolbox. + * @return {void} + */ + init(): void; + + /** + * Fills the toolbox with new toolbox items and removes any old contents. + * @param {!Blockly.utils.toolbox.ToolboxInfo} toolboxDef Object holding information + * for creating a toolbox. + */ + render(toolboxDef: Blockly.utils.toolbox.ToolboxInfo): void; + + /** + * Gets the width of the toolbox. + * @return {number} The width of the toolbox. + */ + getWidth(): number; + + /** + * Gets the height of the toolbox. + * @return {number} The width of the toolbox. + */ + getHeight(): number; + + /** + * Gets the toolbox flyout. + * @return {?Blockly.IFlyout} The toolbox flyout. + */ + getFlyout(): Blockly.IFlyout; + + /** + * Gets the workspace for the toolbox. + * @return {!Blockly.WorkspaceSvg} The parent workspace for the toolbox. + */ + getWorkspace(): Blockly.WorkspaceSvg; + + /** + * Gets whether or not the toolbox is horizontal. + * @return {boolean} True if the toolbox is horizontal, false if the toolbox is + * vertical. + */ + isHorizontal(): boolean; + + /** + * Positions the toolbox based on whether it is a horizontal toolbox and whether + * the workspace is in rtl. + * @return {void} + */ + position(): void; + + /** + * Handles resizing the toolbox when a toolbox item resizes. + * @return {void} + */ + handleToolboxItemResize(): void; + + /** + * Unhighlights any previously selected item. + * @return {void} + */ + clearSelection(): void; + + /** + * Updates the category colours and background colour of selected categories. + * @return {void} + */ + refreshTheme(): void; + + /** + * Updates the flyout's content without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + * @return {void} + */ + refreshSelection(): void; + + /** + * Sets the visibility of the toolbox. + * @param {boolean} isVisible True if toolbox should be visible. + */ + setVisible(isVisible: boolean): void; + + /** + * Selects the toolbox item by it's position in the list of toolbox items. + * @param {number} position The position of the item to select. + * @return {void} + */ + selectItemByPosition(position: number): void; + + /** + * Gets the selected item. + * @return {?Blockly.IToolboxItem} The selected item, or null if no item is + * currently selected. + */ + getSelectedItem(): Blockly.IToolboxItem; + + /** + * Disposes of this toolbox. + * @return {void} + */ + dispose(): void; + } +} + + +declare module Blockly { + + interface IToolboxItem { + + /** + * Initializes the toolbox item. + * This includes creating the dom and updating the state of any items based + * on the info object. + * @return {void} + * @public + */ + init(): void; + + /** + * Gets the div for the toolbox item. + * @return {?Element} The div for the toolbox item. + * @public + */ + getDiv(): Element; + + /** + * Gets a unique identifier for this toolbox item. + * @return {string} The id for the toolbox item. + * @public + */ + getId(): string; + + /** + * Gets the parent if the toolbox item is nested. + * @return {?Blockly.IToolboxItem} The parent toolbox item, or null if + * this toolbox item is not nested. + * @public + */ + getParent(): Blockly.IToolboxItem; + + /** + * Gets the nested level of the category. + * @return {number} The nested level of the category. + * @package + */ + getLevel(): number; + + /** + * Whether the toolbox item is selectable. + * @return {boolean} True if the toolbox item can be selected. + * @public + */ + isSelectable(): boolean; + + /** + * Whether the toolbox item is collapsible. + * @return {boolean} True if the toolbox item is collapsible. + * @public + */ + isCollapsible(): boolean; + + /** + * Dispose of this toolbox item. No-op by default. + * @public + */ + dispose: any /*missing*/; + } + + interface ISelectableToolboxItem extends Blockly.IToolboxItem { + + /** + * Gets the name of the toolbox item. Used for emitting events. + * @return {string} The name of the toolbox item. + * @public + */ + getName(): string; + + /** + * Gets the contents of the toolbox item. These are items that are meant to be + * displayed in the flyout. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray|string} The definition + * of items to be displayed in the flyout. + * @public + */ + getContents(): Blockly.utils.toolbox.FlyoutItemInfoArray|string; + + /** + * Sets the current toolbox item as selected. + * @param {boolean} _isSelected True if this category is selected, false + * otherwise. + * @public + */ + setSelected(_isSelected: boolean): void; + + /** + * Gets the html element that is clickable. + * The parent toolbox element receives clicks. The parent toolbox will add an id to this element so + * it can pass the onClick event to the correct toolboxItem. + * @return {!Element} The html element that receives clicks. + * @public + */ + getClickTarget(): Element; + + /** + * Handles when the toolbox item is clicked. + * @param {!Event} _e Click event to handle. + * @public + */ + onClick(_e: Event): void; + } + + interface ICollapsibleToolboxItem extends Blockly.ISelectableToolboxItem { + + /** + * Gets any children toolbox items. (ex. Gets the subcategories) + * @return {!Array} The child toolbox items. + */ + getChildToolboxItems(): Blockly.IToolboxItem[]; + + /** + * Whether the toolbox item is expanded to show its child subcategories. + * @return {boolean} True if the toolbox item shows its children, false if it + * is collapsed. + * @public + */ + isExpanded(): boolean; + + /** + * Toggles whether or not the toolbox item is expanded. + * @public + */ + toggleExpanded: any /*missing*/; + } +} + + +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 Blockly.ASTNode.types. + * @param {!Blockly.IASTNodeLocation} location The position in the AST. + * @param {!Blockly.ASTNode.Params=} opt_params Optional dictionary of options. + * @constructor + */ + constructor(type: string, location: Blockly.IASTNodeLocation, opt_params?: Blockly.ASTNode.Params); + + /** + * 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.IASTNodeLocation} The current field, connection, workspace, or + * block the cursor is on. + */ + getLocation(): Blockly.IASTNodeLocation; + + /** + * 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 { + + /** + * @typedef {{ + * wsCoordinate: Blockly.utils.Coordinate + * }} + */ + interface Params { + wsCoordinate: Blockly.utils.Coordinate + } + + /** + * 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; + + /** + * Creates an AST node for the top position on a block. + * This is either an output connection, previous connection, or 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 position on the + * block. + */ + function createTopNode(block: Blockly.Block): 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 implements Blockly.IBlocklyActionable { + + /** + * Class for a cursor. + * A cursor controls how a user navigates the Blockly AST. + * @constructor + * @extends {Blockly.Marker} + * @implements {Blockly.IBlocklyActionable} + */ + 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.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): 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 { + + 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; + + /** + * Get the workspace that is being navigated. + * @return {!Blockly.WorkspaceSvg} The workspace being navigated. + * TODO: Remove this in favor or using passed in workspaces. + */ + function getNavigationWorkspace(): Blockly.WorkspaceSvg; + + /** + * 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. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + */ + function insertFromFlyout(workspace: Blockly.WorkspaceSvg): 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.BlockSvg} block The block to move. + * @param {!Blockly.RenderedConnection} destConnection The connection to connect + * to. + * @return {boolean} Whether the connection was successful. + */ + function insertBlock(block: Blockly.BlockSvg, destConnection: Blockly.RenderedConnection): boolean; + + /** + * Set the current navigation state. + * @param {number} newState The new navigation state. + * @package + */ + function setState(newState: number): void; + + /** + * Before a block is deleted move the cursor to the appropriate position. + * @param {!Blockly.BlockSvg} deletedBlock The block that is being deleted. + */ + function moveCursorOnBlockDelete(deletedBlock: Blockly.BlockSvg): void; + + /** + * When a block that the cursor is on is mutated move the cursor to the block + * level. + * @param {!Blockly.BlockSvg} mutatedBlock The block that is being mutated. + * @package + */ + function moveCursorOnBlockMutation(mutatedBlock: Blockly.BlockSvg): void; + + /** + * Enable accessibility mode. + */ + function enableKeyboardAccessibility(): void; + + /** + * Disable accessibility mode. + */ + function disableKeyboardAccessibility(): void; + + /** + * Keyboard shortcut to go to the previous location when in keyboard navigation + * mode. + */ + function registerPrevious(): void; + + /** + * Keyboard shortcut to go to the out location when in keyboard navigation + * mode. + */ + function registerOut(): void; + + /** + * Keyboard shortcut to go to the next location when in keyboard navigation + * mode. + */ + function registerNext(): void; + + /** + * Keyboard shortcut to go to the in location when in keyboard navigation mode. + */ + function registerIn(): void; + + /** + * Keyboard shortcut to connect a block to a marked location when in keyboard + * navigation mode. + */ + function registerInsert(): void; + + /** Keyboard shortcut to mark a location when in keyboard navigation mode. */ + function registerMark(): void; + + /** + * Keyboard shortcut to disconnect two blocks when in keyboard navigation mode. + */ + function registerDisconnect(): void; + + /** + * Keyboard shortcut to focus on the toolbox when in keyboard navigation mode. + */ + function registerToolboxFocus(): void; + + /** + * Keyboard shortcut to exit the current location and focus on the workspace + * when in keyboard navigation mode. + */ + function registerExit(): void; + + /** Keyboard shortcut to turn keyboard navigation on or off. */ + function registerToggleKeyboardNav(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace to the left when in + * keyboard navigation mode. + */ + function registerWorkspaceMoveLeft(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace to the right when in + * keyboard navigation mode. + */ + function registerWorkspaceMoveRight(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace up when in keyboard + * navigation mode. + */ + function registerWorkspaceMoveUp(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace down when in keyboard + * navigation mode. + */ + function registerWorkspaceMoveDown(): void; + + /** + * Registers all default keyboard shortcut items for keyboard navigation. This + * should be called once per instance of KeyboardShortcutRegistry. + * @package + */ + function registerNavigationShortcuts(): void; +} + + +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 { + + class ToolboxCategory extends ToolboxCategory__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxCategory__Class extends Blockly.ToolboxItem__Class implements Blockly.ISelectableToolboxItem { + + /** + * Class for a category in a toolbox. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The information needed + * to create a category in the toolbox. + * @param {!Blockly.IToolbox} toolbox The parent toolbox for the category. + * @param {Blockly.ICollapsibleToolboxItem=} opt_parent The parent category or null if + * the category does not have a parent. + * @constructor + * @extends {Blockly.ToolboxItem} + * @implements {Blockly.ISelectableToolboxItem} + */ + constructor(categoryDef: Blockly.utils.toolbox.CategoryInfo, toolbox: Blockly.IToolbox, opt_parent?: Blockly.ICollapsibleToolboxItem); + + /** + * The name that will be displayed on the category. + * @type {string} + * @protected + */ + name_: string; + + /** + * The colour of the category. + * @type {string} + * @protected + */ + colour_: string; + + /** + * The html container for the category. + * @type {?Element} + * @protected + */ + htmlDiv_: Element; + + /** + * The html element for the category row. + * @type {?Element} + * @protected + */ + rowDiv_: Element; + + /** + * The html element that holds children elements of the category row. + * @type {?Element} + * @protected + */ + rowContents_: Element; + + /** + * The html element for the toolbox icon. + * @type {?Element} + * @protected + */ + iconDom_: Element; + + /** + * The html element for the toolbox label. + * @type {?Element} + * @protected + */ + labelDom_: Element; + + /** + * All the css class names that are used to create a category. + * @type {!Blockly.ToolboxCategory.CssConfig} + * @protected + */ + cssConfig_: Blockly.ToolboxCategory.CssConfig; + + /** + * True if the category is meant to be hidden, false otherwise. + * @type {boolean} + * @protected + */ + isHidden_: boolean; + + /** + * True if this category is disabled, false otherwise. + * @type {boolean} + * @protected + */ + isDisabled_: boolean; + + /** + * The flyout items for this category. + * @type {string|!Blockly.utils.toolbox.FlyoutItemInfoArray} + * @protected + */ + flyoutItems_: string|Blockly.utils.toolbox.FlyoutItemInfoArray; + + /** + * Creates an object holding the default classes for a category. + * @return {!Blockly.ToolboxCategory.CssConfig} The configuration object holding + * all the CSS classes for a category. + * @protected + */ + makeDefaultCssConfig_(): Blockly.ToolboxCategory.CssConfig; + + /** + * Parses the contents array depending on if the category is a dynamic category, + * or if its contents are meant to be shown in the flyout. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The information needed + * to create a category. + * @protected + */ + parseContents_(categoryDef: Blockly.utils.toolbox.CategoryInfo): void; + + /** + * Creates the dom for the category. + * @return {!Element} The parent element for the category. + * @protected + */ + createDom_(): Element; + + /** + * Creates the container that holds the row and any subcategories. + * @return {!Element} The div that holds the icon and the label. + * @protected + */ + createContainer_(): Element; + + /** + * Creates the parent of the contents container. All clicks will happen on this + * div. + * @return {!Element} The div that holds the contents container. + * @protected + */ + createRowContainer_(): Element; + + /** + * Creates the container for the label and icon. + * This is necessary so we can set all subcategory pointer events to none. + * @return {!Element} The div that holds the icon and the label. + * @protected + */ + createRowContentsContainer_(): Element; + + /** + * Creates the span that holds the category icon. + * @return {!Element} The span that holds the category icon. + * @protected + */ + createIconDom_(): Element; + + /** + * Creates the span that holds the category label. + * This should have an id for accessibility purposes. + * @param {string} name The name of the category. + * @return {!Element} The span that holds the category label. + * @protected + */ + createLabelDom_(name: string): Element; + + /** + * Updates the colour for this category. + * @public + */ + refreshTheme(): void; + + /** + * Add the strip of colour to the toolbox category. + * @param {string} colour The category colour. + * @protected + */ + addColourBorder_(colour: string): void; + + /** + * Gets either the colour or the style for a category. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The object holding + * information on the category. + * @return {string} The hex colour for the category. + * @protected + */ + getColour_(categoryDef: Blockly.utils.toolbox.CategoryInfo): string; + + /** + * Gets the html element that is clickable. + * The parent toolbox element receives clicks. The parent toolbox will add an id to this element so + * it can pass the onClick event to the correct toolboxItem. + * @return {!Element} The html element that receives clicks. + * @public + */ + getClickTarget(): Element; + + /** + * Adds appropriate classes to display an open icon. + * @param {?Element} iconDiv The div that holds the icon. + * @protected + */ + openIcon_(iconDiv: Element): void; + + /** + * Adds appropriate classes to display a closed icon. + * @param {?Element} iconDiv The div that holds the icon. + * @protected + */ + closeIcon_(iconDiv: Element): void; + + /** + * Sets whether the category is visible or not. + * For a category to be visible its parent category must also be expanded. + * @param {boolean} isVisible True if category should be visible. + * @protected + */ + setVisible_(isVisible: boolean): void; + + /** + * Hide the category. + */ + hide(): void; + + /** + * Show the category. Category will only appear if its parent category is also + * expanded. + */ + show(): void; + + /** + * Whether the category is visible. + * A category is only visible if all of its ancestors are expanded and isHidden_ is false. + * @return {boolean} True if the category is visible, false otherwise. + * @public + */ + isVisible(): boolean; + + /** + * Whether all ancestors of a category (parent and parent's parent, etc.) are expanded. + * @return {boolean} True only if every ancestor is expanded + * @protected + */ + allAncestorsExpanded_(): boolean; + + /** + * Handles when the toolbox item is clicked. + * @param {!Event} _e Click event to handle. + * @public + */ + onClick(_e: Event): void; + + /** + * Sets the current category as selected. + * @param {boolean} isSelected True if this category is selected, false + * otherwise. + * @public + */ + setSelected(isSelected: boolean): void; + + /** + * Sets whether the category is disabled. + * @param {boolean} isDisabled True to disable the category, false otherwise. + */ + setDisabled(isDisabled: boolean): void; + + /** + * Gets the name of the category. Used for emitting events. + * @return {string} The name of the toolbox item. + * @public + */ + getName(): string; + + /** + * Gets the contents of the category. These are items that are meant to be + * displayed in the flyout. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray|string} The definition + * of items to be displayed in the flyout. + * @public + */ + getContents(): Blockly.utils.toolbox.FlyoutItemInfoArray|string; + + /** + * Updates the contents to be displayed in the flyout. + * If the flyout is open when the contents are updated, refreshSelection on the + * toolbox must also be called. + * @param {!Blockly.utils.toolbox.FlyoutDefinition|string} contents The contents + * to be displayed in the flyout. A string can be supplied to create a + * dynamic category. + * @public + */ + updateFlyoutContents(contents: Blockly.utils.toolbox.FlyoutDefinition|string): void; + } + +} + +declare module Blockly.ToolboxCategory { + + /** + * All the css class names that are used to create a category. + * @typedef {{ + * container:(string|undefined), + * row:(string|undefined), + * rowcontentcontainer:(string|undefined), + * icon:(string|undefined), + * label:(string|undefined), + * selected:(string|undefined), + * openicon:(string|undefined), + * closedicon:(string|undefined) + * }} + */ + interface CssConfig { + container: string|any /*undefined*/; + row: string|any /*undefined*/; + rowcontentcontainer: string|any /*undefined*/; + icon: string|any /*undefined*/; + label: string|any /*undefined*/; + selected: string|any /*undefined*/; + openicon: string|any /*undefined*/; + closedicon: string|any /*undefined*/ + } + + /** + * Name used for registering a toolbox category. + * @const {string} + */ + var registrationName: any /*missing*/; + + /** + * The number of pixels to move the category over at each nested level. + * @type {number} + */ + var nestedPadding: number; + + /** + * The width in pixels of the strip of colour next to each category. + * @type {number} + */ + var borderWidth: number; + + /** + * The default colour of the category. This is used as the background colour of + * the category when it is selected. + * @type {string} + */ + var defaultBackgroundColour: string; +} + + +declare module Blockly { + + class CollapsibleToolboxCategory extends CollapsibleToolboxCategory__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CollapsibleToolboxCategory__Class extends Blockly.ToolboxCategory__Class implements Blockly.ICollapsibleToolboxItem { + + /** + * Class for a category in a toolbox that can be collapsed. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The information needed + * to create a category in the toolbox. + * @param {!Blockly.IToolbox} toolbox The parent toolbox for the category. + * @param {Blockly.ICollapsibleToolboxItem=} opt_parent The parent category or null if + * the category does not have a parent. + * @constructor + * @extends {Blockly.ToolboxCategory} + * @implements {Blockly.ICollapsibleToolboxItem} + */ + constructor(categoryDef: Blockly.utils.toolbox.CategoryInfo, toolbox: Blockly.IToolbox, opt_parent?: Blockly.ICollapsibleToolboxItem); + + /** + * Container for any child categories. + * @type {?Element} + * @protected + */ + subcategoriesDiv_: Element; + + /** + * Whether or not the category should display its subcategories. + * @type {boolean} + * @protected + */ + expanded_: boolean; + + /** + * The child toolbox items for this category. + * @type {!Array} + * @protected + */ + toolboxItems_: Blockly.ToolboxItem[]; + + /** + * Create the dom for all subcategories. + * @param {!Array} subcategories The subcategories. + * @return {!Element} The div holding all the subcategories. + * @protected + */ + createSubCategoriesDom_(subcategories: Blockly.ToolboxItem[]): Element; + + /** + * Opens or closes the current category. + * @param {boolean} isExpanded True to expand the category, false to close. + * @public + */ + setExpanded(isExpanded: boolean): void; + + /** + * Whether the category is expanded to show its child subcategories. + * @return {boolean} True if the toolbox item shows its children, false if it + * is collapsed. + * @public + */ + isExpanded(): boolean; + + /** + * Toggles whether or not the category is expanded. + * @public + */ + toggleExpanded(): void; + + /** + * Gets any children toolbox items. (ex. Gets the subcategories) + * @return {!Array} The child toolbox items. + */ + getChildToolboxItems(): Blockly.IToolboxItem[]; + } + +} + +declare module Blockly.CollapsibleToolboxCategory { + + /** + * All the css class names that are used to create a collapsible + * category. This is all the properties from the regular category plus contents. + * @typedef {{ + * container:?string, + * row:?string, + * rowcontentcontainer:?string, + * icon:?string, + * label:?string, + * selected:?string, + * openicon:?string, + * closedicon:?string, + * contents:?string + * }} + */ + interface CssConfig { + container: string; + row: string; + rowcontentcontainer: string; + icon: string; + label: string; + selected: string; + openicon: string; + closedicon: string; + contents: string + } + + /** + * Name used for registering a collapsible toolbox category. + * @const {string} + */ + var registrationName: any /*missing*/; +} + + +declare module Blockly { + + class ToolboxSeparator extends ToolboxSeparator__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxSeparator__Class extends Blockly.ToolboxItem__Class implements Blockly.IToolboxItem { + + /** + * Class for a toolbox separator. This is the thin visual line that appears on + * the toolbox. This item is not interactable. + * @param {!Blockly.utils.toolbox.SeparatorInfo} separatorDef The information + * needed to create a separator. + * @param {!Blockly.IToolbox} toolbox The parent toolbox for the separator. + * @constructor + * @extends {Blockly.ToolboxItem} + * @implements {Blockly.IToolboxItem} + */ + constructor(separatorDef: Blockly.utils.toolbox.SeparatorInfo, toolbox: Blockly.IToolbox); + + /** + * All the css class names that are used to create a separator. + * @type {!Blockly.ToolboxSeparator.CssConfig} + * @protected + */ + cssConfig_: Blockly.ToolboxSeparator.CssConfig; + + /** + * Creates the dom for a separator. + * @return {!Element} The parent element for the separator. + * @protected + */ + createDom_(): Element; + } + +} + +declare module Blockly.ToolboxSeparator { + + /** + * All the css class names that are used to create a separator. + * @typedef {{ + * container:(string|undefined) + * }} + */ + interface CssConfig { + container: string|any /*undefined*/ + } + + /** + * Name used for registering a toolbox separator. + * @const {string} + */ + var registrationName: any /*missing*/; +} + + +declare module Blockly { + + class Toolbox extends Toolbox__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Toolbox__Class implements Blockly.IBlocklyActionable, Blockly.IDeleteArea, Blockly.IStyleable, Blockly.IToolbox { + + /** + * Class for a Toolbox. + * Creates the toolbox's DOM. + * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to create new + * blocks. + * @constructor + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IDeleteArea} + * @implements {Blockly.IStyleable} + * @implements {Blockly.IToolbox} + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * The workspace this toolbox is on. + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * The JSON describing the contents of this toolbox. + * @type {!Blockly.utils.toolbox.ToolboxInfo} + * @protected + */ + toolboxDef_: Blockly.utils.toolbox.ToolboxInfo; + + /** + * The html container for the toolbox. + * @type {?Element} + */ + HtmlDiv: Element; + + /** + * The html container for the contents of a toolbox. + * @type {?Element} + * @protected + */ + contentsDiv_: Element; + + /** + * The list of items in the toolbox. + * @type {!Array} + * @protected + */ + contents_: Blockly.IToolboxItem[]; + + /** + * The width of the toolbox. + * @type {number} + * @protected + */ + width_: number; + + /** + * The height of the toolbox. + * @type {number} + * @protected + */ + height_: number; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * A map from toolbox item IDs to toolbox items. + * @type {!Object} + * @protected + */ + contentMap_: { [key: string]: Blockly.IToolboxItem }; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {!Blockly.utils.toolbox.Position} + */ + toolboxPosition: Blockly.utils.toolbox.Position; + + /** + * The currently selected item. + * @type {?Blockly.ISelectableToolboxItem} + * @protected + */ + selectedItem_: Blockly.ISelectableToolboxItem; + + /** + * The previously selected item. + * @type {?Blockly.ISelectableToolboxItem} + * @protected + */ + previouslySelectedItem_: Blockly.ISelectableToolboxItem; + + /** + * Array holding info needed to unbind event handlers. + * Used for disposing. + * Ex: [[node, name, func], [node, name, func]]. + * @type {!Array} + * @protected + */ + boundEvents_: Blockly.EventData[]; + + /** + * Initializes the toolbox + * @public + */ + init(): void; + + /** + * Creates the dom for the toolbox. + * @param {!Blockly.WorkspaceSvg} workspace The workspace this toolbox is on. + * @return {!Element} The html container for the toolbox. + * @protected + */ + createDom_(workspace: Blockly.WorkspaceSvg): Element; + + /** + * Creates the container div for the toolbox. + * @return {!Element} The html container for the toolbox. + * @protected + */ + createContainer_(): Element; + + /** + * Creates the container for all the contents in the toolbox. + * @return {!Element} The html container for the toolbox contents. + * @protected + */ + createContentsContainer_(): Element; + + /** + * Adds event listeners to the toolbox container div. + * @param {!Element} container The html container for the toolbox. + * @param {!Element} contentsContainer The html container for the contents + * of the toolbox. + * @protected + */ + attachEvents_(container: Element, contentsContainer: Element): void; + + /** + * Handles on click events for when the toolbox or toolbox items are clicked. + * @param {!Event} e Click event to handle. + * @protected + */ + onClick_(e: Event): void; + + /** + * Handles key down events for the toolbox. + * @param {!KeyboardEvent} e The key down event. + * @protected + */ + onKeyDown_(e: KeyboardEvent): void; + + /** + * Creates the flyout based on the toolbox layout. + * @return {!Blockly.IFlyout} The flyout for the toolbox. + * @throws {Error} If missing a require for `Blockly.HorizontalFlyout`, + * `Blockly.VerticalFlyout`, and no flyout plugin is specified. + * @protected + */ + createFlyout_(): Blockly.IFlyout; + + /** + * Fills the toolbox with new toolbox items and removes any old contents. + * @param {!Blockly.utils.toolbox.ToolboxInfo} toolboxDef Object holding information + * for creating a toolbox. + * @package + */ + render(toolboxDef: Blockly.utils.toolbox.ToolboxInfo): void; + + /** + * Adds all the toolbox items to the toolbox. + * @param {!Array} toolboxDef Array + * holding objects containing information on the contents of the toolbox. + * @protected + */ + renderContents_(toolboxDef: Blockly.utils.toolbox.ToolboxItemInfo[]): void; + + /** + * Adds an item to the toolbox. + * @param {!Blockly.IToolboxItem} toolboxItem The item in the toolbox. + * @protected + */ + addToolboxItem_(toolboxItem: Blockly.IToolboxItem): void; + + /** + * Gets the items in the toolbox. + * @return {!Array} The list of items in the toolbox. + * @public + */ + getToolboxItems(): Blockly.IToolboxItem[]; + + /** + * 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. + * @public + */ + getClientRect(): Blockly.utils.Rect; + + /** + * Gets the toolbox item with the given id. + * @param {string} id The id of the toolbox item. + * @return {?Blockly.IToolboxItem} The toolbox item with the given id, or null if + * no item exists. + * @public + */ + getToolboxItemById(id: string): Blockly.IToolboxItem; + + /** + * Gets the width of the toolbox. + * @return {number} The width of the toolbox. + * @public + */ + getWidth(): number; + + /** + * Gets the height of the toolbox. + * @return {number} The width of the toolbox. + * @public + */ + getHeight(): number; + + /** + * Gets the toolbox flyout. + * @return {?Blockly.IFlyout} The toolbox flyout. + * @public + */ + getFlyout(): Blockly.IFlyout; + + /** + * Gets the workspace for the toolbox. + * @return {!Blockly.WorkspaceSvg} The parent workspace for the toolbox. + * @public + */ + getWorkspace(): Blockly.WorkspaceSvg; + + /** + * Gets the selected item. + * @return {?Blockly.ISelectableToolboxItem} The selected item, or null if no item is + * currently selected. + * @public + */ + getSelectedItem(): Blockly.ISelectableToolboxItem; + + /** + * Gets the previously selected item. + * @return {?Blockly.ISelectableToolboxItem} The previously selected item, or null if no + * item was previously selected. + * @public + */ + getPreviouslySelectedItem(): Blockly.ISelectableToolboxItem; + + /** + * Gets whether or not the toolbox is horizontal. + * @return {boolean} True if the toolbox is horizontal, false if the toolbox is + * vertical. + * @public + */ + isHorizontal(): boolean; + + /** + * Positions the toolbox based on whether it is a horizontal toolbox and whether + * the workspace is in rtl. + * @public + */ + position(): void; + + /** + * Handles resizing the toolbox when a toolbox item resizes. + * @package + */ + handleToolboxItemResize(): void; + + /** + * Unhighlights any previously selected item. + * @public + */ + clearSelection(): void; + + /** + * Updates the category colours and background colour of selected categories. + * @package + */ + refreshTheme(): void; + + /** + * Updates the flyout's content without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + * @public + */ + refreshSelection(): void; + + /** + * Shows or hides the toolbox. + * @param {boolean} isVisible True if toolbox should be visible. + * @public + */ + setVisible(isVisible: boolean): void; + + /** + * Sets the given item as selected. + * No-op if the item is not selectable. + * @param {?Blockly.IToolboxItem} newItem The toolbox item to select. + * @public + */ + setSelectedItem(newItem: Blockly.IToolboxItem): void; + + /** + * Decides whether the old item should be deselected. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected + * toolbox item. + * @param {?Blockly.ISelectableToolboxItem} newItem The newly selected toolbox + * item. + * @return {boolean} True if the old item should be deselected, false otherwise. + * @protected + */ + shouldDeselectItem_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): boolean; + + /** + * Decides whether the new item should be selected. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected + * toolbox item. + * @param {?Blockly.ISelectableToolboxItem} newItem The newly selected toolbox + * item. + * @return {boolean} True if the new item should be selected, false otherwise. + * @protected + */ + shouldSelectItem_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): boolean; + + /** + * Deselects the given item, marks it as unselected, and updates aria state. + * @param {!Blockly.ISelectableToolboxItem} item The previously selected + * toolbox item which should be deselected. + * @protected + */ + deselectItem_(item: Blockly.ISelectableToolboxItem): void; + + /** + * Selects the given item, marks it selected, and updates aria state. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected + * toolbox item. + * @param {!Blockly.ISelectableToolboxItem} newItem The newly selected toolbox + * item. + * @protected + */ + selectItem_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): void; + + /** + * Selects the toolbox item by its position in the list of toolbox items. + * @param {number} position The position of the item to select. + * @public + */ + selectItemByPosition(position: number): void; + + /** + * Decides whether to hide or show the flyout depending on the selected item. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected toolbox item. + * @param {?Blockly.ISelectableToolboxItem} newItem The newly selected toolbox item. + * @protected + */ + updateFlyout_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): void; + + /** + * Handles the given Blockly action on a toolbox. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): boolean; + + /** + * Disposes of this toolbox. + * @public + */ + dispose(): void; + } + +} + + +declare module Blockly { + + class ToolboxItem extends ToolboxItem__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxItem__Class implements Blockly.IToolboxItem { + + /** + * Class for an item in the toolbox. + * @param {!Blockly.utils.toolbox.ToolboxItemInfo} toolboxItemDef The JSON defining the + * toolbox item. + * @param {!Blockly.IToolbox} toolbox The toolbox that holds the toolbox item. + * @param {Blockly.ICollapsibleToolboxItem=} opt_parent The parent toolbox item + * or null if the category does not have a parent. + * @constructor + * @implements {Blockly.IToolboxItem} + */ + constructor(toolboxItemDef: Blockly.utils.toolbox.ToolboxItemInfo, toolbox: Blockly.IToolbox, opt_parent?: Blockly.ICollapsibleToolboxItem); + + /** + * The id for the category. + * @type {string} + * @protected + */ + id_: string; + + /** + * The parent of the category. + * @type {?Blockly.ICollapsibleToolboxItem} + * @protected + */ + parent_: Blockly.ICollapsibleToolboxItem; + + /** + * The level that the category is nested at. + * @type {number} + * @protected + */ + level_: number; + + /** + * The JSON definition of the toolbox item. + * @type {!Blockly.utils.toolbox.ToolboxItemInfo} + * @protected + */ + toolboxItemDef_: Blockly.utils.toolbox.ToolboxItemInfo; + + /** + * The toolbox this category belongs to. + * @type {!Blockly.IToolbox} + * @protected + */ + parentToolbox_: Blockly.IToolbox; + + /** + * The workspace of the parent toolbox. + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * Initializes the toolbox item. + * This includes creating the dom and updating the state of any items based + * on the info object. + * @public + */ + init(): void; + + /** + * Gets the div for the toolbox item. + * @return {?Element} The div for the toolbox item. + * @public + */ + getDiv(): Element; + + /** + * Gets a unique identifier for this toolbox item. + * @return {string} The id for the toolbox item. + * @public + */ + getId(): string; + + /** + * Gets the parent if the toolbox item is nested. + * @return {?Blockly.IToolboxItem} The parent toolbox item, or null if + * this toolbox item is not nested. + * @public + */ + getParent(): Blockly.IToolboxItem; + + /** + * Gets the nested level of the category. + * @return {number} The nested level of the category. + * @package + */ + getLevel(): number; + + /** + * Whether the toolbox item is selectable. + * @return {boolean} True if the toolbox item can be selected. + * @public + */ + isSelectable(): boolean; + + /** + * Whether the toolbox item is collapsible. + * @return {boolean} True if the toolbox item is collapsible. + * @public + */ + isCollapsible(): boolean; + + /** + * Dispose of this toolbox item. No-op by default. + * @public + */ + dispose(): void; + } + +} + + +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, DISABLED, 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.deprecation { + + /** + * Warn developers that a function is deprecated. + * @param {string} functionName The name of the function. + * @param {string} deprecationDate The date when the function was deprecated. + * Prefer 'month yyyy' or 'quarter yyyy' format. + * @param {string} deletionDate The date when the function will be deleted, in + * the same format as the deprecation date. + * @param {string=} opt_use The name of a function to use instead, if any. + * @package + */ + function warn(functionName: string, deprecationDate: string, deletionDate: string, opt_use?: string): void; +} + + +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 NodeType { ELEMENT_NODE, TEXT_NODE, COMMENT_NODE, DOCUMENT_POSITION_CONTAINED_BY } + + /** + * Helper method for creating SVG elements. + * @param {string|Blockly.utils.Svg} name Element's tag name. + * @param {!Object} attrs Dictionary of attribute names and values. + * @param {Element=} opt_parent Optional parent on which to append the element. + * @return {T} Newly created SVG element. The return type is {!SVGElement} if + * name is a string or a more specific type if it a member of + * Blockly.utils.Svg + * @template T + */ + function createSvgElement(name: string|Blockly.utils.Svg, attrs: Object, opt_parent?: Element): T; + + /** + * 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; + + /** + * Removes multiple calsses from an element. + * @param {!Element} element DOM element to remove classes from. + * @param {string} classNames A string of one or multiple class names for an + * element. + */ + function removeClasses(element: Element, classNames: string): void; + + /** + * 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; + + /** + * 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. + * This method is similar to ``getFastTextWidth`` but expects the font size + * parameter to be a string. + * @param {!Element} textElement An SVG 'text' element. + * @param {string} 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 getFastTextWidthWithSizeString(textElement: Element, fontSize: string, fontWeight: string, fontFamily: string): number; + + /** + * Measure a font's metrics. The height and baseline values. + * @param {string} text Text to measure the font dimensions of. + * @param {string} fontSize The font size to use. + * @param {string} fontWeight The font weight to use. + * @param {string} fontFamily The font family to use. + * @return {{height: number, baseline: number}} Font measurements. + */ + function measureFontMetrics(text: string, fontSize: string, fontWeight: string, fontFamily: string): { height: number; baseline: 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 { + + /** + * @record + */ + function Metrics(): void; +} + + +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; + + /** + * Complete a deep merge of all members of a source object with a target object. + * @param {!Object} target Target. + * @param {!Object} source Source. + * @return {!Object} The resulting object. + */ + function deepMerge(target: Object, source: Object): Object; + + /** + * 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 { + + class Svg extends Svg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Svg__Class { + + /** + * A name with the type of the SVG element stored in the generic. + * @param {string} tagName The SVG element tag name. + * @constructor + * @template T + * @private + */ + constructor(tagName: string); + } + +} + +declare module Blockly.utils.Svg { + + /** @type {!Blockly.utils.Svg} + * @package + */ + var ANIMATE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var CIRCLE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var CLIPPATH: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var DEFS: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FECOMPOSITE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FECOMPONENTTRANSFER: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEFLOOD: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEFUNCA: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEGAUSSIANBLUR: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEPOINTLIGHT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FESPECULARLIGHTING: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FILTER: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FOREIGNOBJECT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var G: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var IMAGE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var LINE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var PATH: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var PATTERN: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var POLYGON: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var RECT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var SVG: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var TEXT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var TSPAN: Blockly.utils.Svg; +} + + +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 cubic 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.toolbox { + + /** + * The information needed to create a block in the toolbox. + * @typedef {{ + * kind:string, + * blockxml:(string|!Node|undefined), + * type:(string|undefined), + * gap:(string|number|undefined), + * disabled: (string|boolean|undefined) + * }} + */ + interface BlockInfo { + kind: string; + blockxml: string|Node|any /*undefined*/; + type: string|any /*undefined*/; + gap: string|number|any /*undefined*/; + disabled: string|boolean|any /*undefined*/ + } + + /** + * The information needed to create a separator in the toolbox. + * @typedef {{ + * kind:string, + * id:(string|undefined), + * gap:(number|undefined), + * cssconfig:(!Blockly.ToolboxSeparator.CssConfig|undefined) + * }} + */ + interface SeparatorInfo { + kind: string; + id: string|any /*undefined*/; + gap: number|any /*undefined*/; + cssconfig: Blockly.ToolboxSeparator.CssConfig|any /*undefined*/ + } + + /** + * The information needed to create a button in the toolbox. + * @typedef {{ + * kind:string, + * text:string, + * callbackkey:string + * }} + */ + interface ButtonInfo { + kind: string; + text: string; + callbackkey: string + } + + /** + * The information needed to create a label in the toolbox. + * @typedef {{ + * kind:string, + * text:string, + * id:(string|undefined) + * }} + */ + interface LabelInfo { + kind: string; + text: string; + id: string|any /*undefined*/ + } + + /** + * The information needed to create either a button or a label in the flyout. + * @typedef {Blockly.utils.toolbox.ButtonInfo| + * Blockly.utils.toolbox.LabelInfo} + */ + type ButtonOrLabelInfo = Blockly.utils.toolbox.ButtonInfo|Blockly.utils.toolbox.LabelInfo; + + /** + * The information needed to create a category in the toolbox. + * @typedef {{ + * kind:string, + * name:string, + * contents:!Array, + * id:(string|undefined), + * categorystyle:(string|undefined), + * colour:(string|undefined), + * cssconfig:(!Blockly.ToolboxCategory.CssConfig|undefined), + * hidden:(string|undefined) + * }} + */ + interface StaticCategoryInfo { + kind: string; + name: string; + contents: Blockly.utils.toolbox.ToolboxItemInfo[]; + id: string|any /*undefined*/; + categorystyle: string|any /*undefined*/; + colour: string|any /*undefined*/; + cssconfig: Blockly.ToolboxCategory.CssConfig|any /*undefined*/; + hidden: string|any /*undefined*/ + } + + /** + * The information needed to create a custom category. + * @typedef {{ + * kind:string, + * custom:string, + * id:(string|undefined), + * categorystyle:(string|undefined), + * colour:(string|undefined), + * cssconfig:(!Blockly.ToolboxCategory.CssConfig|undefined), + * hidden:(string|undefined) + * }} + */ + interface DynamicCategoryInfo { + kind: string; + custom: string; + id: string|any /*undefined*/; + categorystyle: string|any /*undefined*/; + colour: string|any /*undefined*/; + cssconfig: Blockly.ToolboxCategory.CssConfig|any /*undefined*/; + hidden: string|any /*undefined*/ + } + + /** + * The information needed to create either a dynamic or static category. + * @typedef {Blockly.utils.toolbox.StaticCategoryInfo| + * Blockly.utils.toolbox.DynamicCategoryInfo} + */ + type CategoryInfo = Blockly.utils.toolbox.StaticCategoryInfo|Blockly.utils.toolbox.DynamicCategoryInfo; + + /** + * Any information that can be used to create an item in the toolbox. + * @typedef {Blockly.utils.toolbox.FlyoutItemInfo| + * Blockly.utils.toolbox.StaticCategoryInfo} + */ + type ToolboxItemInfo = Blockly.utils.toolbox.FlyoutItemInfo|Blockly.utils.toolbox.StaticCategoryInfo; + + /** + * All the different types that can be displayed in a flyout. + * @typedef {Blockly.utils.toolbox.BlockInfo| + * Blockly.utils.toolbox.SeparatorInfo| + * Blockly.utils.toolbox.ButtonInfo| + * Blockly.utils.toolbox.LabelInfo| + * Blockly.utils.toolbox.DynamicCategoryInfo} + */ + type FlyoutItemInfo = Blockly.utils.toolbox.BlockInfo|Blockly.utils.toolbox.SeparatorInfo|Blockly.utils.toolbox.ButtonInfo|Blockly.utils.toolbox.LabelInfo|Blockly.utils.toolbox.DynamicCategoryInfo; + + /** + * The JSON definition of a toolbox. + * @typedef {{ + * kind:(string|undefined), + * contents:!Array + * }} + */ + interface ToolboxInfo { + kind: string|any /*undefined*/; + contents: Blockly.utils.toolbox.ToolboxItemInfo[] + } + + /** + * An array holding flyout items. + * @typedef { + * Array + * } + */ + interface FlyoutItemInfoArray extends Array { } + + /** + * All of the different types that can create a toolbox. + * @typedef {Node| + * Blockly.utils.toolbox.ToolboxInfo| + * string} + */ + type ToolboxDefinition = Node|Blockly.utils.toolbox.ToolboxInfo|string; + + /** + * All of the different types that can be used to show items in a flyout. + * @typedef {Blockly.utils.toolbox.FlyoutItemInfoArray| + * NodeList| + * Blockly.utils.toolbox.ToolboxInfo| + * Array} + */ + type FlyoutDefinition = Blockly.utils.toolbox.FlyoutItemInfoArray|NodeList|Blockly.utils.toolbox.ToolboxInfo|Node[]; + + /** + * The name used to identify a toolbox that has category like items. + * This only needs to be used if a toolbox wants to be treated like a category + * toolbox but does not actually contain any toolbox items with the kind + * 'category'. + * @const {string} + */ + var CATEGORY_TOOLBOX_KIND: any /*missing*/; + + /** + * The name used to identify a toolbox that has no categories and is displayed + * as a simple flyout displaying blocks, buttons, or labels. + * @const {string} + */ + var FLYOUT_TOOLBOX_KIND: any /*missing*/; + + /** + * Position of the the toolbox relative to the flyout. + * @enum {number} + */ + enum Position { TOP, BOTTOM, LEFT, RIGHT } + + /** + * Converts the toolbox definition into toolbox JSON. + * @param {?Blockly.utils.toolbox.ToolboxDefinition} toolboxDef The definition + * of the toolbox in one of its many forms. + * @return {?Blockly.utils.toolbox.ToolboxInfo} Object holding information + * for creating a toolbox. + * @package + */ + function convertToolboxDefToJson(toolboxDef: Blockly.utils.toolbox.ToolboxDefinition): Blockly.utils.toolbox.ToolboxInfo; + + /** + * Converts the flyout definition into a list of flyout items. + * @param {?Blockly.utils.toolbox.FlyoutDefinition} flyoutDef The definition of + * the flyout in one of its many forms. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray} A list of flyout items. + * @package + */ + function convertFlyoutDefToJsonArray(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition): Blockly.utils.toolbox.FlyoutItemInfoArray; + + /** + * Whether or not the toolbox definition has categories. + * @param {?Blockly.utils.toolbox.ToolboxInfo} toolboxJson Object holding + * information for creating a toolbox. + * @return {boolean} True if the toolbox has categories. + * @package + */ + function hasCategories(toolboxJson: Blockly.utils.toolbox.ToolboxInfo): boolean; + + /** + * Whether or not the category is collapsible. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryInfo Object holing + * information for creating a category. + * @return {boolean} True if the category has subcategories. + * @package + */ + function isCategoryCollapsible(categoryInfo: Blockly.utils.toolbox.CategoryInfo): boolean; + + /** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {?Node|?string} toolboxDef DOM tree of blocks, or text representation + * of same. + * @return {?Node} DOM tree of blocks, or null. + */ + function parseToolboxTree(toolboxDef: Node|string): Node; +} + + +declare module Blockly.utils.userAgent { + + /** @const {boolean} */ + var IE: any /*missing*/; + + /** @const {boolean} */ + var EDGE: any /*missing*/; + + /** @const {boolean} */ + var JAVA_FX: any /*missing*/; + + /** @const {boolean} */ + var CHROME: any /*missing*/; + + /** @const {boolean} */ + var WEBKIT: any /*missing*/; + + /** @const {boolean} */ + var GECKO: any /*missing*/; + + /** @const {boolean} */ + var ANDROID: any /*missing*/; + + /** @const {boolean} */ + var IPAD: any /*missing*/; + + /** @const {boolean} */ + var IPOD: any /*missing*/; + + /** @const {boolean} */ + var IPHONE: any /*missing*/; + + /** @const {boolean} */ + var MAC: any /*missing*/; + + /** @const {boolean} */ + var TABLET: any /*missing*/; + + /** @const {boolean} */ + var MOBILE: any /*missing*/; +} + + +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.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 associated 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.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. + * @param {!Blockly.Theme} theme The workspace theme object. + * @param {Object=} opt_rendererOverrides Rendering constant overrides. + * @return {!Blockly.blockRendering.Renderer} The new instance of a renderer. + * Already initialized. + * @package + */ + function init(name: string, theme: Blockly.Theme, opt_rendererOverrides?: Object): 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; + + /** + * Text font weight. + * @type {string} + */ + FIELD_TEXT_FONTWEIGHT: string; + + /** + * Text font family. + * @type {string} + */ + FIELD_TEXT_FONTFAMILY: string; + + /** + * Height of text. This constant is dynamically set in ``setFontConstants_`` + * to be the height of the text based on the font used. + * @type {number} + */ + FIELD_TEXT_HEIGHT: number; + + /** + * Text baseline. This constant is dynamically set in ``setFontConstants_`` + * to be the baseline of the text based on the font used. + * @type {number} + */ + FIELD_TEXT_BASELINE: number; + + /** + * 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; + + /** + * 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 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} + * @package + */ + 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; + + /** + * The ID of the debug filter, or the empty string if no pattern is set. + * @type {string} + * @package + */ + debugFilterId: 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; + + /** + * The main colour of insertion markers, in hex. The block is rendered a + * transparent grey by changing the fill opacity in CSS. + * @type {string} + * @package + */ + INSERTION_MARKER_COLOUR: string; + + /** + * The insertion marker opacity. + * @type {number} + * @package + */ + INSERTION_MARKER_OPACITY: number; + + /** + * 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 + */ + setTheme(theme: Blockly.Theme): void; + + /** + * The block styles map. + * @type {Object.} + * @package + */ + blockStyles: { [key: string]: Blockly.Theme.BlockStyle }; + + /** + * Sets dynamic properties that depend on other values or theme properties. + * @param {!Blockly.Theme} theme The current workspace theme. + * @protected + */ + setDynamicProperties_(theme: Blockly.Theme): void; + + /** + * Set constants related to fonts. + * @param {!Blockly.Theme} theme The current workspace theme. + * @protected + */ + setFontConstants_(theme: Blockly.Theme): void; + + /** + * Set constants from a theme's component styles. + * @param {!Blockly.Theme} theme The current workspace theme. + * @protected + */ + setComponentConstants_(theme: Blockly.Theme): void; + + /** + * 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. + * @param {string} tagName The name to use for the CSS style tag. + * @param {string} selector The CSS selector to use. + * @suppress {strictModuleDepCheck} Debug renderer only included in playground. + * @package + */ + createDom(svg: SVGElement, tagName: string, selector: string): void; + + /** + * Inject renderer specific CSS into the page. + * @param {string} tagName The name of the style tag to use. + * @param {string} selector The CSS selector to use. + * @protected + */ + injectCSS_(tagName: string, selector: string): void; + + /** + * Get any renderer specific CSS to inject when the renderer is initialized. + * @param {string} selector CSS selector to use. + * @return {!Array.} Array of CSS strings. + * @protected + */ + getCSS_(selector: 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. + * @param {!Blockly.blockRendering.ConstantProvider} constants The renderer's + * constants. + * @package + * @constructor + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * 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; + + /** + * Show a debug filter to highlight that a block has been rendered. + * @param {!SVGElement} svgPath The block's svg path. + * @package + */ + drawRender(svgPath: SVGElement): 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 { + + /** + * The primary path of the block. + * @type {!SVGElement} + */ + svgPath: SVGElement; + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + */ + constants: Blockly.blockRendering.ConstantProvider; + + /** + * The primary path of the block. + * @type {!Blockly.Theme.BlockStyle} + */ + style: Blockly.Theme.BlockStyle; + + /** + * Holds the cursors svg element when the cursor is attached to the block. + * This is null if there is no cursor on the block. + * @type {SVGElement} + */ + cursorSvg: SVGElement; + + /** + * Holds the markers svg element when the marker is attached to the block. + * This is null if there is no marker on the block. + * @type {SVGElement} + */ + markerSvg: SVGElement; + + /** + * 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 + */ + updateReplacementFade(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[]; + + /** + * An array of input rows on the block. + * @type {!Array.} + */ + inputRows: Blockly.blockRendering.InputRow[]; + + /** + * 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; + + /** + * Get the marker. + * @return {!Blockly.Marker} The marker to draw for. + */ + getMarker(): Blockly.Marker; + + /** + * 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.IASTNodeLocationSvg} newParent The workspace, field, or + * block that the marker SVG element should be attached to. + * @protected + */ + setParent_(newParent: Blockly.IASTNodeLocationSvg): 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. + */ + 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; + + /** + * Position and display the marker for a block. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithBlock_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a previous connection. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithPrevious_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for an output connection. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithOutput_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a workspace coordinate. + * This is a horizontal line. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithCoordinates_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a field. + * This is a box around the field. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithField_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for an input. + * This is a puzzle piece. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithInput_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a next connection. + * This is a horizontal line. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithNext_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a stack. + * This is a box with extra padding around the entire stack of blocks. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithStack_(curNode: Blockly.ASTNode): void; + + /** + * Show the current marker. + * @protected + */ + showCurrent_(): void; + + /** + * Position the marker for a block. + * Displays an outline of the top half of a rectangle around a block. + * @param {number} width The width of the block. + * @param {number} markerOffset The extra padding for around the block. + * @param {number} markerHeight The height of the marker. + * @protected + */ + positionBlock_(width: number, markerOffset: number, markerHeight: number): void; + + /** + * Position the marker for an input connection. + * Displays a filled in puzzle piece. + * @param {!Blockly.RenderedConnection} connection The connection to position + * marker around. + * @protected + */ + positionInput_(connection: Blockly.RenderedConnection): 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; + + /** + * Position the marker for an output connection. + * Displays a puzzle outline and the top and bottom path. + * @param {number} width The width of the block. + * @param {number} height The height of the block. + * @param {!Object} connectionShape The shape object for the connection. + * @protected + */ + positionOutput_(width: number, height: number, connectionShape: Object): void; + + /** + * Position the marker for a previous connection. + * Displays a half rectangle with a notch in the top to represent the previous + * connection. + * @param {number} width The width of the block. + * @param {number} markerOffset The offset of the marker from around the block. + * @param {number} markerHeight The height of the marker. + * @param {!Object} connectionShape The shape object for the connection. + * @protected + */ + positionPrevious_(width: number, markerOffset: number, markerHeight: number, connectionShape: Object): 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. + */ + hide(): 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; + + /** + * Apply the marker's colour. + * @param {!Blockly.ASTNode} _curNode The node that we want to draw the marker + * for. + * @protected + */ + applyColour_(_curNode: Blockly.ASTNode): void; + + /** + * Dispose of this marker. + */ + 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. + * @const {number} + */ + var HEIGHT_MULTIPLIER: any /*missing*/; +} + + +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} + * @package + */ + 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; + + /** + * Holds the cursors svg element when the cursor is attached to the block. + * This is null if there is no cursor on the block. + * @type {SVGElement} + * @package + */ + cursorSvg: SVGElement; + + /** + * Holds the markers svg element when the marker is attached to the block. + * This is null if there is no marker on the block. + * @type {SVGElement} + * @package + */ + markerSvg: SVGElement; + + /** + * 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 + */ + updateReplacementFade(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 implements Blockly.IRegistrable { + + /** + * The base class for a block renderer. + * @param {string} name The renderer name. + * @package + * @constructor + * @implements {Blockly.IRegistrable} + */ + constructor(name: string); + + /** + * The renderer name. + * @type {string} + * @package + */ + name: string; + + /** + * Rendering constant overrides, passed in through options. + * @type {?Object} + * @package + */ + overrides: Object; + + /** + * Gets the class name that identifies this renderer. + * @return {string} The CSS class name. + * @package + */ + getClassName(): string; + + /** + * Initialize the renderer. + * @param {!Blockly.Theme} theme The workspace theme object. + * @param {Object=} opt_rendererOverrides Rendering constant overrides. + * @package + */ + init(theme: Blockly.Theme, opt_rendererOverrides?: Object): void; + + /** + * Create any DOM elements that this renderer needs. + * @param {!SVGElement} svg The root of the workspace's SVG. + * @param {!Blockly.Theme} theme The workspace theme object. + * @package + */ + createDom(svg: SVGElement, theme: Blockly.Theme): void; + + /** + * Refresh the renderer after a theme change. + * @param {!SVGElement} svg The root of the workspace's SVG. + * @param {!Blockly.Theme} theme The workspace theme object. + * @package + */ + refreshDom(svg: SVGElement, theme: Blockly.Theme): void; + + /** + * Dispose of this renderer. + * Delete all DOM elements that this renderer and its constants created. + * @package + */ + dispose(): 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; + + /** + * Checks if an orphaned block can connect to the "end" of the topBlock's + * block-clump. If the clump is a row the end is the last input. If the clump + * is a stack, the end is the last next connection. If the clump is neither, + * then this returns false. + * @param {!Blockly.BlockSvg} topBlock The top block of the block clump we want to try and + * connect to. + * @param {!Blockly.BlockSvg} orphanBlock The orphan block that wants to find + * a home. + * @param {number} localType The type of the connection being dragged. + * @return {boolean} Whether there is a home for the orphan or not. + * @package + */ + orphanCanConnectAtEnd(topBlock: Blockly.BlockSvg, orphanBlock: Blockly.BlockSvg, localType: number): boolean; + + /** + * Chooses a connection preview method based on the available connection, the + * current dragged connection, and the block being dragged. + * @param {!Blockly.RenderedConnection} closest The available connection. + * @param {!Blockly.RenderedConnection} local The connection currently being + * dragged. + * @param {!Blockly.BlockSvg} topBlock The block currently being dragged. + * @return {!Blockly.InsertionMarkerManager.PREVIEW_TYPE} The preview type + * to display. + * @package + */ + getConnectionPreviewMethod(closest: Blockly.RenderedConnection, local: Blockly.RenderedConnection, topBlock: Blockly.BlockSvg): Blockly.InsertionMarkerManager.PREVIEW_TYPE; + + /** + * Render the block. + * @param {!Blockly.BlockSvg} block The block to render. + * @package + */ + render(block: Blockly.BlockSvg): void; + } + +} + + +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/static/js/dist/blockly.js b/static/js/dist/blockly.js new file mode 100644 index 0000000..29beaec --- /dev/null +++ b/static/js/dist/blockly.js @@ -0,0 +1,25 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed')); + } else { // Browser + root.Blockly = factory(root.Blockly); + } +}(this, function(Blockly) { +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly module. + */ + +/* eslint-disable */ +'use strict'; + +return Blockly; +})); diff --git a/static/js/dist/blockly.min.js b/static/js/dist/blockly.min.js new file mode 100644 index 0000000..b2ec70c --- /dev/null +++ b/static/js/dist/blockly.min.js @@ -0,0 +1,2217 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define([], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(); + } else { // Browser + root.Blockly = factory(); + } +}(this, function() { + '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.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.registry={};Blockly.registry.typeMap_={};Blockly.registry.DEFAULT="default";Blockly.registry.Type=function(a){this.name_=a};Blockly.registry.Type.prototype.toString=function(){return this.name_};Blockly.registry.Type.CONNECTION_CHECKER=new Blockly.registry.Type("connectionChecker");Blockly.registry.Type.EVENT=new Blockly.registry.Type("event");Blockly.registry.Type.FIELD=new Blockly.registry.Type("field");Blockly.registry.Type.RENDERER=new Blockly.registry.Type("renderer"); +Blockly.registry.Type.TOOLBOX=new Blockly.registry.Type("toolbox");Blockly.registry.Type.THEME=new Blockly.registry.Type("theme");Blockly.registry.Type.TOOLBOX_ITEM=new Blockly.registry.Type("toolboxItem");Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX=new Blockly.registry.Type("flyoutsVerticalToolbox");Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX=new Blockly.registry.Type("flyoutsHorizontalToolbox"); +Blockly.registry.register=function(a,b,c,d){if(!(a instanceof Blockly.registry.Type)&&"string"!=typeof a||""==String(a).trim())throw Error('Invalid type "'+a+'". The type must be a non-empty string or a Blockly.registry.Type.');a=String(a).toLowerCase();if("string"!=typeof b||""==b.trim())throw Error('Invalid name "'+b+'". The name must be a non-empty string.');b=b.toLowerCase();if(!c)throw Error("Can not register a null value");var e=Blockly.registry.typeMap_[a];e||(e=Blockly.registry.typeMap_[a]= +{});Blockly.registry.validate_(a,c);if(!d&&e[b])throw Error('Name "'+b+'" with type "'+a+'" already registered.');e[b]=c};Blockly.registry.validate_=function(a,b){switch(a){case String(Blockly.registry.Type.FIELD):if("function"!=typeof b.fromJson)throw Error('Type "'+a+'" must have a fromJson function');}}; +Blockly.registry.unregister=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=Blockly.registry.typeMap_[a];c?c[b]?delete Blockly.registry.typeMap_[a][b]:console.warn('No name "'+b+'" with type "'+a+'" found'):console.warn('No type "'+a+'" found')}; +Blockly.registry.getItem_=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=Blockly.registry.typeMap_[a];return c?c[b]?c[b]:(console.warn('No name "'+b+'" with type "'+a+'" found'),null):(console.warn('No type "'+a+'" found'),null)};Blockly.registry.hasItem=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();return(a=Blockly.registry.typeMap_[a])?!!a[b]:!1};Blockly.registry.getClass=function(a,b){return Blockly.registry.getItem_(a,b)}; +Blockly.registry.getObject=function(a,b){return Blockly.registry.getItem_(a,b)};Blockly.registry.getClassFromOptions=function(a,b){b=b.plugins[a.toString()]||Blockly.registry.DEFAULT;return"function"==typeof b?b:Blockly.registry.getClass(a,b)};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.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.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(b,c){return b.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 new Blockly.utils.Rect(a.y,document.documentElement.clientHeight+a.y,a.x,document.documentElement.clientWidth+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.BLOCK_DRAG="drag";Blockly.Events.SELECTED="selected";Blockly.Events.CLICK="click";Blockly.Events.MARKER_MOVE="marker_move";Blockly.Events.BUBBLE_OPEN="bubble_open";Blockly.Events.TRASHCAN_OPEN="trashcan_open";Blockly.Events.TOOLBOX_ITEM_SELECT="toolbox_item_select";Blockly.Events.THEME_CHANGE="theme_change";Blockly.Events.VIEWPORT_CHANGE="viewport_change";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.isUiEvent?Blockly.Events.UI: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.CLICK||k.type!=Blockly.Events.BUBBLE_OPEN)d[g]={event:f,index:e},c.push(f)}a=c.filter(function(l){return!l.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){var c=Blockly.registry.getClass(Blockly.registry.Type.EVENT,a.type);if(!c)throw Error("Unknown event type.");c=new c;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),c=b.getBlockById(a.blockId);if(c){a=Blockly.Events.recordUndo;try{Blockly.Events.recordUndo=!1;var d=c.getParent();if(d&&d.isEnabled()){var e=c.getDescendants(!1);b=0;for(var f;f=e[b];b++)f.setEnabled(!0)}else if((c.outputConnection||c.previousConnection)&&!b.isDragging()){do c.setEnabled(!1),c=c.getNextBlock();while(c)}}finally{Blockly.Events.recordUndo= +a}}}};Blockly.Events.Abstract=function(){this.isBlank=null;this.workspaceId=void 0;this.group=Blockly.Events.getGroup();this.recordUndo=Blockly.Events.recordUndo};Blockly.Events.Abstract.prototype.isUiEvent=!1;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.isBlank=!1;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.deepMerge=function(a,b){for(var c in b)a[c]=null!=b[c]&&"object"===typeof b[c]?Blockly.utils.object.deepMerge(a[c]||Object.create(null),b[c]):b[c];return a};Blockly.utils.object.values=function(a){return Object.values?Object.values(a):Object.keys(a).map(function(b){return a[b]})};Blockly.Events.UiBase=function(a){Blockly.Events.UiBase.superClass_.constructor.call(this);this.isBlank="undefined"==typeof a;this.workspaceId=a?a:"";this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.UiBase,Blockly.Events.Abstract);Blockly.Events.UiBase.prototype.isUiEvent=!0; +Blockly.Events.Ui=function(a,b,c,d){Blockly.Events.Ui.superClass_.constructor.call(this,a?a.workspace.id:void 0);this.blockId=a?a.id:null;this.element="undefined"==typeof b?"":b;this.oldValue="undefined"==typeof c?"":c;this.newValue="undefined"==typeof d?"":d};Blockly.utils.object.inherits(Blockly.Events.Ui,Blockly.Events.UiBase);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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.UI,Blockly.Events.Ui);Blockly.utils.Svg=function(a){this.tagName_=a};Blockly.utils.Svg.prototype.toString=function(){return this.tagName_};Blockly.utils.Svg.ANIMATE=new Blockly.utils.Svg("animate");Blockly.utils.Svg.CIRCLE=new Blockly.utils.Svg("circle");Blockly.utils.Svg.CLIPPATH=new Blockly.utils.Svg("clipPath");Blockly.utils.Svg.DEFS=new Blockly.utils.Svg("defs");Blockly.utils.Svg.FECOMPOSITE=new Blockly.utils.Svg("feComposite");Blockly.utils.Svg.FECOMPONENTTRANSFER=new Blockly.utils.Svg("feComponentTransfer"); +Blockly.utils.Svg.FEFLOOD=new Blockly.utils.Svg("feFlood");Blockly.utils.Svg.FEFUNCA=new Blockly.utils.Svg("feFuncA");Blockly.utils.Svg.FEGAUSSIANBLUR=new Blockly.utils.Svg("feGaussianBlur");Blockly.utils.Svg.FEPOINTLIGHT=new Blockly.utils.Svg("fePointLight");Blockly.utils.Svg.FESPECULARLIGHTING=new Blockly.utils.Svg("feSpecularLighting");Blockly.utils.Svg.FILTER=new Blockly.utils.Svg("filter");Blockly.utils.Svg.FOREIGNOBJECT=new Blockly.utils.Svg("foreignObject");Blockly.utils.Svg.G=new Blockly.utils.Svg("g"); +Blockly.utils.Svg.IMAGE=new Blockly.utils.Svg("image");Blockly.utils.Svg.LINE=new Blockly.utils.Svg("line");Blockly.utils.Svg.PATH=new Blockly.utils.Svg("path");Blockly.utils.Svg.PATTERN=new Blockly.utils.Svg("pattern");Blockly.utils.Svg.POLYGON=new Blockly.utils.Svg("polygon");Blockly.utils.Svg.RECT=new Blockly.utils.Svg("rect");Blockly.utils.Svg.SVG=new Blockly.utils.Svg("svg");Blockly.utils.Svg.TEXT=new Blockly.utils.Svg("text");Blockly.utils.Svg.TSPAN=new Blockly.utils.Svg("tspan");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.NodeType={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,String(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.removeClasses=function(a,b){b=b.split(" ");for(var c=0;c>>/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.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: 9pt sans-serif;","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: 0 0 3px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv.blocklyFocused {","box-shadow: 0 0 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownContent {", +"max-height: 300px;","overflow: auto;","overflow-x: hidden;","position: relative;","}",".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;","}",".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;","}",".blocklyVerticalMarker {","stroke-width: 3px;","fill: rgba(255,255,255,.5);","pointer-events: none;","}",".blocklyComputeCanvas {","position: absolute;","width: 0;","height: 0;","}",".blocklyNoPointerEvents {","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","max-height: 100%;","}",".blocklyDropdownMenu {","border-radius: 2px;","padding: 0 !important;","}", +".blocklyDropdownMenu .blocklyMenuItem {","padding-left: 28px;","}",".blocklyDropdownMenu .blocklyMenuItemRtl {","padding-left: 5px;","padding-right: 28px;","}",".blocklyWidgetDiv .blocklyMenu {","background: #fff;","border: 1px solid transparent;","box-shadow: 0 0 3px 1px rgba(0,0,0,.3);","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;","}",".blocklyWidgetDiv .blocklyMenu.blocklyFocused {", +"box-shadow: 0 0 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv .blocklyMenu {","background: inherit;","border: inherit;",'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;',"outline: none;","position: relative;","z-index: 20000;","}",".blocklyMenuItem {","border: none;","color: #000;","cursor: pointer;","list-style: none;","margin: 0;","min-width: 7em;","padding: 6px 15px;","white-space: nowrap;","}",".blocklyMenuItemDisabled {","color: #ccc;","cursor: inherit;","}",".blocklyMenuItemHighlight {", +"background-color: rgba(0,0,0,.1);","}",".blocklyMenuItemCheckbox {","height: 16px;","position: absolute;","width: 16px;","}",".blocklyMenuItemSelected .blocklyMenuItemCheckbox {","background: url(<<>>/sprites.png) no-repeat -48px -16px;","float: left;","margin-left: -24px;","position: static;","}",".blocklyMenuItemRtl .blocklyMenuItemCheckbox {","float: right;","margin-right: -24px;","}"];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,arrowAtTop:null,arrowX:null,arrowY:null,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_="");Blockly.DropDownDiv.themeClassName_&&(Blockly.utils.dom.removeClass(a,Blockly.DropDownDiv.themeClassName_),Blockly.DropDownDiv.themeClassName_="");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=a.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(Blockly.utils.Svg.PATTERN,{id:"blocklyGridPattern"+a,patternUnits:"userSpaceOnUse"},c);0 document.");}else a=null;return a};Blockly.utils.xml={};Blockly.utils.xml.NAME_SPACE="https://developers.google.com/blockly/xml";Blockly.utils.xml.document=function(){return document};Blockly.utils.xml.createElement=function(a){return Blockly.utils.xml.document().createElementNS(Blockly.utils.xml.NAME_SPACE,a)};Blockly.utils.xml.createTextNode=function(a){return Blockly.utils.xml.document().createTextNode(a)};Blockly.utils.xml.textToDomDocument=function(a){return(new DOMParser).parseFromString(a,"text/xml")}; +Blockly.utils.xml.domToText=function(a){return(new XMLSerializer).serializeToString(a)};Blockly.Events.BlockBase=function(a){Blockly.Events.BlockBase.superClass_.constructor.call(this);this.blockId=(this.isBlank="undefined"==typeof a)?"":a.id;this.workspaceId=this.isBlank?"":a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.BlockBase,Blockly.Events.Abstract);Blockly.Events.BlockBase.prototype.toJson=function(){var a=Blockly.Events.BlockBase.superClass_.toJson.call(this);a.blockId=this.blockId;return a}; +Blockly.Events.BlockBase.prototype.fromJson=function(a){Blockly.Events.BlockBase.superClass_.fromJson.call(this,a);this.blockId=a.blockId};Blockly.Events.Change=function(a,b,c,d,e){Blockly.Events.Change.superClass_.constructor.call(this,a);a&&(this.element="undefined"==typeof b?"":b,this.name="undefined"==typeof c?"":c,this.oldValue="undefined"==typeof d?"":d,this.newValue="undefined"==typeof e?"":e)};Blockly.utils.object.inherits(Blockly.Events.Change,Blockly.Events.BlockBase); +Blockly.Events.BlockChange=Blockly.Events.Change;Blockly.Events.Change.prototype.type=Blockly.Events.CHANGE;Blockly.Events.Change.prototype.toJson=function(){var a=Blockly.Events.Change.superClass_.toJson.call(this);a.element=this.element;this.name&&(a.name=this.name);a.oldValue=this.oldValue;a.newValue=this.newValue;return a}; +Blockly.Events.Change.prototype.fromJson=function(a){Blockly.Events.Change.superClass_.fromJson.call(this,a);this.element=a.element;this.name=a.name;this.oldValue=a.oldValue;this.newValue=a.newValue};Blockly.Events.Change.prototype.isNull=function(){return this.oldValue==this.newValue}; +Blockly.Events.Change.prototype.run=function(a){var b=this.getEventWorkspace_().getBlockById(this.blockId);if(b)switch(b.mutator&&b.mutator.setVisible(!1),a=a?this.newValue:this.oldValue,this.element){case "field":(b=b.getField(this.name))?b.setValue(a):console.warn("Can't set non-existent field: "+this.name);break;case "comment":b.setCommentText(a||null);break;case "collapsed":b.setCollapsed(!!a);break;case "disabled":b.setEnabled(!a);break;case "inline":b.setInputsInline(!!a);break;case "mutation":var c= +"";b.mutationToDom&&(c=(c=b.mutationToDom())&&Blockly.Xml.domToText(c));if(b.domToMutation){var d=Blockly.Xml.textToDom(a||"");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){Blockly.Events.Create.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),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;this.recordUndo||(a.recordUndo=this.recordUndo);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;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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){Blockly.Events.Delete.superClass_.constructor.call(this,a);if(a){if(a.getParent())throw Error("Connected blocks cannot be deleted.");a.isShadow()&&(this.recordUndo=!1);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.oldXml=Blockly.Xml.domToText(this.oldXml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Delete.prototype.fromJson=function(a){Blockly.Events.Delete.superClass_.fromJson.call(this,a);this.oldXml=Blockly.Xml.textToDom(a.oldXml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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){Blockly.Events.Move.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),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));this.recordUndo||(a.recordUndo=this.recordUndo);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;if(a.newCoordinate){var b=a.newCoordinate.split(",");this.newCoordinate=new Blockly.utils.Coordinate(Number(b[0]),Number(b[1]))}void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CREATE,Blockly.Events.Create);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.DELETE,Blockly.Events.Delete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CHANGE,Blockly.Events.Change); +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MOVE,Blockly.Events.Move);Blockly.Events.FinishedLoading=function(a){this.isBlank="undefined"==typeof a;this.workspaceId=a?a.id:"";this.group=Blockly.Events.getGroup();this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.FinishedLoading,Blockly.Events.Abstract);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.isBlank=!1;this.workspaceId=a.workspaceId;this.group=a.group};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.FINISHED_LOADING,Blockly.Events.FinishedLoading);Blockly.Events.VarBase=function(a){Blockly.Events.VarBase.superClass_.constructor.call(this);this.varId=(this.isBlank="undefined"==typeof a)?"":a.getId();this.workspaceId=this.isBlank?"":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){Blockly.Events.VarCreate.superClass_.constructor.call(this,a);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){Blockly.Events.VarDelete.superClass_.constructor.call(this,a);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){Blockly.Events.VarRename.superClass_.constructor.call(this,a);a&&(this.oldName=a.name,this.newName="undefined"==typeof b?"":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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_CREATE,Blockly.Events.VarCreate);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_DELETE,Blockly.Events.VarDelete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_RENAME,Blockly.Events.VarRename);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){if(a.isInsertionMarker()&&(a=a.getChildren(!1)[0],!a))return new DocumentFragment;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){if(a.isInsertionMarker())return(a=a.getChildren(!1)[0])?Blockly.Xml.blockToDom(a):new DocumentFragment;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(d=0;e=a.inputList[d];d++){var h;f=!0;if(e.type!=Blockly.DUMMY_INPUT){var k=e.connection.targetBlock();e.type==Blockly.INPUT_VALUE?h=Blockly.utils.xml.createElement("value"):e.type==Blockly.NEXT_STATEMENT&&(h=Blockly.utils.xml.createElement("statement")); +g=e.connection.getShadowDom();!g||k&&k.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,b));k&&(g=Blockly.Xml.blockToDom(k,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h.appendChild(g),f=!1));h.setAttribute("name",e.name);f||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(d=a.getNextBlock())g=Blockly.Xml.blockToDom(d,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h=Blockly.utils.xml.createElement("next"),h.appendChild(g),c.appendChild(h));g=a.nextConnection&&a.nextConnection.getShadowDom();!g||d&&d.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,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.NodeType.TEXT_NODE&&""==d.data.trim()&&c.firstChild!=d&&Blockly.utils.dom.removeNode(d);c&&(d=c,c=c.nextSibling,d.nodeType==Blockly.utils.dom.NodeType.TEXT_NODE&&""==d.data.trim()&&Blockly.utils.dom.removeNode(d))}return a}; +Blockly.Xml.domToText=function(a){return Blockly.utils.xml.domToText(a).replace(/<(\w+)([^<]*)\/>/g,"<$1$2>")};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;Object.prototype.hasOwnProperty.call(b,"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=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.dispose=function(){Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.hide()};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.textContent="";var a=Blockly.Tooltip.getTooltipOfObject(Blockly.Tooltip.element_);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.container_=null; +Blockly.WorkspaceDragSurfaceSvg.prototype.createDom=function(){this.SVG_||(this.SVG_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.wsCoordinate_=null;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.createTopNode=function(a){var b=a.previousConnection||a.outputConnection;return b?Blockly.ASTNode.createConnectionNode(b):Blockly.ASTNode.createBlockNode(a)};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(Blockly.utils.Svg.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;ec||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case Blockly.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case Blockly.OUTPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(b.isConnected()&& +!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!=Blockly.draggingConnections.indexOf(b)?!1:!0};Blockly.ConnectionChecker.prototype.canConnectToPrevious_=function(a,b){if(a.targetConnection||-1!=Blockly.draggingConnections.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; +Blockly.registry.register(Blockly.registry.Type.CONNECTION_CHECKER,Blockly.registry.DEFAULT,Blockly.ConnectionChecker);Blockly.VariableMap=function(a){this.variableMap_=Object.create(null);this.workspace=a};Blockly.VariableMap.prototype.clear=function(){this.variableMap_=Object.create(null)};Blockly.VariableMap.prototype.renameVariable=function(a,b){var c=this.getVariable(b,a.type),d=this.workspace.getAllBlocks(!1);Blockly.Events.setGroup(!0);try{c&&c.getId()!=a.getId()?this.renameVariableWithConflict_(a,b,c,d):this.renameVariableAndUses_(a,b,d)}finally{Blockly.Events.setGroup(!1)}}; +Blockly.VariableMap.prototype.renameVariableById=function(a,b){var c=this.getVariableById(a);if(!c)throw Error("Tried to rename a variable that didn't exist. ID: "+a);this.renameVariable(c,b)};Blockly.VariableMap.prototype.renameVariableAndUses_=function(a,b,c){Blockly.Events.fire(new Blockly.Events.VarRename(a,b));a.name=b;for(b=0;bthis.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.getUndoStack=function(){return this.undoStack_};Blockly.Workspace.prototype.getRedoStack=function(){return this.redoStack_}; +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(Blockly.utils.Svg.G,{},null);var c={filter:"url(#"+this.workspace_.getRenderer().getConstants().embossFilterId+")"};Blockly.utils.userAgent.JAVA_FX&&(c={});c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,c,this.bubbleGroup_);this.bubbleArrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{},c);this.bubbleBack_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.G,{"class":this.workspace_.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.bubbleGroup_),b=2*Blockly.Bubble.BORDER_WIDTH,Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.POLYGON,{points:"0,x x,x x,0".replace(/x/g,b.toString())},this.resizeGroup_),Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{"class":"blocklyResizeLine",x1:b/3,y1:b-1,x2:b- +1,y2:b/3},this.resizeGroup_),Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.setDeleteStyle=function(a){}; +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.Bubble.textToDom=function(a){var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText blocklyBubbleText blocklyNoPointerEvents",y:Blockly.Bubble.BORDER_WIDTH},null);a=a.split("\n");for(var c=0;c(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.ASTNode.createTopNode(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.fireWorkspaceClick_=function(a){a=new Blockly.Events.Click(null,a.id,"workspace");Blockly.Events.fire(a)}; +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(){if(this.flyout_&&this.flyout_.autoClose)this.targetBlock_.isEnabled()&&(Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump());else{var a=new Blockly.Events.Click(this.startBlock_,this.startWorkspace_.id,"block");Blockly.Events.fire(a)}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();this.fireWorkspaceClick_(this.startWorkspace_||b)};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.value_=this.DEFAULT_VALUE;this.tooltip_=this.validator_=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.DEFAULT_VALUE=null;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};Blockly.Field.prototype.getConstants=function(){!this.constants_&&this.sourceBlock_&&this.sourceBlock_.workspace&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants());return this.constants_};Blockly.Field.prototype.getSourceBlock=function(){return this.sourceBlock_}; +Blockly.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.borderRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().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(){this.textElement_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText"},this.fieldGroup_);this.getConstants().FIELD_TEXT_BASELINE_CENTER&&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);Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_());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.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.updateSize_=function(a){var b=this.getConstants();a=void 0!=a?a:this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;var c=2*a,d=b.FIELD_TEXT_HEIGHT,e=0;this.textElement_&&(e=Blockly.utils.dom.getFastTextWidth(this.textElement_,b.FIELD_TEXT_FONTSIZE,b.FIELD_TEXT_FONTWEIGHT,b.FIELD_TEXT_FONTFAMILY),c+=e);this.borderRect_&&(d=Math.max(d,b.FIELD_BORDER_RECT_HEIGHT));this.size_.height=d;this.size_.width=c;this.positionTextElement_(a,e);this.positionBorderRect_()}; +Blockly.Field.prototype.positionTextElement_=function(a,b){if(this.textElement_){var c=this.getConstants(),d=this.size_.height/2;this.textElement_.setAttribute("x",this.sourceBlock_.RTL?this.size_.width-b-a:a);this.textElement_.setAttribute("y",c.FIELD_TEXT_BASELINE_CENTER?d:d-c.FIELD_TEXT_HEIGHT/2+c.FIELD_TEXT_BASELINE)}}; +Blockly.Field.prototype.positionBorderRect_=function(){this.borderRect_&&(this.borderRect_.setAttribute("width",this.size_.width),this.borderRect_.setAttribute("height",this.size_.height),this.borderRect_.setAttribute("rx",this.getConstants().FIELD_BORDER_RECT_RADIUS),this.borderRect_.setAttribute("ry",this.getConstants().FIELD_BORDER_RECT_RADIUS))}; +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 new Blockly.utils.Rect(c.y,c.y+ +a,c.x,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.markDirty=function(){this.isDirty_=!0;this.constants_=null};Blockly.Field.prototype.forceRerender=function(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours(),this.updateMarkers_())}; +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.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(b&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(b,"field",this.name||null,c,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};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){a||""===a||(a=this.sourceBlock_);var b=this.getClickTarget_();b?b.tooltip=a:this.tooltip_=a};Blockly.Field.prototype.getTooltip=function(){var a=this.getClickTarget_();return a?Blockly.Tooltip.getTooltipOfObject(a):Blockly.Tooltip.getTooltipOfObject({tooltip:this.tooltip_})}; +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.applyColour());b.name=c;b.setVisible(this.isVisible());c=b;c.prefixField&&(a=this.insertFieldAt(a,c.prefixField));this.fieldRow.splice(a,0,b);++a;c.suffixField&&(a=this.insertFieldAt(a,c.suffixField));this.sourceBlock_.rendered&& +(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return a};Blockly.Input.prototype.removeField=function(a,b){for(var c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');};Blockly.Input.prototype.isVisible=function(){return this.visible_}; +Blockly.Input.prototype.setVisible=function(a){var b=[];if(this.visible_==a)return b;this.visible_=a;for(var c=0,d;d=this.fieldRow[c];c++)d.setVisible(a);this.connection&&(this.connection=this.connection,a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),c=this.connection.targetBlock())&&(c.getSvgRoot().style.display=a?"block":"none");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_=this.sourceBlock_,this.sourceBlock_.render());return this};Blockly.Input.prototype.setShadowDom=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setShadowDom(a);return this}; +Blockly.Input.prototype.getShadowDom=function(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()};Blockly.Input.prototype.init=function(){if(this.sourceBlock_.workspace.rendered)for(var a=0;aa&&(e=e.substring(0,a-3)+"...");return e};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?this.menuItems_.length:a,-1)};Blockly.Menu.prototype.highlightFirst_=function(){this.highlightHelper_(-1,1)};Blockly.Menu.prototype.highlightLast_=function(){this.highlightHelper_(this.menuItems_.length,-1)};Blockly.Menu.prototype.highlightHelper_=function(a,b){a+=b;for(var c;c=this.menuItems_[a];){if(c.isEnabled()){this.setHighlighted(c);break}a+=b}}; +Blockly.Menu.prototype.handleMouseOver_=function(a){(a=this.getMenuItem_(a.target))&&(a.isEnabled()?this.highlightedItem_!=a&&this.setHighlighted(a):this.setHighlighted(null))};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}(a=this.getMenuItem_(a.target))&&a.performAction()}; +Blockly.Menu.prototype.handleMouseEnter_=function(a){this.focus()};Blockly.Menu.prototype.handleMouseLeave_=function(a){this.getElement()&&(this.blur_(),this.setHighlighted(null))}; +Blockly.Menu.prototype.handleKeyEvent_=function(a){if(this.menuItems_.length&&!(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)){var b=this.highlightedItem_;switch(a.keyCode){case Blockly.utils.KeyCodes.ENTER:case Blockly.utils.KeyCodes.SPACE:b&&b.performAction();break;case Blockly.utils.KeyCodes.UP:this.highlightPrevious();break;case Blockly.utils.KeyCodes.DOWN:this.highlightNext();break;case Blockly.utils.KeyCodes.PAGE_UP:case Blockly.utils.KeyCodes.HOME:this.highlightFirst_();break;case Blockly.utils.KeyCodes.PAGE_DOWN:case Blockly.utils.KeyCodes.END:this.highlightLast_(); +break;default:return}a.preventDefault();a.stopPropagation()}};Blockly.Menu.prototype.getSize=function(){var a=this.getElement(),b=Blockly.utils.style.getSize(a);b.height=a.scrollHeight;return b};Blockly.MenuItem=function(a,b){this.content_=a;this.value_=b;this.enabled_=!0;this.element_=null;this.rightToLeft_=!1;this.roleName_=null;this.highlight_=this.checked_=this.checkable_=!1;this.actionHandler_=null}; +Blockly.MenuItem.prototype.createDom=function(){var a=document.createElement("div");a.id=Blockly.utils.IdGenerator.getNextUniqueId();this.element_=a;a.className="blocklyMenuItem goog-menuitem "+(this.enabled_?"":"blocklyMenuItemDisabled goog-menuitem-disabled ")+(this.checked_?"blocklyMenuItemSelected goog-option-selected ":"")+(this.highlight_?"blocklyMenuItemHighlight goog-menuitem-highlight ":"")+(this.rightToLeft_?"blocklyMenuItemRtl goog-menuitem-rtl ":"");var b=document.createElement("div"); +b.className="blocklyMenuItemContent goog-menuitem-content";if(this.checkable_){var c=document.createElement("div");c.className="blocklyMenuItemCheckbox goog-menuitem-checkbox";b.appendChild(c)}c=this.content_;"string"==typeof this.content_&&(c=document.createTextNode(this.content_));b.appendChild(c);a.appendChild(b);this.roleName_&&Blockly.utils.aria.setRole(a,this.roleName_);Blockly.utils.aria.setState(a,Blockly.utils.aria.State.SELECTED,this.checkable_&&this.checked_||!1);Blockly.utils.aria.setState(a, +Blockly.utils.aria.State.DISABLED,!this.enabled_);return a};Blockly.MenuItem.prototype.dispose=function(){this.element_=null};Blockly.MenuItem.prototype.getElement=function(){return this.element_};Blockly.MenuItem.prototype.getId=function(){return this.element_.id};Blockly.MenuItem.prototype.getValue=function(){return this.value_};Blockly.MenuItem.prototype.setRightToLeft=function(a){this.rightToLeft_=a};Blockly.MenuItem.prototype.setRole=function(a){this.roleName_=a}; +Blockly.MenuItem.prototype.setCheckable=function(a){this.checkable_=a};Blockly.MenuItem.prototype.setChecked=function(a){this.checked_=a};Blockly.MenuItem.prototype.setHighlighted=function(a){this.highlight_=a;var b=this.getElement();b&&this.isEnabled()&&(a?(Blockly.utils.dom.addClass(b,"blocklyMenuItemHighlight"),Blockly.utils.dom.addClass(b,"goog-menuitem-highlight")):(Blockly.utils.dom.removeClass(b,"blocklyMenuItemHighlight"),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};Blockly.MenuItem.prototype.performAction=function(){this.isEnabled()&&this.actionHandler_&&this.actionHandler_(this)};Blockly.MenuItem.prototype.onAction=function(a,b){this.actionHandler_=a.bind(b)};Blockly.ContextMenu={};Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.menu_=null;Blockly.ContextMenu.show=function(a,b,c){Blockly.WidgetDiv.show(Blockly.ContextMenu,c,Blockly.ContextMenu.dispose);if(b.length){var d=Blockly.ContextMenu.populate_(b,c);Blockly.ContextMenu.menu_=d;Blockly.ContextMenu.position_(d,a,c);setTimeout(function(){d.focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()}; +Blockly.ContextMenu.populate_=function(a,b){var c=new Blockly.Menu;c.setRole(Blockly.utils.aria.Role.MENU);for(var d=0,e;e=a[d];d++){var f=new Blockly.MenuItem(e.text);f.setRightToLeft(b);f.setRole(Blockly.utils.aria.Role.MENUITEM);c.addChild(f);f.setEnabled(e.enabled);if(e.enabled)f.onAction(function(g){Blockly.ContextMenu.hide();this.callback(this.scope)},e)}return c}; +Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBox();b=new Blockly.utils.Rect(b.clientY+d.top,b.clientY+d.top,b.clientX+d.left,b.clientX+d.left);Blockly.ContextMenu.createWidget_(a);var e=a.getSize();c&&(b.left+=e.width,b.right+=e.width,d.left+=e.width,d.right+=e.width);Blockly.WidgetDiv.positionWithAnchor(d,b,e,c);a.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.dispose=function(){Blockly.ContextMenu.menu_&&(Blockly.ContextMenu.menu_.dispose(),Blockly.ContextMenu.menu_=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.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 d=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);d.moveBy(e.x,e.y);a.rendered&&(d.initSvg(),d.render(),d.select())};return c};Blockly.ContextMenuItems={};Blockly.ContextMenuItems.registerUndo=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.UNDO},preconditionFn:function(a){return 0b.length?Blockly.ContextMenuItems.deleteNext_(b,c):Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",b.length),function(d){d&&Blockly.ContextMenuItems.deleteNext_(b,c)})}},scopeType:Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})}; +Blockly.ContextMenuItems.registerWorkspaceOptions_=function(){Blockly.ContextMenuItems.registerUndo();Blockly.ContextMenuItems.registerRedo();Blockly.ContextMenuItems.registerCleanup();Blockly.ContextMenuItems.registerCollapse();Blockly.ContextMenuItems.registerExpand();Blockly.ContextMenuItems.registerDeleteAll()}; +Blockly.ContextMenuItems.registerDuplicate=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.DUPLICATE_BLOCK},preconditionFn:function(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback:function(a){a.block&&Blockly.duplicate(a.block)},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK,id:"blockDuplicate",weight:1})}; +Blockly.ContextMenuItems.registerComment=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getCommentIcon()?Blockly.Msg.REMOVE_COMMENT:Blockly.Msg.ADD_COMMENT},preconditionFn:function(a){a=a.block;return Blockly.utils.userAgent.IE||a.isInFlyout||!a.workspace.options.comments||a.isCollapsed()||!a.isEditable()?"hidden":"enabled"},callback:function(a){a=a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK, +id:"blockComment",weight:2})}; +Blockly.ContextMenuItems.registerInline=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getInputsInline()?Blockly.Msg.EXTERNAL_INPUTS:Blockly.Msg.INLINE_INPUTS},preconditionFn:function(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(var b=1;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(),b.getSvgRoot().style.display="block")};Blockly.RenderedConnection.prototype.respawnShadow_=function(){Blockly.RenderedConnection.superClass_.respawnShadow_.call(this);var a=this.targetBlock();a&&(a.initSvg(),a.render(!1),a=this.getSourceBlock(),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();var c=b.rendered,d=a.rendered;c&&b.updateDisabled();d&&a.updateDisabled();c&&d&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?a.render():b.render());if(b=b.getInputWithBlock(a))b=b.isVisible(),a.getSvgRoot().style.display=b?"block":"none"}; +Blockly.RenderedConnection.prototype.onCheckChanged_=function(){!this.isConnected()||this.targetConnection&&this.getConnectionChecker().canConnect(this,this.targetConnection,!1)||((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.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},null);this.svgGroup_.translate_="";this.style=a.getRenderer().getConstants().getBlockStyle(null);this.pathObject=a.getRenderer().makePathObject(this.svgGroup_,this.style);this.renderIsInProgress_=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.userAgent.IE&&this.svgGroup_.setAttribute("data-id",this.id)};Blockly.utils.object.inherits(Blockly.BlockSvg,Blockly.Block);Blockly.BlockSvg.prototype.height=0;Blockly.BlockSvg.prototype.width=0;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(l){var m=e-d[l].x,n=f-d[l].y;Math.sqrt(m*m+n*n)<=b&&k.push(d[l]);return na)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;eMath.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_)||(this.oldScale_=a,this.oldTop_=b,this.oldLeft_=c,a=new Blockly.Events.ViewportChange(b,c,a,this.id),Blockly.Events.fire(a))}}; +Blockly.WorkspaceSvg.prototype.translate=function(a,b){if(this.useWorkspaceDragSurface_&&this.isDragSurfaceActive_)this.workspaceDragSurface_.translateSurface(a,b);else{var c="translate("+a+","+b+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",c);this.svgBubbleCanvas_.setAttribute("transform",c)}this.blockDragSurface_&&this.blockDragSurface_.translateAndScaleGroup(a,b,this.scale);this.grid_&&this.grid_.moveTo(a,b);this.maybeFireViewportChangeEvent()}; +Blockly.WorkspaceSvg.prototype.resetDragSurface=function(){if(this.useWorkspaceDragSurface_){this.isDragSurfaceActive_=!1;var a=this.workspaceDragSurface_.getSurfaceTranslation();this.workspaceDragSurface_.clearAndHide(this.svgGroup_);a="translate("+a.x+","+a.y+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",a);this.svgBubbleCanvas_.setAttribute("transform",a)}}; +Blockly.WorkspaceSvg.prototype.setupDragSurface=function(){if(this.useWorkspaceDragSurface_&&!this.isDragSurfaceActive_){this.isDragSurfaceActive_=!0;var a=this.svgBlockCanvas_.previousSibling,b=parseInt(this.getParentSvg().getAttribute("width"),10),c=parseInt(this.getParentSvg().getAttribute("height"),10),d=Blockly.utils.getRelativeXY(this.getCanvas());this.workspaceDragSurface_.setContentsAndShow(this.getCanvas(),this.getBubbleCanvas(),a,b,c,this.scale);this.workspaceDragSurface_.translateSurface(d.x, +d.y)}};Blockly.WorkspaceSvg.prototype.getBlockDragSurface=function(){return this.blockDragSurface_};Blockly.WorkspaceSvg.prototype.getWidth=function(){var a=this.getMetrics();return a?a.viewWidth/this.scale:0}; +Blockly.WorkspaceSvg.prototype.setVisible=function(a){this.isVisible_=a;if(this.svgGroup_)if(this.scrollbar&&this.scrollbar.setContainerVisible(a),this.getFlyout()&&this.getFlyout().setContainerVisible(a),this.getParentSvg().style.display=a?"block":"none",this.toolbox_&&this.toolbox_.setVisible(a),a){a=this.getAllBlocks(!1);for(var b=a.length-1;0<=b;b--)a[b].markDirty();this.render();this.toolbox_&&this.toolbox_.position()}else Blockly.hideChaff(!0)}; +Blockly.WorkspaceSvg.prototype.render=function(){for(var a=this.getAllBlocks(!1),b=a.length-1;0<=b;b--)a[b].render(!1);if(this.currentGesture_)for(a=this.currentGesture_.getInsertionMarkers(),b=0;b=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()&&Blockly.WorkspaceComment.fireCreateEvent(b);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_&&"function"==typeof this.toolbox_.getClientRect?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.getTopBoundedElements();if(!a.length)return new Blockly.utils.Rect(0,0,0,0);for(var b=a[0].getBoundingRectangle(),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){if(!this.options.readOnly&&!this.isFlyout){var b=Blockly.ContextMenuRegistry.registry.getContextMenuOptions(Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,{workspace:this});this.configureContextMenu&&this.configureContextMenu(b,a);Blockly.ContextMenu.show(a,b,this.RTL)}}; +Blockly.WorkspaceSvg.prototype.updateToolbox=function(a){if(a=Blockly.utils.toolbox.convertToolboxDefToJson(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(Blockly.utils.toolbox.hasCategories(a)){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.render(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree= +a;this.flyout_.show(a)}}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&&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&&ag.viewBottom||g.contentLeftg.viewRight){h=null;f&&(h=Blockly.Events.getGroup(),Blockly.Events.setGroup(f.group));switch(f.type){case Blockly.Events.BLOCK_CREATE:case Blockly.Events.BLOCK_MOVE:var l= +e.getBlockById(f.blockId);l&&(l=l.getRootBlock());break;case Blockly.Events.COMMENT_CREATE:case Blockly.Events.COMMENT_MOVE:l=e.getCommentById(f.commentId)}if(l){k=l.getBoundingRectangle();k.height=k.bottom-k.top;k.width=k.right-k.left;var m=g.viewTop,n=g.viewBottom-k.height;n=Math.max(m,n);m=Blockly.utils.math.clamp(m,k.top,n)-k.top;n=g.viewLeft;var p=g.viewRight-k.width;g.RTL?n=Math.min(p,n):p=Math.max(n,p);g=Blockly.utils.math.clamp(n,k.left,p)-k.left;l.moveBy(g,m)}f&&(!f.group&&l&&console.warn("Moved object in bounds but there was no event group. This may break undo."), +null!==h&&Blockly.Events.setGroup(h))}}});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(e){Blockly.utils.isTargetInput(e)||e.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),"function"==typeof d.scrollToStart&& +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;bb.indexOf(d))throw Error(d+" is not a valid modifier key.");}; +Blockly.ShortcutRegistry.prototype.createSerializedKey=function(a,b){var c="";if(b){this.checkModifiers_(b);for(var d in Blockly.ShortcutRegistry.modifierKeys)-11'),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="4.20201217.0";Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.parentContainer=null;Blockly.svgSize=function(a){return new Blockly.utils.Size(a.cachedWidth_,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()))Blockly.ShortcutRegistry.registry.onKeyDown(b,a)}; +Blockly.deleteBlock=function(a){a.workspace.isFlyout||(Blockly.Events.setGroup(!0),Blockly.hideChaff(),a.dispose(!0,!0),Blockly.Events.setGroup(!1))};Blockly.copy=function(a){if(a=a.toCopyData())Blockly.clipboardXml_=a.xml,Blockly.clipboardSource_=a.source,Blockly.clipboardTypeCounts_=a.typeCounts}; +Blockly.paste=function(){if(!Blockly.clipboardXml_)return!1;var a=Blockly.clipboardSource_;a.isFlyout&&(a=a.targetWorkspace);return Blockly.clipboardTypeCounts_&&a.isCapacityAvailable(Blockly.clipboardTypeCounts_)?(Blockly.Events.setGroup(!0),a.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1),!0):!1}; +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.closeFlyout(),(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.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_TOP||this.targetWorkspace.getToolbox()|| +this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.HorizontalFlyout);Blockly.VerticalFlyout=function(a){Blockly.VerticalFlyout.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.VerticalFlyout,Blockly.Flyout);Blockly.VerticalFlyout.registryName="verticalFlyout"; +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{contentHeight:a.height*this.workspace_.scale+2*this.MARGIN,contentWidth:a.width*this.workspace_.scale+2*this.MARGIN,contentTop:a.y,contentLeft:a.x,viewHeight:c,viewWidth:d,viewTop:-this.workspace_.scrollY+ +a.y,viewLeft:-this.workspace_.scrollX,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.getX=function(){var a=this.targetWorkspace.getMetrics();return a?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.getY=function(){return 0}; +Blockly.VerticalFlyout.prototype.position=function(){if(this.isVisible()){var a=this.targetWorkspace.getMetrics();if(a){this.height_=a.viewHeight;this.setBackgroundPath_(this.width_-this.CORNER_RADIUS,a.viewHeight-2*this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}}; +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();Blockly.DropDownDiv.hideWithoutAnimation()}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.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_LEFT||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY); +this.width_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.VerticalFlyout);Blockly.FlyoutButton=function(a,b,c,d){this.workspace_=a;this.targetWorkspace_=b;this.text_=c.text;this.position_=new Blockly.utils.Coordinate(0,0);this.isLabel_=d;this.callbackKey_=c.callbackKey||c.callbackkey;this.cssClass_=c["web-class"]||null;this.onMouseUpWrapper_=null;this.info=c};Blockly.FlyoutButton.MARGIN_X=5;Blockly.FlyoutButton.MARGIN_Y=2;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(Blockly.utils.Svg.G,{"class":a},this.workspace_.getCanvas());if(!this.isLabel_)var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"blocklyFlyoutButtonShadow",rx:4,ry:4,x:1,y:1},this.svgGroup_);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":this.isLabel_? +"blocklyFlyoutLabelBackground":"blocklyFlyoutButtonBackground",rx:4,ry:4},this.svgGroup_);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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"));var e=Blockly.utils.style.getComputedStyle(c, +"fontSize"),f=Blockly.utils.style.getComputedStyle(c,"fontWeight"),g=Blockly.utils.style.getComputedStyle(c,"fontFamily");this.width=Blockly.utils.dom.getFastTextWidthWithSizeString(c,e,f,g);d=Blockly.utils.dom.measureFontMetrics(d,e,f,g);this.height=d.height;this.isLabel_||(this.width+=2*Blockly.FlyoutButton.MARGIN_X,this.height+=2*Blockly.FlyoutButton.MARGIN_Y,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/2-d.height/2+d.baseline);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.isLabel=function(){return this.isLabel_};Blockly.FlyoutButton.prototype.getPosition=function(){return this.position_};Blockly.FlyoutButton.prototype.getButtonText=function(){return this.text_}; +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;,}".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.isInitialized=null; +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;c>>/sprites.png);","height: 16px;","vertical-align: middle;","visibility: hidden;","width: 16px;","}",".blocklyTreeIconClosed {","background-position: -32px -1px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeIconClosed {',"background-position: 0 -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosed {","background-position: -32px -17px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeSelected>.blocklyTreeIconClosed {', +"background-position: 0 -17px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeLabel {","cursor: default;","font: 16px sans-serif;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}"]); +Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.ToolboxCategory.registrationName,Blockly.ToolboxCategory);Blockly.ToolboxSeparator=function(a,b){Blockly.ToolboxSeparator.superClass_.constructor.call(this,a,b);this.cssConfig_={container:"blocklyTreeSeparator"};Blockly.utils.object.mixin(this.cssConfig_,a.cssconfig||a.cssConfig)};Blockly.utils.object.inherits(Blockly.ToolboxSeparator,Blockly.ToolboxItem);Blockly.ToolboxSeparator.registrationName="sep";Blockly.ToolboxSeparator.prototype.init=function(){this.createDom_()}; +Blockly.ToolboxSeparator.prototype.createDom_=function(){var a=document.createElement("div");Blockly.utils.dom.addClass(a,this.cssConfig_.container);return this.htmlDiv_=a};Blockly.ToolboxSeparator.prototype.getDiv=function(){return this.htmlDiv_};Blockly.ToolboxSeparator.prototype.dispose=function(){Blockly.utils.dom.removeNode(this.htmlDiv_)};Blockly.Css.register('.blocklyTreeSeparator {,border-bottom: solid #e5e5e5 1px;,height: 0;,margin: 5px 0;,},.blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {,border-right: solid #e5e5e5 1px;,border-bottom: none;,height: auto;,margin: 0 5px 0 5px;,padding: 5px 0;,width: 0;,}'.split(",")); +Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.ToolboxSeparator.registrationName,Blockly.ToolboxSeparator);Blockly.CollapsibleToolboxCategory=function(a,b,c){this.subcategoriesDiv_=null;this.expanded_=!1;this.toolboxItems_=[];Blockly.CollapsibleToolboxCategory.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.CollapsibleToolboxCategory,Blockly.ToolboxCategory);Blockly.CollapsibleToolboxCategory.registrationName="collapsibleCategory"; +Blockly.CollapsibleToolboxCategory.prototype.makeDefaultCssConfig_=function(){var a=Blockly.CollapsibleToolboxCategory.superClass_.makeDefaultCssConfig_.call(this);a.contents="blocklyToolboxContents";return a}; +Blockly.CollapsibleToolboxCategory.prototype.parseContents_=function(a){var b=a.contents,c=!0;if(a.custom)this.flyoutItems_=a.custom;else if(b){a=0;for(var d;d=b[a];a++)!Blockly.registry.hasItem(Blockly.registry.Type.TOOLBOX_ITEM,d.kind)||d.kind.toLowerCase()==Blockly.ToolboxSeparator.registrationName&&c?(this.flyoutItems_.push(d),c=!0):(this.createToolboxItem_(d),c=!1)}}; +Blockly.CollapsibleToolboxCategory.prototype.createToolboxItem_=function(a){var b=a.kind;"CATEGORY"==b.toUpperCase()&&Blockly.utils.toolbox.isCategoryCollapsible(a)&&(b=Blockly.CollapsibleToolboxCategory.registrationName);a=new (Blockly.registry.getClass(Blockly.registry.Type.TOOLBOX_ITEM,b))(a,this.parentToolbox_,this);this.toolboxItems_.push(a)}; +Blockly.CollapsibleToolboxCategory.prototype.init=function(){Blockly.CollapsibleToolboxCategory.superClass_.init.call(this);this.setExpanded("true"==this.toolboxItemDef_.expanded||this.toolboxItemDef_.expanded)}; +Blockly.CollapsibleToolboxCategory.prototype.createDom_=function(){Blockly.CollapsibleToolboxCategory.superClass_.createDom_.call(this);var a=this.getChildToolboxItems();this.subcategoriesDiv_=this.createSubCategoriesDom_(a);Blockly.utils.aria.setRole(this.subcategoriesDiv_,Blockly.utils.aria.Role.GROUP);this.htmlDiv_.appendChild(this.subcategoriesDiv_);return this.htmlDiv_}; +Blockly.CollapsibleToolboxCategory.prototype.createIconDom_=function(){var a=document.createElement("span");this.parentToolbox_.isHorizontal()||(Blockly.utils.dom.addClass(a,this.cssConfig_.icon),a.style.visibility="visible");a.style.display="inline-block";return a}; +Blockly.CollapsibleToolboxCategory.prototype.createSubCategoriesDom_=function(a){var b=document.createElement("div");Blockly.utils.dom.addClass(b,this.cssConfig_.contents);for(var c=0;c>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","padding: 4px 0 4px 0;","position: absolute;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyToolboxContents {","display: flex;","flex-wrap: wrap;","flex-direction: column;", +"}",".blocklyToolboxContents:focus {","outline: none;","}"]);Blockly.registry.register(Blockly.registry.Type.TOOLBOX,Blockly.registry.DEFAULT,Blockly.Toolbox);Blockly.Events.TrashcanOpen=function(a,b){Blockly.Events.TrashcanOpen.superClass_.constructor.call(this,b);this.isOpen=a};Blockly.utils.object.inherits(Blockly.Events.TrashcanOpen,Blockly.Events.UiBase);Blockly.Events.TrashcanOpen.prototype.type=Blockly.Events.TRASHCAN_OPEN;Blockly.Events.TrashcanOpen.prototype.toJson=function(){var a=Blockly.Events.TrashcanOpen.superClass_.toJson.call(this);a.isOpen=this.isOpen;return a}; +Blockly.Events.TrashcanOpen.prototype.fromJson=function(a){Blockly.Events.TrashcanOpen.superClass_.fromJson.call(this,a);this.isOpen=a.isOpen};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TRASHCAN_OPEN,Blockly.Events.TrashcanOpen);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,rendererOverrides:this.workspace_.options.rendererOverrides});if(this.workspace_.horizontalLayout){a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.TOP? +Blockly.utils.toolbox.Position.BOTTOM:Blockly.utils.toolbox.Position.TOP;if(!Blockly.HorizontalFlyout)throw Error("Missing require for Blockly.HorizontalFlyout");this.flyout=new Blockly.HorizontalFlyout(a)}else{a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.RIGHT?Blockly.utils.toolbox.Position.LEFT:Blockly.utils.toolbox.Position.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.ANIMATION_LENGTH_=80;Blockly.Trashcan.ANIMATION_FRAMES_=4;Blockly.Trashcan.OPACITY_MIN_=.4; +Blockly.Trashcan.OPACITY_MAX_=.8;Blockly.Trashcan.MAX_LID_ANGLE_=45;Blockly.Trashcan.prototype.isLidOpen=!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(Blockly.utils.Svg.G,{"class":"blocklyTrash"},null);var a=String(Math.random()).substring(2);var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashBodyClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.BODY_HEIGHT_,y:this.LID_HEIGHT_},b);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashLidClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.LID_HEIGHT_},b);this.svgLid_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.bindEvent_(this.svgGroup_,"mousedown",this,this.blockMouseDownWhenOpenable_);Blockly.bindEvent_(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),Blockly.Trashcan.ANIMATION_LENGTH_/ +a))};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.setMinOpenness_=function(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*Blockly.Trashcan.MAX_LID_ANGLE_)};Blockly.Trashcan.prototype.closeLid=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.click=function(){this.hasContents_()&&this.openFlyout()};Blockly.Trashcan.prototype.fireUiEvent_=function(a){a=new Blockly.Events.TrashcanOpen(a,this.workspace_.id);Blockly.Events.fire(a)};Blockly.Trashcan.prototype.blockMouseDownWhenOpenable_=function(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()};Blockly.Trashcan.prototype.mouseOver_=function(){this.hasContents_()&&this.setLidOpen(!0)};Blockly.Trashcan.prototype.mouseOut_=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.onDelete_=function(a){if(!(0>=this.workspace_.options.maxTrashcanContents)&&a.type==Blockly.Events.BLOCK_DELETE&&a.oldXml.tagName&&"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.setMinOpenness_(this.HAS_BLOCKS_LID_ANGLE_)}}; +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(Blockly.utils.Svg.RECT,{"class":"blocklyIconShape",rx:"4",ry:"4",height:"16",width:"16"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.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(Blockly.utils.Svg.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,rendererOverrides:this.block_.workspace.options.rendererOverrides});b.toolboxPosition=this.block_.RTL?Blockly.utils.toolbox.Position.RIGHT:Blockly.utils.toolbox.Position.LEFT;if(c=!!a)b.languageTree=Blockly.utils.toolbox.convertToolboxDefToJson(a),b.getMetrics=this.getFlyoutMetrics_.bind(this);this.workspace_=new Blockly.WorkspaceSvg(b);this.workspace_.isMutator=!0;this.workspace_.addChangeListener(Blockly.Events.disableOrphans); +a=c?this.workspace_.addFlyout(Blockly.utils.Svg.G):null;b=this.workspace_.createDom("blocklyMutatorBackground");a&&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(),c=b.width+b.x,d=b.height+3*a,e=this.workspace_.getFlyout();if(e){var f=e.getMetrics_();d=Math.max(d,f.contentHeight+20);c+=e.getWidth()}this.block_.RTL&&(c=-b.x);c+=3*a;if(Math.abs(this.workspaceWidth_-c)>a||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+a,d+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.BubbleOpen(this.block_,a,"mutator")),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));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=this.rootBlock_.RTL?a.getWidth()+b: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.isUiEvent||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();20>d.y&&c.moveBy(0,20-d.y);if(c.RTL){var e=-20,f=this.workspace_.getFlyout();f&&(e-=f.getWidth());d.x>e&&c.moveBy(e-d.x,0)}else 20>d.x&&c.moveBy(20-d.x,0)}}if(this.rootBlock_.workspace==this.workspace_){Blockly.Events.setGroup(!0);c=this.block_; +a=(a=c.mutationToDom())&&Blockly.Xml.domToText(a);b=c.rendered;c.rendered=!1;c.compose(this.rootBlock_);c.rendered=b;c.initSvg();Blockly.getMainWorkspace().keyboardAccessibilityMode&&Blockly.navigation.moveCursorOnBlockMutation(c);c.rendered&&c.render();b=(b=c.mutationToDom())&&Blockly.Xml.domToText(b);if(a!=b){Blockly.Events.fire(new Blockly.Events.BlockChange(c,"mutation",null,a,b));var g=Blockly.Events.getGroup();setTimeout(function(){Blockly.Events.setGroup(g);c.bumpNeighbours();Blockly.Events.setGroup(!1)}, +Blockly.BUMP_DELAY)}this.workspace_.isDragging()||this.resizeBubble_();Blockly.Events.setGroup(!1)}}};Blockly.Mutator.prototype.getFlyoutMetrics_=function(){var a=this.workspace_.getFlyout();a=a?a.getWidth():0;return{contentHeight:0,contentWidth:0,contentTop:0,contentLeft:0,viewHeight:this.workspaceHeight_,viewWidth:this.workspaceWidth_-a,viewTop:0,viewLeft:0,absoluteTop:0,absoluteLeft:this.workspace_.RTL?0:a}};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.getConstants().FULL_BLOCK_FIELDS&&(this.borderRect_?this.borderRect_.setAttribute("stroke",this.sourceBlock_.style.colourTertiary):this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.getConstants().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(){Blockly.prompt(Blockly.Msg.CHANGE_VALUE_TITLE,this.getText(),function(a){this.setValue(this.getValueFromEditorText_(a))}.bind(this))};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_.getScale(),d=this.getConstants().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.getConstants().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.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,b,c);this.moveSurfaceWrapper_=this.clickSurfaceWrapper_=this.clickWrapper_=this.line_=this.gauge_=null};Blockly.utils.object.inherits(Blockly.FieldAngle,Blockly.FieldTextInput);Blockly.FieldAngle.prototype.DEFAULT_VALUE=0; +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(Blockly.utils.Svg.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(Blockly.utils.Svg.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(Blockly.utils.Svg.CIRCLE,{cx:Blockly.FieldAngle.HALF,cy:Blockly.FieldAngle.HALF,r:Blockly.FieldAngle.RADIUS,"class":"blocklyAngleCircle"}, +a);this.gauge_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{"class":"blocklyAngleGauge"},a);this.line_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{x1:Blockly.FieldAngle.HALF,y1:Blockly.FieldAngle.HALF,"class":"blocklyAngleLine"},a);for(var c=0;360>c;c+=15)Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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;Blockly.FieldCheckbox.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.FieldCheckbox,Blockly.Field);Blockly.FieldCheckbox.prototype.DEFAULT_VALUE=!1;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.configure_=function(a){Blockly.FieldCheckbox.superClass_.configure_.call(this,a);a.checkCharacter&&(this.checkChar_=a.checkCharacter)};Blockly.FieldCheckbox.prototype.initView=function(){Blockly.FieldCheckbox.superClass_.initView.call(this);Blockly.utils.dom.addClass(this.textElement_,"blocklyCheckbox");this.textElement_.style.display=this.value_?"block":"none"}; +Blockly.FieldCheckbox.prototype.render_=function(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)};Blockly.FieldCheckbox.prototype.getDisplayText_=function(){return this.checkChar_||Blockly.FieldCheckbox.CHECK_CHAR};Blockly.FieldCheckbox.prototype.setCheckCharacter=function(a){this.checkChar_=a;this.forceRerender()};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,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.getConstants().FIELD_COLOUR_DEFAULT_WIDTH,this.getConstants().FIELD_COLOUR_DEFAULT_HEIGHT);this.getConstants().FIELD_COLOUR_FULL_BLOCK?this.clickTarget_=this.sourceBlock_.getSvgRoot():(this.createBorderRect_(),this.borderRect_.style.fillOpacity="1")}; +Blockly.FieldColour.prototype.applyColour=function(){this.getConstants().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_.rendered&&(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.prototype.DEFAULT_VALUE=Blockly.FieldColour.COLOURS[0];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_)switch(a.name){case Blockly.navigation.actionNames.PREVIOUS:return this.moveHighlightBy_(0,-1),!0;case Blockly.navigation.actionNames.NEXT:return this.moveHighlightBy_(0,1),!0;case Blockly.navigation.actionNames.OUT:return this.moveHighlightBy_(-1,0),!0;case Blockly.navigation.actionNames.IN:return this.moveHighlightBy_(1,0),!0;default:return!1}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.suffixField=this.prefixField=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(Blockly.utils.Svg.IMAGE,{},this.fieldGroup_);this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_();this.borderRect_&&Blockly.utils.dom.addClass(this.borderRect_,"blocklyDropdownRect")}; +Blockly.FieldDropdown.prototype.shouldAddBorderRect_=function(){return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!this.sourceBlock_.isShadow()}; +Blockly.FieldDropdown.prototype.createTextArrow_=function(){this.arrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.IMAGE,{height:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_);this.svgArrow_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.getConstants().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());a=this.menu_.getElement();Blockly.utils.dom.addClass(a,"blocklyDropdownMenu");if(this.getConstants().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_&&this.menu_.setHighlighted(this.selectedMenuItem_);this.applyColour()}; +Blockly.FieldDropdown.prototype.dropdownCreate_=function(){var a=new Blockly.Menu;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.prototype.DEFAULT_VALUE="";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(Blockly.utils.Svg.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_);this.clickHandler_&&(this.imageElement_.style.cursor="pointer")};Blockly.FieldImage.prototype.updateSize_=function(){}; +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){Blockly.FieldMultilineInput.superClass_.constructor.call(this,a,b,c);this.textGroup_=null};Blockly.utils.object.inherits(Blockly.FieldMultilineInput,Blockly.FieldTextInput);Blockly.FieldMultilineInput.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.text);return new Blockly.FieldMultilineInput(b,void 0,a)};Blockly.FieldMultilineInput.prototype.toXml=function(a){a.textContent=this.getValue().replace(/\n/g," ");return a}; +Blockly.FieldMultilineInput.prototype.fromXml=function(a){this.setValue(a.textContent.replace(/ /g,"\n"))};Blockly.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}; +Blockly.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.getText();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+=this.getConstants().FIELD_TEXT_HEIGHT+(0this.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="string"===typeof a?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.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.getConstants().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+" .blocklyFlyoutLabelText {","fill: #000;","}",a+" .blocklyText.blocklyBubbleText {","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;","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};Blockly.Events.MarkerMove=function(a,b,c,d){var e=a?a.workspace.id:void 0;d&&d.getType()==Blockly.ASTNode.types.WORKSPACE&&(e=d.getLocation().id);Blockly.Events.MarkerMove.superClass_.constructor.call(this,e);this.blockId=a?a.id:null;this.oldNode=c;this.newNode=d;this.isCursor=b};Blockly.utils.object.inherits(Blockly.Events.MarkerMove,Blockly.Events.UiBase);Blockly.Events.MarkerMove.prototype.type=Blockly.Events.MARKER_MOVE; +Blockly.Events.MarkerMove.prototype.toJson=function(){var a=Blockly.Events.MarkerMove.superClass_.toJson.call(this);a.isCursor=this.isCursor;a.blockId=this.blockId;a.oldNode=this.oldNode;a.newNode=this.newNode;return a};Blockly.Events.MarkerMove.prototype.fromJson=function(a){Blockly.Events.MarkerMove.superClass_.fromJson.call(this,a);this.isCursor=a.isCursor;this.blockId=a.blockId;this.oldNode=a.oldNode;this.newNode=a.newNode}; +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MARKER_MOVE,Blockly.Events.MarkerMove);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.getMarker=function(){return this.marker_};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(Blockly.utils.Svg.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.draw=function(a,b){if(b){this.constants_=this.workspace_.getRenderer().getConstants();var c=this.isCursor()?this.constants_.CURSOR_COLOUR:this.constants_.MARKER_COLOUR;this.colour_=this.marker_.colour||c;this.applyColour_(b);this.showAtLocation_(b);this.fireMarkerEvent_(a,b);a=this.currentMarkerSvg.childNodes[0];void 0!==a&&a.beginElement&&a.beginElement()}else this.hide()}; +Blockly.blockRendering.MarkerSvg.prototype.showAtLocation_=function(a){var b=a.getLocation();a.getType()==Blockly.ASTNode.types.BLOCK?this.showWithBlock_(a):a.getType()==Blockly.ASTNode.types.OUTPUT?this.showWithOutput_(a):b.type==Blockly.INPUT_VALUE?this.showWithInput_(a):b.type==Blockly.NEXT_STATEMENT?this.showWithNext_(a):a.getType()==Blockly.ASTNode.types.PREVIOUS?this.showWithPrevious_(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.showWithBlockPrevOutput_=function(a){a=a.getSourceBlock();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.showWithBlock_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithPrevious_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithOutput_=function(a){this.showWithBlockPrevOutput_(a)}; +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.fireMarkerEvent_=function(a,b){var c=b.getSourceBlock();a=new Blockly.Events.MarkerMove(c,this.isCursor(),a,b);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(Blockly.utils.Svg.G,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT},this.svgGroup_);this.markerSvgLine_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT,style:"display: none"},this.markerSvg_);this.markerSvgRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT, +{"class":"blocklyVerticalMarker",rx:10,ry:10,style:"display: none"},this.markerSvg_);this.markerInput_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none"},this.markerSvg_);this.markerBlock_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none",fill:"none","stroke-width":this.constants_.CURSOR_STROKE_WIDTH},this.markerSvg_);if(this.isCursor()){var a=this.getBlinkProperties_();Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE, +a,this.markerSvgLine_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerInput_);a.attributeName="stroke";Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerBlock_)}return this.markerSvg_}; +Blockly.blockRendering.MarkerSvg.prototype.applyColour_=function(a){this.markerSvgLine_.setAttribute("fill",this.colour_);this.markerSvgRect_.setAttribute("stroke",this.colour_);this.markerInput_.setAttribute("fill",this.colour_);this.markerBlock_.setAttribute("stroke",this.colour_);this.isCursor()&&(a=this.colour_+";transparent;transparent;",this.markerSvgLine_.firstChild.setAttribute("values",a),this.markerInput_.firstChild.setAttribute("values",a),this.markerBlock_.firstChild.setAttribute("values", +a))};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){Object.prototype.hasOwnProperty.call(Blockly.blockRendering.Types,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.inputRows=[];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_);this.inputRows.push(a);var 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.inputRows.push(a));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;d.blocklyPathLight,",a+" .blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"])};Blockly.geras.Highlighter=function(a){this.info_=a;this.inlineSteps_=this.steps_="";this.RTL_=this.info_.RTL;a=a.getRenderer();this.constants_=a.getConstants();this.highlightConstants_=a.getHighlightConstants();this.highlightOffset_=this.highlightConstants_.OFFSET;this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER;this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER;this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB;this.notchPaths_=this.highlightConstants_.NOTCH;this.startPaths_= +this.highlightConstants_.START_HAT;this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH};Blockly.geras.Highlighter.prototype.getPath=function(){return this.steps_+"\n"+this.inlineSteps_}; +Blockly.geras.Highlighter.prototype.drawTopCorner=function(a){this.steps_+=Blockly.utils.svgPaths.moveBy(a.xPos,this.info_.startY);for(var b=0,c;c=a.elements[b];b++)Blockly.blockRendering.Types.isLeftSquareCorner(c)?this.steps_+=this.highlightConstants_.START_POINT:Blockly.blockRendering.Types.isLeftRoundedCorner(c)?this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):Blockly.blockRendering.Types.isPreviousConnection(c)?this.steps_+=this.notchPaths_.pathLeft:Blockly.blockRendering.Types.isHat(c)? +this.steps_+=this.startPaths_.path(this.RTL_):Blockly.blockRendering.Types.isSpacer(c)&&0!=c.width&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",c.xPos+c.width-this.highlightOffset_));this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",a.xPos+a.width-this.highlightOffset_)};Blockly.geras.Highlighter.prototype.drawJaggedEdge_=function(a){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+Blockly.utils.svgPaths.lineOnAxis("v",a.height-this.jaggedTeethPaths_.height-this.highlightOffset_))}; +Blockly.geras.Highlighter.prototype.drawValueInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-b.connectionHeight;this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos+b.width-this.highlightOffset_,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",c)}else this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos+b.width,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}; +Blockly.geras.Highlighter.prototype.drawStatementInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-2*this.insideCornerPaths_.height;this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos,a.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",c)+this.insideCornerPaths_.pathBottom(this.RTL_)+Blockly.utils.svgPaths.lineTo(a.width-b.xPos-this.insideCornerPaths_.width,0)}else this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos,a.yPos+a.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+ +Blockly.utils.svgPaths.lineTo(a.width-b.xPos-this.insideCornerPaths_.width,0)};Blockly.geras.Highlighter.prototype.drawRightSideRow=function(a){var b=a.xPos+a.width-this.highlightOffset_;a.followsStatement&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",b));this.RTL_&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",b),a.height>this.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;eb?b:f;e=e?-1:1;c=(d?-1:1)*c/2;return Blockly.utils.svgPaths.lineTo(-e*f,c)+Blockly.utils.svgPaths.lineTo(e*f,c)}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width:function(c){c/=2;return c>b?b:c},height:function(c){return c},connectionOffsetY:function(c){return c/2},connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c, +!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.makeRounded=function(){function a(d,e,f){var g=d>c?d-c:0;d=(d>c?c:d)/2;return Blockly.utils.svgPaths.arc("a","0 0,1",d,Blockly.utils.svgPaths.point((e?-1:1)*d,(e?-1:1)*d))+Blockly.utils.svgPaths.lineOnAxis("v",(f?1:-1)*g)+Blockly.utils.svgPaths.arc("a","0 0,1",d,Blockly.utils.svgPaths.point((e?1:-1)*d,(e?-1:1)*d))}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,c=2*b;return{type:this.SHAPES.ROUND,isDynamic:!0,width:function(d){d/=2;return d>b?b:d},height:function(d){return d}, +connectionOffsetY:function(d){return d/2},connectionOffsetX:function(d){return-d},pathDown:function(d){return a(d,!1,!1)},pathUp:function(d){return a(d,!0,!1)},pathRightDown:function(d){return a(d,!1,!0)},pathRightUp:function(d){return a(d,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.makeSquared=function(){function a(c,d,e){c-=2*b;return Blockly.utils.svgPaths.arc("a","0 0,1",b,Blockly.utils.svgPaths.point((d?-1:1)*b,(d?-1:1)*b))+Blockly.utils.svgPaths.lineOnAxis("v",(e?1:-1)*c)+Blockly.utils.svgPaths.arc("a","0 0,1",b,Blockly.utils.svgPaths.point((d?1:-1)*b,(d?-1:1)*b))}var b=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE,isDynamic:!0,width:function(c){return b},height:function(c){return c},connectionOffsetY:function(c){return c/2}, +connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c,!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.shapeFor=function(a){var b=a.getCheck();!b&&a.targetConnection&&(b=a.targetConnection.getCheck());switch(a.type){case Blockly.INPUT_VALUE:case Blockly.OUTPUT_VALUE:a=a.getSourceBlock().getOutputShape();if(null!=a)switch(a){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}if(b&&-1!=b.indexOf("Boolean"))return this.HEXAGONAL;if(b&&-1!=b.indexOf("Number"))return this.ROUNDED; +b&&b.indexOf("String");return this.ROUNDED;case Blockly.PREVIOUS_STATEMENT:case Blockly.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type");}}; +Blockly.zelos.ConstantProvider.prototype.makeNotch=function(){function a(l){return Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/2,0),Blockly.utils.svgPaths.point(l*e*3/4,g/2),Blockly.utils.svgPaths.point(l*e,g)])+Blockly.utils.svgPaths.line([Blockly.utils.svgPaths.point(l*e,f)])+Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/4,g/2),Blockly.utils.svgPaths.point(l*e/2,g),Blockly.utils.svgPaths.point(l*e,g)])+Blockly.utils.svgPaths.lineOnAxis("h",l*d)+Blockly.utils.svgPaths.curve("c", +[Blockly.utils.svgPaths.point(l*e/2,0),Blockly.utils.svgPaths.point(l*e*3/4,-(g/2)),Blockly.utils.svgPaths.point(l*e,-g)])+Blockly.utils.svgPaths.line([Blockly.utils.svgPaths.point(l*e,-f)])+Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/4,-(g/2)),Blockly.utils.svgPaths.point(l*e/2,-g),Blockly.utils.svgPaths.point(l*e,-g)])}var b=this.NOTCH_WIDTH,c=this.NOTCH_HEIGHT,d=b/3,e=d/3,f=c/2,g=f/2,h=a(1),k=a(-1);return{type:this.SHAPES.NOTCH,width:b,height:c,pathLeft:h,pathRight:k}}; +Blockly.zelos.ConstantProvider.prototype.makeInsideCorners=function(){var a=this.CORNER_RADIUS,b=Blockly.utils.svgPaths.arc("a","0 0,0",a,Blockly.utils.svgPaths.point(-a,a)),c=Blockly.utils.svgPaths.arc("a","0 0,1",a,Blockly.utils.svgPaths.point(-a,a)),d=Blockly.utils.svgPaths.arc("a","0 0,0",a,Blockly.utils.svgPaths.point(a,a)),e=Blockly.utils.svgPaths.arc("a","0 0,1",a,Blockly.utils.svgPaths.point(a,a));return{width:a,height:a,pathTop:b,pathBottom:d,rightWidth:a,rightHeight:a,pathTopRight:c,pathBottomRight:e}}; +Blockly.zelos.ConstantProvider.prototype.generateSecondaryColour_=function(a){return Blockly.utils.colour.blend("#000",a,.15)||a};Blockly.zelos.ConstantProvider.prototype.generateTertiaryColour_=function(a){return Blockly.utils.colour.blend("#000",a,.25)||a}; +Blockly.zelos.ConstantProvider.prototype.createDom=function(a,b,c){Blockly.zelos.ConstantProvider.superClass_.createDom.call(this,a,b,c);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.DEFS,{},a);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FILTER,{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},b);c= +Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},c);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFLOOD,{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},b);this.selectedGlowFilterId= +b.id;this.selectedGlowFilter_=b;a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FILTER,{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},a);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFUNCA,{type:"table", +tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFLOOD,{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"SourceGraphic",in2:"outGlow",operator:"over"},a);this.replacementGlowFilterId=a.id;this.replacementGlowFilter_= +a}; +Blockly.zelos.ConstantProvider.prototype.getCSS_=function(a){return[a+" .blocklyText,",a+" .blocklyFlyoutLabelText {","font: "+this.FIELD_TEXT_FONTWEIGHT+" "+this.FIELD_TEXT_FONTSIZE+"pt "+this.FIELD_TEXT_FONTFAMILY+";","}",a+" .blocklyText {","fill: #fff;","}",a+" .blocklyNonEditableText>rect: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+" .blocklyFlyoutLabelText {","fill: #575E75;","}",a+" .blocklyText.blocklyBubbleText {","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: "+this.SELECTED_GLOW_COLOUR+";","}",a+" .blocklyDisabled > .blocklyOutlinePath {","fill: url(#blocklyDisabledPattern"+this.randomIdentifier+")","}",a+" .blocklyInsertionMarker>.blocklyPath {", +"fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};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&&!a.statementInputCount&&!a.nextConnection};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&&!a.statementInputCount&&!a.nextConnection};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.hasStatementInput=0=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))&&fc?c:this.height/2,b-c*(1-Math.sin(Math.acos((c-this.constants_.SMALL_PADDING)/c)));default:return 0}if(Blockly.blockRendering.Types.isInlineInput(a)){var e=a.connectedBlock;a=e?e.pathObject.outputShapeType: +a.shape.type;return e&&e.outputConnection&&(e.statementInputCount||e.nextConnection)||c==d.SHAPES.HEXAGONAL&&c!=a?0:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][a]}return Blockly.blockRendering.Types.isField(a)?c==d.SHAPES.ROUND&&a.field instanceof Blockly.FieldTextInput?b-2.75*d.GRID_UNIT:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][0]:Blockly.blockRendering.Types.isIcon(a)?this.constants_.SMALL_PADDING:0}; +Blockly.zelos.RenderInfo.prototype.finalizeVerticalAlignment_=function(){if(!this.outputConnection)for(var a=2;a=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);this.rightSide&&(this.widthWithChildren+=this.rightSide.width)};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.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):Blockly.zelos.Drawer.superClass_.drawOutline_.call(this)}; +Blockly.zelos.Drawer.prototype.drawLeft_=function(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?this.drawLeftDynamicConnection_():Blockly.zelos.Drawer.superClass_.drawLeft_.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","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,d=1;d<=this.elseifCount_;d++){var e=a.newBlock("controls_if_elseif");e.initSvg();c.connect(e.previousConnection);c=e.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],d=null;a&&!a.isInsertionMarker();){switch(a.type){case "controls_if_elseif":this.elseifCount_++; +b.push(a.valueConnection_);c.push(a.statementConnection_);break;case "controls_if_else":this.elseCount_++;d=a.statementConnection_;break;default:throw TypeError("Unknown block type: "+a.type);}a=a.nextConnection&&a.nextConnection.targetBlock()}this.updateShape_();this.reconnectChildBlocks_(b,c,d)},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),d=this.getInput("DO"+b);a.valueConnection_=c&&c.connection.targetConnection; +a.statementConnection_=d&&d.connection.targetConnection;b++;break;case "controls_if_else":d=this.getInput("ELSE");a.statementConnection_=d&&d.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 d=1;this.getInput("IF"+d);){var e=this.getInput("IF"+d),f=this.getInput("DO"+ +d);a.push(e.connection.targetConnection);b.push(f.connection.targetConnection);d++}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 d=1;d<=this.elseifCount_;d++)Blockly.Mutator.reconnect(a[d],this,"IF"+d),Blockly.Mutator.reconnect(b[d],this,"DO"+d);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&&!this.workspace.connectionChecker.doTypeChecks(b.outputConnection,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"),d=this.outputConnection.targetConnection;if((b||c)&&d)for(var e=0;2>e;e++){var f=1==e?b:c;f&&!f.workspace.connectionChecker.doTypeChecks(f.outputConnection,d)&&(Blockly.Events.setGroup(a.group),d===this.prevParentConnection_?(this.unplug(),d.getSourceBlock().bumpNeighbours()):(f.unplug(),f.bumpNeighbours()),Blockly.Events.setGroup(!1))}this.prevParentConnection_= +d}};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 d={enabled:!0};d.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);d.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(d)}}}}; +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){if(this.workspace.isDragging&&!this.workspace.isDragging()&&a.type==Blockly.Events.BLOCK_MOVE){var b=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(this); +this.setWarningText(b?null:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);if(!this.isInFlyout){var c=Blockly.Events.getGroup();Blockly.Events.setGroup(a.group);this.setEnabled(b);Blockly.Events.setGroup(c)}}}};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=Blockly.Procedures.findLegalName("",this);a=new Blockly.FieldTextInput(a,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;cc?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_NONE)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_NONE)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_NONE)||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_NONE)||"'#000000'",c=Blockly.JavaScript.valueToCode(a,"COLOUR2",Blockly.JavaScript.ORDER_NONE)||"'#000000'";a=Blockly.JavaScript.valueToCode(a,"RATIO",Blockly.JavaScript.ORDER_NONE)||.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_NONE]}[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_NONE)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";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_NONE)||"0",c=Blockly.JavaScript.valueToCode(a,"LOW",Blockly.JavaScript.ORDER_NONE)||"0";a=Blockly.JavaScript.valueToCode(a,"HIGH",Blockly.JavaScript.ORDER_NONE)||"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_NONE)||"0";a=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_NONE)||"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_NONE)||"0";return["Math.atan2("+(Blockly.JavaScript.valueToCode(a,"Y",Blockly.JavaScript.ORDER_NONE)||"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 h=[],l=a.getVars(),k=0;ka&&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.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.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(b,c){return b.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 new Blockly.utils.Rect(a.y,document.documentElement.clientHeight+a.y,a.x,document.documentElement.clientWidth+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.BLOCK_DRAG="drag";Blockly.Events.SELECTED="selected";Blockly.Events.CLICK="click";Blockly.Events.MARKER_MOVE="marker_move";Blockly.Events.BUBBLE_OPEN="bubble_open";Blockly.Events.TRASHCAN_OPEN="trashcan_open";Blockly.Events.TOOLBOX_ITEM_SELECT="toolbox_item_select";Blockly.Events.THEME_CHANGE="theme_change";Blockly.Events.VIEWPORT_CHANGE="viewport_change";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.isUiEvent?Blockly.Events.UI: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.CLICK||k.type!=Blockly.Events.BUBBLE_OPEN)d[g]={event:f,index:e},c.push(f)}a=c.filter(function(l){return!l.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){var c=Blockly.registry.getClass(Blockly.registry.Type.EVENT,a.type);if(!c)throw Error("Unknown event type.");c=new c;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),c=b.getBlockById(a.blockId);if(c){a=Blockly.Events.recordUndo;try{Blockly.Events.recordUndo=!1;var d=c.getParent();if(d&&d.isEnabled()){var e=c.getDescendants(!1);b=0;for(var f;f=e[b];b++)f.setEnabled(!0)}else if((c.outputConnection||c.previousConnection)&&!b.isDragging()){do c.setEnabled(!1),c=c.getNextBlock();while(c)}}finally{Blockly.Events.recordUndo= +a}}}};Blockly.Events.Abstract=function(){this.isBlank=null;this.workspaceId=void 0;this.group=Blockly.Events.getGroup();this.recordUndo=Blockly.Events.recordUndo};Blockly.Events.Abstract.prototype.isUiEvent=!1;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.isBlank=!1;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.deepMerge=function(a,b){for(var c in b)a[c]=null!=b[c]&&"object"===typeof b[c]?Blockly.utils.object.deepMerge(a[c]||Object.create(null),b[c]):b[c];return a};Blockly.utils.object.values=function(a){return Object.values?Object.values(a):Object.keys(a).map(function(b){return a[b]})};Blockly.Events.UiBase=function(a){Blockly.Events.UiBase.superClass_.constructor.call(this);this.isBlank="undefined"==typeof a;this.workspaceId=a?a:"";this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.UiBase,Blockly.Events.Abstract);Blockly.Events.UiBase.prototype.isUiEvent=!0; +Blockly.Events.Ui=function(a,b,c,d){Blockly.Events.Ui.superClass_.constructor.call(this,a?a.workspace.id:void 0);this.blockId=a?a.id:null;this.element="undefined"==typeof b?"":b;this.oldValue="undefined"==typeof c?"":c;this.newValue="undefined"==typeof d?"":d};Blockly.utils.object.inherits(Blockly.Events.Ui,Blockly.Events.UiBase);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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.UI,Blockly.Events.Ui);Blockly.utils.Svg=function(a){this.tagName_=a};Blockly.utils.Svg.prototype.toString=function(){return this.tagName_};Blockly.utils.Svg.ANIMATE=new Blockly.utils.Svg("animate");Blockly.utils.Svg.CIRCLE=new Blockly.utils.Svg("circle");Blockly.utils.Svg.CLIPPATH=new Blockly.utils.Svg("clipPath");Blockly.utils.Svg.DEFS=new Blockly.utils.Svg("defs");Blockly.utils.Svg.FECOMPOSITE=new Blockly.utils.Svg("feComposite");Blockly.utils.Svg.FECOMPONENTTRANSFER=new Blockly.utils.Svg("feComponentTransfer"); +Blockly.utils.Svg.FEFLOOD=new Blockly.utils.Svg("feFlood");Blockly.utils.Svg.FEFUNCA=new Blockly.utils.Svg("feFuncA");Blockly.utils.Svg.FEGAUSSIANBLUR=new Blockly.utils.Svg("feGaussianBlur");Blockly.utils.Svg.FEPOINTLIGHT=new Blockly.utils.Svg("fePointLight");Blockly.utils.Svg.FESPECULARLIGHTING=new Blockly.utils.Svg("feSpecularLighting");Blockly.utils.Svg.FILTER=new Blockly.utils.Svg("filter");Blockly.utils.Svg.FOREIGNOBJECT=new Blockly.utils.Svg("foreignObject");Blockly.utils.Svg.G=new Blockly.utils.Svg("g"); +Blockly.utils.Svg.IMAGE=new Blockly.utils.Svg("image");Blockly.utils.Svg.LINE=new Blockly.utils.Svg("line");Blockly.utils.Svg.PATH=new Blockly.utils.Svg("path");Blockly.utils.Svg.PATTERN=new Blockly.utils.Svg("pattern");Blockly.utils.Svg.POLYGON=new Blockly.utils.Svg("polygon");Blockly.utils.Svg.RECT=new Blockly.utils.Svg("rect");Blockly.utils.Svg.SVG=new Blockly.utils.Svg("svg");Blockly.utils.Svg.TEXT=new Blockly.utils.Svg("text");Blockly.utils.Svg.TSPAN=new Blockly.utils.Svg("tspan");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.NodeType={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,String(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.removeClasses=function(a,b){b=b.split(" ");for(var c=0;c>>/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.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: 9pt sans-serif;","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: 0 0 3px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv.blocklyFocused {","box-shadow: 0 0 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownContent {", +"max-height: 300px;","overflow: auto;","overflow-x: hidden;","position: relative;","}",".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;","}",".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;","}",".blocklyVerticalMarker {","stroke-width: 3px;","fill: rgba(255,255,255,.5);","pointer-events: none;","}",".blocklyComputeCanvas {","position: absolute;","width: 0;","height: 0;","}",".blocklyNoPointerEvents {","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","max-height: 100%;","}",".blocklyDropdownMenu {","border-radius: 2px;","padding: 0 !important;","}", +".blocklyDropdownMenu .blocklyMenuItem {","padding-left: 28px;","}",".blocklyDropdownMenu .blocklyMenuItemRtl {","padding-left: 5px;","padding-right: 28px;","}",".blocklyWidgetDiv .blocklyMenu {","background: #fff;","border: 1px solid transparent;","box-shadow: 0 0 3px 1px rgba(0,0,0,.3);","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;","}",".blocklyWidgetDiv .blocklyMenu.blocklyFocused {", +"box-shadow: 0 0 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv .blocklyMenu {","background: inherit;","border: inherit;",'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;',"outline: none;","position: relative;","z-index: 20000;","}",".blocklyMenuItem {","border: none;","color: #000;","cursor: pointer;","list-style: none;","margin: 0;","min-width: 7em;","padding: 6px 15px;","white-space: nowrap;","}",".blocklyMenuItemDisabled {","color: #ccc;","cursor: inherit;","}",".blocklyMenuItemHighlight {", +"background-color: rgba(0,0,0,.1);","}",".blocklyMenuItemCheckbox {","height: 16px;","position: absolute;","width: 16px;","}",".blocklyMenuItemSelected .blocklyMenuItemCheckbox {","background: url(<<>>/sprites.png) no-repeat -48px -16px;","float: left;","margin-left: -24px;","position: static;","}",".blocklyMenuItemRtl .blocklyMenuItemCheckbox {","float: right;","margin-right: -24px;","}"];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,arrowAtTop:null,arrowX:null,arrowY:null,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_="");Blockly.DropDownDiv.themeClassName_&&(Blockly.utils.dom.removeClass(a,Blockly.DropDownDiv.themeClassName_),Blockly.DropDownDiv.themeClassName_="");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=a.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(Blockly.utils.Svg.PATTERN,{id:"blocklyGridPattern"+a,patternUnits:"userSpaceOnUse"},c);0 document.");}else a=null;return a};Blockly.utils.xml={};Blockly.utils.xml.NAME_SPACE="https://developers.google.com/blockly/xml";Blockly.utils.xml.document=function(){return document};Blockly.utils.xml.createElement=function(a){return Blockly.utils.xml.document().createElementNS(Blockly.utils.xml.NAME_SPACE,a)};Blockly.utils.xml.createTextNode=function(a){return Blockly.utils.xml.document().createTextNode(a)};Blockly.utils.xml.textToDomDocument=function(a){return(new DOMParser).parseFromString(a,"text/xml")}; +Blockly.utils.xml.domToText=function(a){return(new XMLSerializer).serializeToString(a)};Blockly.Events.BlockBase=function(a){Blockly.Events.BlockBase.superClass_.constructor.call(this);this.blockId=(this.isBlank="undefined"==typeof a)?"":a.id;this.workspaceId=this.isBlank?"":a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.BlockBase,Blockly.Events.Abstract);Blockly.Events.BlockBase.prototype.toJson=function(){var a=Blockly.Events.BlockBase.superClass_.toJson.call(this);a.blockId=this.blockId;return a}; +Blockly.Events.BlockBase.prototype.fromJson=function(a){Blockly.Events.BlockBase.superClass_.fromJson.call(this,a);this.blockId=a.blockId};Blockly.Events.Change=function(a,b,c,d,e){Blockly.Events.Change.superClass_.constructor.call(this,a);a&&(this.element="undefined"==typeof b?"":b,this.name="undefined"==typeof c?"":c,this.oldValue="undefined"==typeof d?"":d,this.newValue="undefined"==typeof e?"":e)};Blockly.utils.object.inherits(Blockly.Events.Change,Blockly.Events.BlockBase); +Blockly.Events.BlockChange=Blockly.Events.Change;Blockly.Events.Change.prototype.type=Blockly.Events.CHANGE;Blockly.Events.Change.prototype.toJson=function(){var a=Blockly.Events.Change.superClass_.toJson.call(this);a.element=this.element;this.name&&(a.name=this.name);a.oldValue=this.oldValue;a.newValue=this.newValue;return a}; +Blockly.Events.Change.prototype.fromJson=function(a){Blockly.Events.Change.superClass_.fromJson.call(this,a);this.element=a.element;this.name=a.name;this.oldValue=a.oldValue;this.newValue=a.newValue};Blockly.Events.Change.prototype.isNull=function(){return this.oldValue==this.newValue}; +Blockly.Events.Change.prototype.run=function(a){var b=this.getEventWorkspace_().getBlockById(this.blockId);if(b)switch(b.mutator&&b.mutator.setVisible(!1),a=a?this.newValue:this.oldValue,this.element){case "field":(b=b.getField(this.name))?b.setValue(a):console.warn("Can't set non-existent field: "+this.name);break;case "comment":b.setCommentText(a||null);break;case "collapsed":b.setCollapsed(!!a);break;case "disabled":b.setEnabled(!a);break;case "inline":b.setInputsInline(!!a);break;case "mutation":var c= +"";b.mutationToDom&&(c=(c=b.mutationToDom())&&Blockly.Xml.domToText(c));if(b.domToMutation){var d=Blockly.Xml.textToDom(a||"");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){Blockly.Events.Create.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),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;this.recordUndo||(a.recordUndo=this.recordUndo);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;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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){Blockly.Events.Delete.superClass_.constructor.call(this,a);if(a){if(a.getParent())throw Error("Connected blocks cannot be deleted.");a.isShadow()&&(this.recordUndo=!1);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.oldXml=Blockly.Xml.domToText(this.oldXml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Delete.prototype.fromJson=function(a){Blockly.Events.Delete.superClass_.fromJson.call(this,a);this.oldXml=Blockly.Xml.textToDom(a.oldXml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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){Blockly.Events.Move.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),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));this.recordUndo||(a.recordUndo=this.recordUndo);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;if(a.newCoordinate){var b=a.newCoordinate.split(",");this.newCoordinate=new Blockly.utils.Coordinate(Number(b[0]),Number(b[1]))}void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CREATE,Blockly.Events.Create);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.DELETE,Blockly.Events.Delete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CHANGE,Blockly.Events.Change); +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MOVE,Blockly.Events.Move);Blockly.Events.FinishedLoading=function(a){this.isBlank="undefined"==typeof a;this.workspaceId=a?a.id:"";this.group=Blockly.Events.getGroup();this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.FinishedLoading,Blockly.Events.Abstract);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.isBlank=!1;this.workspaceId=a.workspaceId;this.group=a.group};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.FINISHED_LOADING,Blockly.Events.FinishedLoading);Blockly.Events.VarBase=function(a){Blockly.Events.VarBase.superClass_.constructor.call(this);this.varId=(this.isBlank="undefined"==typeof a)?"":a.getId();this.workspaceId=this.isBlank?"":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){Blockly.Events.VarCreate.superClass_.constructor.call(this,a);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){Blockly.Events.VarDelete.superClass_.constructor.call(this,a);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){Blockly.Events.VarRename.superClass_.constructor.call(this,a);a&&(this.oldName=a.name,this.newName="undefined"==typeof b?"":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.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_CREATE,Blockly.Events.VarCreate);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_DELETE,Blockly.Events.VarDelete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_RENAME,Blockly.Events.VarRename);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){if(a.isInsertionMarker()&&(a=a.getChildren(!1)[0],!a))return new DocumentFragment;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){if(a.isInsertionMarker())return(a=a.getChildren(!1)[0])?Blockly.Xml.blockToDom(a):new DocumentFragment;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(d=0;e=a.inputList[d];d++){var h;f=!0;if(e.type!=Blockly.DUMMY_INPUT){var k=e.connection.targetBlock();e.type==Blockly.INPUT_VALUE?h=Blockly.utils.xml.createElement("value"):e.type==Blockly.NEXT_STATEMENT&&(h=Blockly.utils.xml.createElement("statement")); +g=e.connection.getShadowDom();!g||k&&k.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,b));k&&(g=Blockly.Xml.blockToDom(k,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h.appendChild(g),f=!1));h.setAttribute("name",e.name);f||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(d=a.getNextBlock())g=Blockly.Xml.blockToDom(d,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h=Blockly.utils.xml.createElement("next"),h.appendChild(g),c.appendChild(h));g=a.nextConnection&&a.nextConnection.getShadowDom();!g||d&&d.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,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.NodeType.TEXT_NODE&&""==d.data.trim()&&c.firstChild!=d&&Blockly.utils.dom.removeNode(d);c&&(d=c,c=c.nextSibling,d.nodeType==Blockly.utils.dom.NodeType.TEXT_NODE&&""==d.data.trim()&&Blockly.utils.dom.removeNode(d))}return a}; +Blockly.Xml.domToText=function(a){return Blockly.utils.xml.domToText(a).replace(/<(\w+)([^<]*)\/>/g,"<$1$2>")};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;Object.prototype.hasOwnProperty.call(b,"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=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.dispose=function(){Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.hide()};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.textContent="";var a=Blockly.Tooltip.getTooltipOfObject(Blockly.Tooltip.element_);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.container_=null; +Blockly.WorkspaceDragSurfaceSvg.prototype.createDom=function(){this.SVG_||(this.SVG_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.wsCoordinate_=null;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.createTopNode=function(a){var b=a.previousConnection||a.outputConnection;return b?Blockly.ASTNode.createConnectionNode(b):Blockly.ASTNode.createBlockNode(a)};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(Blockly.utils.Svg.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;ec||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case Blockly.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case Blockly.OUTPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(b.isConnected()&& +!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!=Blockly.draggingConnections.indexOf(b)?!1:!0};Blockly.ConnectionChecker.prototype.canConnectToPrevious_=function(a,b){if(a.targetConnection||-1!=Blockly.draggingConnections.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; +Blockly.registry.register(Blockly.registry.Type.CONNECTION_CHECKER,Blockly.registry.DEFAULT,Blockly.ConnectionChecker);Blockly.VariableMap=function(a){this.variableMap_=Object.create(null);this.workspace=a};Blockly.VariableMap.prototype.clear=function(){this.variableMap_=Object.create(null)};Blockly.VariableMap.prototype.renameVariable=function(a,b){var c=this.getVariable(b,a.type),d=this.workspace.getAllBlocks(!1);Blockly.Events.setGroup(!0);try{c&&c.getId()!=a.getId()?this.renameVariableWithConflict_(a,b,c,d):this.renameVariableAndUses_(a,b,d)}finally{Blockly.Events.setGroup(!1)}}; +Blockly.VariableMap.prototype.renameVariableById=function(a,b){var c=this.getVariableById(a);if(!c)throw Error("Tried to rename a variable that didn't exist. ID: "+a);this.renameVariable(c,b)};Blockly.VariableMap.prototype.renameVariableAndUses_=function(a,b,c){Blockly.Events.fire(new Blockly.Events.VarRename(a,b));a.name=b;for(b=0;bthis.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.getUndoStack=function(){return this.undoStack_};Blockly.Workspace.prototype.getRedoStack=function(){return this.redoStack_}; +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(Blockly.utils.Svg.G,{},null);var c={filter:"url(#"+this.workspace_.getRenderer().getConstants().embossFilterId+")"};Blockly.utils.userAgent.JAVA_FX&&(c={});c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,c,this.bubbleGroup_);this.bubbleArrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{},c);this.bubbleBack_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.G,{"class":this.workspace_.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.bubbleGroup_),b=2*Blockly.Bubble.BORDER_WIDTH,Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.POLYGON,{points:"0,x x,x x,0".replace(/x/g,b.toString())},this.resizeGroup_),Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{"class":"blocklyResizeLine",x1:b/3,y1:b-1,x2:b- +1,y2:b/3},this.resizeGroup_),Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.setDeleteStyle=function(a){}; +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.Bubble.textToDom=function(a){var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText blocklyBubbleText blocklyNoPointerEvents",y:Blockly.Bubble.BORDER_WIDTH},null);a=a.split("\n");for(var c=0;c(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.ASTNode.createTopNode(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.fireWorkspaceClick_=function(a){a=new Blockly.Events.Click(null,a.id,"workspace");Blockly.Events.fire(a)}; +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(){if(this.flyout_&&this.flyout_.autoClose)this.targetBlock_.isEnabled()&&(Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump());else{var a=new Blockly.Events.Click(this.startBlock_,this.startWorkspace_.id,"block");Blockly.Events.fire(a)}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();this.fireWorkspaceClick_(this.startWorkspace_||b)};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.value_=this.DEFAULT_VALUE;this.tooltip_=this.validator_=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.DEFAULT_VALUE=null;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};Blockly.Field.prototype.getConstants=function(){!this.constants_&&this.sourceBlock_&&this.sourceBlock_.workspace&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants());return this.constants_};Blockly.Field.prototype.getSourceBlock=function(){return this.sourceBlock_}; +Blockly.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.borderRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().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(){this.textElement_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText"},this.fieldGroup_);this.getConstants().FIELD_TEXT_BASELINE_CENTER&&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);Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_());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.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.updateSize_=function(a){var b=this.getConstants();a=void 0!=a?a:this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;var c=2*a,d=b.FIELD_TEXT_HEIGHT,e=0;this.textElement_&&(e=Blockly.utils.dom.getFastTextWidth(this.textElement_,b.FIELD_TEXT_FONTSIZE,b.FIELD_TEXT_FONTWEIGHT,b.FIELD_TEXT_FONTFAMILY),c+=e);this.borderRect_&&(d=Math.max(d,b.FIELD_BORDER_RECT_HEIGHT));this.size_.height=d;this.size_.width=c;this.positionTextElement_(a,e);this.positionBorderRect_()}; +Blockly.Field.prototype.positionTextElement_=function(a,b){if(this.textElement_){var c=this.getConstants(),d=this.size_.height/2;this.textElement_.setAttribute("x",this.sourceBlock_.RTL?this.size_.width-b-a:a);this.textElement_.setAttribute("y",c.FIELD_TEXT_BASELINE_CENTER?d:d-c.FIELD_TEXT_HEIGHT/2+c.FIELD_TEXT_BASELINE)}}; +Blockly.Field.prototype.positionBorderRect_=function(){this.borderRect_&&(this.borderRect_.setAttribute("width",this.size_.width),this.borderRect_.setAttribute("height",this.size_.height),this.borderRect_.setAttribute("rx",this.getConstants().FIELD_BORDER_RECT_RADIUS),this.borderRect_.setAttribute("ry",this.getConstants().FIELD_BORDER_RECT_RADIUS))}; +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 new Blockly.utils.Rect(c.y,c.y+ +a,c.x,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.markDirty=function(){this.isDirty_=!0;this.constants_=null};Blockly.Field.prototype.forceRerender=function(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours(),this.updateMarkers_())}; +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.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(b&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(b,"field",this.name||null,c,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};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){a||""===a||(a=this.sourceBlock_);var b=this.getClickTarget_();b?b.tooltip=a:this.tooltip_=a};Blockly.Field.prototype.getTooltip=function(){var a=this.getClickTarget_();return a?Blockly.Tooltip.getTooltipOfObject(a):Blockly.Tooltip.getTooltipOfObject({tooltip:this.tooltip_})}; +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.applyColour());b.name=c;b.setVisible(this.isVisible());c=b;c.prefixField&&(a=this.insertFieldAt(a,c.prefixField));this.fieldRow.splice(a,0,b);++a;c.suffixField&&(a=this.insertFieldAt(a,c.suffixField));this.sourceBlock_.rendered&& +(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return a};Blockly.Input.prototype.removeField=function(a,b){for(var c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');};Blockly.Input.prototype.isVisible=function(){return this.visible_}; +Blockly.Input.prototype.setVisible=function(a){var b=[];if(this.visible_==a)return b;this.visible_=a;for(var c=0,d;d=this.fieldRow[c];c++)d.setVisible(a);this.connection&&(this.connection=this.connection,a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),c=this.connection.targetBlock())&&(c.getSvgRoot().style.display=a?"block":"none");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_=this.sourceBlock_,this.sourceBlock_.render());return this};Blockly.Input.prototype.setShadowDom=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setShadowDom(a);return this}; +Blockly.Input.prototype.getShadowDom=function(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()};Blockly.Input.prototype.init=function(){if(this.sourceBlock_.workspace.rendered)for(var a=0;aa&&(e=e.substring(0,a-3)+"...");return e};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?this.menuItems_.length:a,-1)};Blockly.Menu.prototype.highlightFirst_=function(){this.highlightHelper_(-1,1)};Blockly.Menu.prototype.highlightLast_=function(){this.highlightHelper_(this.menuItems_.length,-1)};Blockly.Menu.prototype.highlightHelper_=function(a,b){a+=b;for(var c;c=this.menuItems_[a];){if(c.isEnabled()){this.setHighlighted(c);break}a+=b}}; +Blockly.Menu.prototype.handleMouseOver_=function(a){(a=this.getMenuItem_(a.target))&&(a.isEnabled()?this.highlightedItem_!=a&&this.setHighlighted(a):this.setHighlighted(null))};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}(a=this.getMenuItem_(a.target))&&a.performAction()}; +Blockly.Menu.prototype.handleMouseEnter_=function(a){this.focus()};Blockly.Menu.prototype.handleMouseLeave_=function(a){this.getElement()&&(this.blur_(),this.setHighlighted(null))}; +Blockly.Menu.prototype.handleKeyEvent_=function(a){if(this.menuItems_.length&&!(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)){var b=this.highlightedItem_;switch(a.keyCode){case Blockly.utils.KeyCodes.ENTER:case Blockly.utils.KeyCodes.SPACE:b&&b.performAction();break;case Blockly.utils.KeyCodes.UP:this.highlightPrevious();break;case Blockly.utils.KeyCodes.DOWN:this.highlightNext();break;case Blockly.utils.KeyCodes.PAGE_UP:case Blockly.utils.KeyCodes.HOME:this.highlightFirst_();break;case Blockly.utils.KeyCodes.PAGE_DOWN:case Blockly.utils.KeyCodes.END:this.highlightLast_(); +break;default:return}a.preventDefault();a.stopPropagation()}};Blockly.Menu.prototype.getSize=function(){var a=this.getElement(),b=Blockly.utils.style.getSize(a);b.height=a.scrollHeight;return b};Blockly.MenuItem=function(a,b){this.content_=a;this.value_=b;this.enabled_=!0;this.element_=null;this.rightToLeft_=!1;this.roleName_=null;this.highlight_=this.checked_=this.checkable_=!1;this.actionHandler_=null}; +Blockly.MenuItem.prototype.createDom=function(){var a=document.createElement("div");a.id=Blockly.utils.IdGenerator.getNextUniqueId();this.element_=a;a.className="blocklyMenuItem goog-menuitem "+(this.enabled_?"":"blocklyMenuItemDisabled goog-menuitem-disabled ")+(this.checked_?"blocklyMenuItemSelected goog-option-selected ":"")+(this.highlight_?"blocklyMenuItemHighlight goog-menuitem-highlight ":"")+(this.rightToLeft_?"blocklyMenuItemRtl goog-menuitem-rtl ":"");var b=document.createElement("div"); +b.className="blocklyMenuItemContent goog-menuitem-content";if(this.checkable_){var c=document.createElement("div");c.className="blocklyMenuItemCheckbox goog-menuitem-checkbox";b.appendChild(c)}c=this.content_;"string"==typeof this.content_&&(c=document.createTextNode(this.content_));b.appendChild(c);a.appendChild(b);this.roleName_&&Blockly.utils.aria.setRole(a,this.roleName_);Blockly.utils.aria.setState(a,Blockly.utils.aria.State.SELECTED,this.checkable_&&this.checked_||!1);Blockly.utils.aria.setState(a, +Blockly.utils.aria.State.DISABLED,!this.enabled_);return a};Blockly.MenuItem.prototype.dispose=function(){this.element_=null};Blockly.MenuItem.prototype.getElement=function(){return this.element_};Blockly.MenuItem.prototype.getId=function(){return this.element_.id};Blockly.MenuItem.prototype.getValue=function(){return this.value_};Blockly.MenuItem.prototype.setRightToLeft=function(a){this.rightToLeft_=a};Blockly.MenuItem.prototype.setRole=function(a){this.roleName_=a}; +Blockly.MenuItem.prototype.setCheckable=function(a){this.checkable_=a};Blockly.MenuItem.prototype.setChecked=function(a){this.checked_=a};Blockly.MenuItem.prototype.setHighlighted=function(a){this.highlight_=a;var b=this.getElement();b&&this.isEnabled()&&(a?(Blockly.utils.dom.addClass(b,"blocklyMenuItemHighlight"),Blockly.utils.dom.addClass(b,"goog-menuitem-highlight")):(Blockly.utils.dom.removeClass(b,"blocklyMenuItemHighlight"),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};Blockly.MenuItem.prototype.performAction=function(){this.isEnabled()&&this.actionHandler_&&this.actionHandler_(this)};Blockly.MenuItem.prototype.onAction=function(a,b){this.actionHandler_=a.bind(b)};Blockly.ContextMenu={};Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.menu_=null;Blockly.ContextMenu.show=function(a,b,c){Blockly.WidgetDiv.show(Blockly.ContextMenu,c,Blockly.ContextMenu.dispose);if(b.length){var d=Blockly.ContextMenu.populate_(b,c);Blockly.ContextMenu.menu_=d;Blockly.ContextMenu.position_(d,a,c);setTimeout(function(){d.focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()}; +Blockly.ContextMenu.populate_=function(a,b){var c=new Blockly.Menu;c.setRole(Blockly.utils.aria.Role.MENU);for(var d=0,e;e=a[d];d++){var f=new Blockly.MenuItem(e.text);f.setRightToLeft(b);f.setRole(Blockly.utils.aria.Role.MENUITEM);c.addChild(f);f.setEnabled(e.enabled);if(e.enabled)f.onAction(function(g){Blockly.ContextMenu.hide();this.callback(this.scope)},e)}return c}; +Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBox();b=new Blockly.utils.Rect(b.clientY+d.top,b.clientY+d.top,b.clientX+d.left,b.clientX+d.left);Blockly.ContextMenu.createWidget_(a);var e=a.getSize();c&&(b.left+=e.width,b.right+=e.width,d.left+=e.width,d.right+=e.width);Blockly.WidgetDiv.positionWithAnchor(d,b,e,c);a.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.dispose=function(){Blockly.ContextMenu.menu_&&(Blockly.ContextMenu.menu_.dispose(),Blockly.ContextMenu.menu_=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.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 d=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);d.moveBy(e.x,e.y);a.rendered&&(d.initSvg(),d.render(),d.select())};return c};Blockly.ContextMenuItems={};Blockly.ContextMenuItems.registerUndo=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.UNDO},preconditionFn:function(a){return 0b.length?Blockly.ContextMenuItems.deleteNext_(b,c):Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",b.length),function(d){d&&Blockly.ContextMenuItems.deleteNext_(b,c)})}},scopeType:Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})}; +Blockly.ContextMenuItems.registerWorkspaceOptions_=function(){Blockly.ContextMenuItems.registerUndo();Blockly.ContextMenuItems.registerRedo();Blockly.ContextMenuItems.registerCleanup();Blockly.ContextMenuItems.registerCollapse();Blockly.ContextMenuItems.registerExpand();Blockly.ContextMenuItems.registerDeleteAll()}; +Blockly.ContextMenuItems.registerDuplicate=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.DUPLICATE_BLOCK},preconditionFn:function(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback:function(a){a.block&&Blockly.duplicate(a.block)},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK,id:"blockDuplicate",weight:1})}; +Blockly.ContextMenuItems.registerComment=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getCommentIcon()?Blockly.Msg.REMOVE_COMMENT:Blockly.Msg.ADD_COMMENT},preconditionFn:function(a){a=a.block;return Blockly.utils.userAgent.IE||a.isInFlyout||!a.workspace.options.comments||a.isCollapsed()||!a.isEditable()?"hidden":"enabled"},callback:function(a){a=a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK, +id:"blockComment",weight:2})}; +Blockly.ContextMenuItems.registerInline=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getInputsInline()?Blockly.Msg.EXTERNAL_INPUTS:Blockly.Msg.INLINE_INPUTS},preconditionFn:function(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(var b=1;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(),b.getSvgRoot().style.display="block")};Blockly.RenderedConnection.prototype.respawnShadow_=function(){Blockly.RenderedConnection.superClass_.respawnShadow_.call(this);var a=this.targetBlock();a&&(a.initSvg(),a.render(!1),a=this.getSourceBlock(),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();var c=b.rendered,d=a.rendered;c&&b.updateDisabled();d&&a.updateDisabled();c&&d&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?a.render():b.render());if(b=b.getInputWithBlock(a))b=b.isVisible(),a.getSvgRoot().style.display=b?"block":"none"}; +Blockly.RenderedConnection.prototype.onCheckChanged_=function(){!this.isConnected()||this.targetConnection&&this.getConnectionChecker().canConnect(this,this.targetConnection,!1)||((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.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},null);this.svgGroup_.translate_="";this.style=a.getRenderer().getConstants().getBlockStyle(null);this.pathObject=a.getRenderer().makePathObject(this.svgGroup_,this.style);this.renderIsInProgress_=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.userAgent.IE&&this.svgGroup_.setAttribute("data-id",this.id)};Blockly.utils.object.inherits(Blockly.BlockSvg,Blockly.Block);Blockly.BlockSvg.prototype.height=0;Blockly.BlockSvg.prototype.width=0;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(l){var m=e-d[l].x,n=f-d[l].y;Math.sqrt(m*m+n*n)<=b&&k.push(d[l]);return na)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;eMath.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_)||(this.oldScale_=a,this.oldTop_=b,this.oldLeft_=c,a=new Blockly.Events.ViewportChange(b,c,a,this.id),Blockly.Events.fire(a))}}; +Blockly.WorkspaceSvg.prototype.translate=function(a,b){if(this.useWorkspaceDragSurface_&&this.isDragSurfaceActive_)this.workspaceDragSurface_.translateSurface(a,b);else{var c="translate("+a+","+b+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",c);this.svgBubbleCanvas_.setAttribute("transform",c)}this.blockDragSurface_&&this.blockDragSurface_.translateAndScaleGroup(a,b,this.scale);this.grid_&&this.grid_.moveTo(a,b);this.maybeFireViewportChangeEvent()}; +Blockly.WorkspaceSvg.prototype.resetDragSurface=function(){if(this.useWorkspaceDragSurface_){this.isDragSurfaceActive_=!1;var a=this.workspaceDragSurface_.getSurfaceTranslation();this.workspaceDragSurface_.clearAndHide(this.svgGroup_);a="translate("+a.x+","+a.y+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",a);this.svgBubbleCanvas_.setAttribute("transform",a)}}; +Blockly.WorkspaceSvg.prototype.setupDragSurface=function(){if(this.useWorkspaceDragSurface_&&!this.isDragSurfaceActive_){this.isDragSurfaceActive_=!0;var a=this.svgBlockCanvas_.previousSibling,b=parseInt(this.getParentSvg().getAttribute("width"),10),c=parseInt(this.getParentSvg().getAttribute("height"),10),d=Blockly.utils.getRelativeXY(this.getCanvas());this.workspaceDragSurface_.setContentsAndShow(this.getCanvas(),this.getBubbleCanvas(),a,b,c,this.scale);this.workspaceDragSurface_.translateSurface(d.x, +d.y)}};Blockly.WorkspaceSvg.prototype.getBlockDragSurface=function(){return this.blockDragSurface_};Blockly.WorkspaceSvg.prototype.getWidth=function(){var a=this.getMetrics();return a?a.viewWidth/this.scale:0}; +Blockly.WorkspaceSvg.prototype.setVisible=function(a){this.isVisible_=a;if(this.svgGroup_)if(this.scrollbar&&this.scrollbar.setContainerVisible(a),this.getFlyout()&&this.getFlyout().setContainerVisible(a),this.getParentSvg().style.display=a?"block":"none",this.toolbox_&&this.toolbox_.setVisible(a),a){a=this.getAllBlocks(!1);for(var b=a.length-1;0<=b;b--)a[b].markDirty();this.render();this.toolbox_&&this.toolbox_.position()}else Blockly.hideChaff(!0)}; +Blockly.WorkspaceSvg.prototype.render=function(){for(var a=this.getAllBlocks(!1),b=a.length-1;0<=b;b--)a[b].render(!1);if(this.currentGesture_)for(a=this.currentGesture_.getInsertionMarkers(),b=0;b=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()&&Blockly.WorkspaceComment.fireCreateEvent(b);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_&&"function"==typeof this.toolbox_.getClientRect?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.getTopBoundedElements();if(!a.length)return new Blockly.utils.Rect(0,0,0,0);for(var b=a[0].getBoundingRectangle(),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){if(!this.options.readOnly&&!this.isFlyout){var b=Blockly.ContextMenuRegistry.registry.getContextMenuOptions(Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,{workspace:this});this.configureContextMenu&&this.configureContextMenu(b,a);Blockly.ContextMenu.show(a,b,this.RTL)}}; +Blockly.WorkspaceSvg.prototype.updateToolbox=function(a){if(a=Blockly.utils.toolbox.convertToolboxDefToJson(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(Blockly.utils.toolbox.hasCategories(a)){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.render(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree= +a;this.flyout_.show(a)}}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&&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&&ag.viewBottom||g.contentLeftg.viewRight){h=null;f&&(h=Blockly.Events.getGroup(),Blockly.Events.setGroup(f.group));switch(f.type){case Blockly.Events.BLOCK_CREATE:case Blockly.Events.BLOCK_MOVE:var l= +e.getBlockById(f.blockId);l&&(l=l.getRootBlock());break;case Blockly.Events.COMMENT_CREATE:case Blockly.Events.COMMENT_MOVE:l=e.getCommentById(f.commentId)}if(l){k=l.getBoundingRectangle();k.height=k.bottom-k.top;k.width=k.right-k.left;var m=g.viewTop,n=g.viewBottom-k.height;n=Math.max(m,n);m=Blockly.utils.math.clamp(m,k.top,n)-k.top;n=g.viewLeft;var p=g.viewRight-k.width;g.RTL?n=Math.min(p,n):p=Math.max(n,p);g=Blockly.utils.math.clamp(n,k.left,p)-k.left;l.moveBy(g,m)}f&&(!f.group&&l&&console.warn("Moved object in bounds but there was no event group. This may break undo."), +null!==h&&Blockly.Events.setGroup(h))}}});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(e){Blockly.utils.isTargetInput(e)||e.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),"function"==typeof d.scrollToStart&& +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;bb.indexOf(d))throw Error(d+" is not a valid modifier key.");}; +Blockly.ShortcutRegistry.prototype.createSerializedKey=function(a,b){var c="";if(b){this.checkModifiers_(b);for(var d in Blockly.ShortcutRegistry.modifierKeys)-11'),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="4.20201217.0";Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.parentContainer=null;Blockly.svgSize=function(a){return new Blockly.utils.Size(a.cachedWidth_,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()))Blockly.ShortcutRegistry.registry.onKeyDown(b,a)}; +Blockly.deleteBlock=function(a){a.workspace.isFlyout||(Blockly.Events.setGroup(!0),Blockly.hideChaff(),a.dispose(!0,!0),Blockly.Events.setGroup(!1))};Blockly.copy=function(a){if(a=a.toCopyData())Blockly.clipboardXml_=a.xml,Blockly.clipboardSource_=a.source,Blockly.clipboardTypeCounts_=a.typeCounts}; +Blockly.paste=function(){if(!Blockly.clipboardXml_)return!1;var a=Blockly.clipboardSource_;a.isFlyout&&(a=a.targetWorkspace);return Blockly.clipboardTypeCounts_&&a.isCapacityAvailable(Blockly.clipboardTypeCounts_)?(Blockly.Events.setGroup(!0),a.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1),!0):!1}; +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.closeFlyout(),(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.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_TOP||this.targetWorkspace.getToolbox()|| +this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.HorizontalFlyout);Blockly.VerticalFlyout=function(a){Blockly.VerticalFlyout.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.VerticalFlyout,Blockly.Flyout);Blockly.VerticalFlyout.registryName="verticalFlyout"; +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{contentHeight:a.height*this.workspace_.scale+2*this.MARGIN,contentWidth:a.width*this.workspace_.scale+2*this.MARGIN,contentTop:a.y,contentLeft:a.x,viewHeight:c,viewWidth:d,viewTop:-this.workspace_.scrollY+ +a.y,viewLeft:-this.workspace_.scrollX,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.getX=function(){var a=this.targetWorkspace.getMetrics();return a?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.getY=function(){return 0}; +Blockly.VerticalFlyout.prototype.position=function(){if(this.isVisible()){var a=this.targetWorkspace.getMetrics();if(a){this.height_=a.viewHeight;this.setBackgroundPath_(this.width_-this.CORNER_RADIUS,a.viewHeight-2*this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}}; +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();Blockly.DropDownDiv.hideWithoutAnimation()}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.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_LEFT||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY); +this.width_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.VerticalFlyout);Blockly.FlyoutButton=function(a,b,c,d){this.workspace_=a;this.targetWorkspace_=b;this.text_=c.text;this.position_=new Blockly.utils.Coordinate(0,0);this.isLabel_=d;this.callbackKey_=c.callbackKey||c.callbackkey;this.cssClass_=c["web-class"]||null;this.onMouseUpWrapper_=null;this.info=c};Blockly.FlyoutButton.MARGIN_X=5;Blockly.FlyoutButton.MARGIN_Y=2;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(Blockly.utils.Svg.G,{"class":a},this.workspace_.getCanvas());if(!this.isLabel_)var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"blocklyFlyoutButtonShadow",rx:4,ry:4,x:1,y:1},this.svgGroup_);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":this.isLabel_? +"blocklyFlyoutLabelBackground":"blocklyFlyoutButtonBackground",rx:4,ry:4},this.svgGroup_);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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"));var e=Blockly.utils.style.getComputedStyle(c, +"fontSize"),f=Blockly.utils.style.getComputedStyle(c,"fontWeight"),g=Blockly.utils.style.getComputedStyle(c,"fontFamily");this.width=Blockly.utils.dom.getFastTextWidthWithSizeString(c,e,f,g);d=Blockly.utils.dom.measureFontMetrics(d,e,f,g);this.height=d.height;this.isLabel_||(this.width+=2*Blockly.FlyoutButton.MARGIN_X,this.height+=2*Blockly.FlyoutButton.MARGIN_Y,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/2-d.height/2+d.baseline);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.isLabel=function(){return this.isLabel_};Blockly.FlyoutButton.prototype.getPosition=function(){return this.position_};Blockly.FlyoutButton.prototype.getButtonText=function(){return this.text_}; +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;,}".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.isInitialized=null; +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;c>>/sprites.png);","height: 16px;","vertical-align: middle;","visibility: hidden;","width: 16px;","}",".blocklyTreeIconClosed {","background-position: -32px -1px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeIconClosed {',"background-position: 0 -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosed {","background-position: -32px -17px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeSelected>.blocklyTreeIconClosed {', +"background-position: 0 -17px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeLabel {","cursor: default;","font: 16px sans-serif;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}"]); +Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.ToolboxCategory.registrationName,Blockly.ToolboxCategory);Blockly.ToolboxSeparator=function(a,b){Blockly.ToolboxSeparator.superClass_.constructor.call(this,a,b);this.cssConfig_={container:"blocklyTreeSeparator"};Blockly.utils.object.mixin(this.cssConfig_,a.cssconfig||a.cssConfig)};Blockly.utils.object.inherits(Blockly.ToolboxSeparator,Blockly.ToolboxItem);Blockly.ToolboxSeparator.registrationName="sep";Blockly.ToolboxSeparator.prototype.init=function(){this.createDom_()}; +Blockly.ToolboxSeparator.prototype.createDom_=function(){var a=document.createElement("div");Blockly.utils.dom.addClass(a,this.cssConfig_.container);return this.htmlDiv_=a};Blockly.ToolboxSeparator.prototype.getDiv=function(){return this.htmlDiv_};Blockly.ToolboxSeparator.prototype.dispose=function(){Blockly.utils.dom.removeNode(this.htmlDiv_)};Blockly.Css.register('.blocklyTreeSeparator {,border-bottom: solid #e5e5e5 1px;,height: 0;,margin: 5px 0;,},.blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {,border-right: solid #e5e5e5 1px;,border-bottom: none;,height: auto;,margin: 0 5px 0 5px;,padding: 5px 0;,width: 0;,}'.split(",")); +Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.ToolboxSeparator.registrationName,Blockly.ToolboxSeparator);Blockly.CollapsibleToolboxCategory=function(a,b,c){this.subcategoriesDiv_=null;this.expanded_=!1;this.toolboxItems_=[];Blockly.CollapsibleToolboxCategory.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.CollapsibleToolboxCategory,Blockly.ToolboxCategory);Blockly.CollapsibleToolboxCategory.registrationName="collapsibleCategory"; +Blockly.CollapsibleToolboxCategory.prototype.makeDefaultCssConfig_=function(){var a=Blockly.CollapsibleToolboxCategory.superClass_.makeDefaultCssConfig_.call(this);a.contents="blocklyToolboxContents";return a}; +Blockly.CollapsibleToolboxCategory.prototype.parseContents_=function(a){var b=a.contents,c=!0;if(a.custom)this.flyoutItems_=a.custom;else if(b){a=0;for(var d;d=b[a];a++)!Blockly.registry.hasItem(Blockly.registry.Type.TOOLBOX_ITEM,d.kind)||d.kind.toLowerCase()==Blockly.ToolboxSeparator.registrationName&&c?(this.flyoutItems_.push(d),c=!0):(this.createToolboxItem_(d),c=!1)}}; +Blockly.CollapsibleToolboxCategory.prototype.createToolboxItem_=function(a){var b=a.kind;"CATEGORY"==b.toUpperCase()&&Blockly.utils.toolbox.isCategoryCollapsible(a)&&(b=Blockly.CollapsibleToolboxCategory.registrationName);a=new (Blockly.registry.getClass(Blockly.registry.Type.TOOLBOX_ITEM,b))(a,this.parentToolbox_,this);this.toolboxItems_.push(a)}; +Blockly.CollapsibleToolboxCategory.prototype.init=function(){Blockly.CollapsibleToolboxCategory.superClass_.init.call(this);this.setExpanded("true"==this.toolboxItemDef_.expanded||this.toolboxItemDef_.expanded)}; +Blockly.CollapsibleToolboxCategory.prototype.createDom_=function(){Blockly.CollapsibleToolboxCategory.superClass_.createDom_.call(this);var a=this.getChildToolboxItems();this.subcategoriesDiv_=this.createSubCategoriesDom_(a);Blockly.utils.aria.setRole(this.subcategoriesDiv_,Blockly.utils.aria.Role.GROUP);this.htmlDiv_.appendChild(this.subcategoriesDiv_);return this.htmlDiv_}; +Blockly.CollapsibleToolboxCategory.prototype.createIconDom_=function(){var a=document.createElement("span");this.parentToolbox_.isHorizontal()||(Blockly.utils.dom.addClass(a,this.cssConfig_.icon),a.style.visibility="visible");a.style.display="inline-block";return a}; +Blockly.CollapsibleToolboxCategory.prototype.createSubCategoriesDom_=function(a){var b=document.createElement("div");Blockly.utils.dom.addClass(b,this.cssConfig_.contents);for(var c=0;c>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","padding: 4px 0 4px 0;","position: absolute;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyToolboxContents {","display: flex;","flex-wrap: wrap;","flex-direction: column;", +"}",".blocklyToolboxContents:focus {","outline: none;","}"]);Blockly.registry.register(Blockly.registry.Type.TOOLBOX,Blockly.registry.DEFAULT,Blockly.Toolbox);Blockly.Events.TrashcanOpen=function(a,b){Blockly.Events.TrashcanOpen.superClass_.constructor.call(this,b);this.isOpen=a};Blockly.utils.object.inherits(Blockly.Events.TrashcanOpen,Blockly.Events.UiBase);Blockly.Events.TrashcanOpen.prototype.type=Blockly.Events.TRASHCAN_OPEN;Blockly.Events.TrashcanOpen.prototype.toJson=function(){var a=Blockly.Events.TrashcanOpen.superClass_.toJson.call(this);a.isOpen=this.isOpen;return a}; +Blockly.Events.TrashcanOpen.prototype.fromJson=function(a){Blockly.Events.TrashcanOpen.superClass_.fromJson.call(this,a);this.isOpen=a.isOpen};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TRASHCAN_OPEN,Blockly.Events.TrashcanOpen);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,rendererOverrides:this.workspace_.options.rendererOverrides});if(this.workspace_.horizontalLayout){a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.TOP? +Blockly.utils.toolbox.Position.BOTTOM:Blockly.utils.toolbox.Position.TOP;if(!Blockly.HorizontalFlyout)throw Error("Missing require for Blockly.HorizontalFlyout");this.flyout=new Blockly.HorizontalFlyout(a)}else{a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.RIGHT?Blockly.utils.toolbox.Position.LEFT:Blockly.utils.toolbox.Position.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.ANIMATION_LENGTH_=80;Blockly.Trashcan.ANIMATION_FRAMES_=4;Blockly.Trashcan.OPACITY_MIN_=.4; +Blockly.Trashcan.OPACITY_MAX_=.8;Blockly.Trashcan.MAX_LID_ANGLE_=45;Blockly.Trashcan.prototype.isLidOpen=!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(Blockly.utils.Svg.G,{"class":"blocklyTrash"},null);var a=String(Math.random()).substring(2);var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashBodyClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.BODY_HEIGHT_,y:this.LID_HEIGHT_},b);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashLidClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.LID_HEIGHT_},b);this.svgLid_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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.bindEvent_(this.svgGroup_,"mousedown",this,this.blockMouseDownWhenOpenable_);Blockly.bindEvent_(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),Blockly.Trashcan.ANIMATION_LENGTH_/ +a))};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.setMinOpenness_=function(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*Blockly.Trashcan.MAX_LID_ANGLE_)};Blockly.Trashcan.prototype.closeLid=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.click=function(){this.hasContents_()&&this.openFlyout()};Blockly.Trashcan.prototype.fireUiEvent_=function(a){a=new Blockly.Events.TrashcanOpen(a,this.workspace_.id);Blockly.Events.fire(a)};Blockly.Trashcan.prototype.blockMouseDownWhenOpenable_=function(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()};Blockly.Trashcan.prototype.mouseOver_=function(){this.hasContents_()&&this.setLidOpen(!0)};Blockly.Trashcan.prototype.mouseOut_=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.onDelete_=function(a){if(!(0>=this.workspace_.options.maxTrashcanContents)&&a.type==Blockly.Events.BLOCK_DELETE&&a.oldXml.tagName&&"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.setMinOpenness_(this.HAS_BLOCKS_LID_ANGLE_)}}; +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(Blockly.utils.Svg.RECT,{"class":"blocklyIconShape",rx:"4",ry:"4",height:"16",width:"16"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.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(Blockly.utils.Svg.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,rendererOverrides:this.block_.workspace.options.rendererOverrides});b.toolboxPosition=this.block_.RTL?Blockly.utils.toolbox.Position.RIGHT:Blockly.utils.toolbox.Position.LEFT;if(c=!!a)b.languageTree=Blockly.utils.toolbox.convertToolboxDefToJson(a),b.getMetrics=this.getFlyoutMetrics_.bind(this);this.workspace_=new Blockly.WorkspaceSvg(b);this.workspace_.isMutator=!0;this.workspace_.addChangeListener(Blockly.Events.disableOrphans); +a=c?this.workspace_.addFlyout(Blockly.utils.Svg.G):null;b=this.workspace_.createDom("blocklyMutatorBackground");a&&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(),c=b.width+b.x,d=b.height+3*a,e=this.workspace_.getFlyout();if(e){var f=e.getMetrics_();d=Math.max(d,f.contentHeight+20);c+=e.getWidth()}this.block_.RTL&&(c=-b.x);c+=3*a;if(Math.abs(this.workspaceWidth_-c)>a||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+a,d+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.BubbleOpen(this.block_,a,"mutator")),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));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=this.rootBlock_.RTL?a.getWidth()+b: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.isUiEvent||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();20>d.y&&c.moveBy(0,20-d.y);if(c.RTL){var e=-20,f=this.workspace_.getFlyout();f&&(e-=f.getWidth());d.x>e&&c.moveBy(e-d.x,0)}else 20>d.x&&c.moveBy(20-d.x,0)}}if(this.rootBlock_.workspace==this.workspace_){Blockly.Events.setGroup(!0);c=this.block_; +a=(a=c.mutationToDom())&&Blockly.Xml.domToText(a);b=c.rendered;c.rendered=!1;c.compose(this.rootBlock_);c.rendered=b;c.initSvg();Blockly.getMainWorkspace().keyboardAccessibilityMode&&Blockly.navigation.moveCursorOnBlockMutation(c);c.rendered&&c.render();b=(b=c.mutationToDom())&&Blockly.Xml.domToText(b);if(a!=b){Blockly.Events.fire(new Blockly.Events.BlockChange(c,"mutation",null,a,b));var g=Blockly.Events.getGroup();setTimeout(function(){Blockly.Events.setGroup(g);c.bumpNeighbours();Blockly.Events.setGroup(!1)}, +Blockly.BUMP_DELAY)}this.workspace_.isDragging()||this.resizeBubble_();Blockly.Events.setGroup(!1)}}};Blockly.Mutator.prototype.getFlyoutMetrics_=function(){var a=this.workspace_.getFlyout();a=a?a.getWidth():0;return{contentHeight:0,contentWidth:0,contentTop:0,contentLeft:0,viewHeight:this.workspaceHeight_,viewWidth:this.workspaceWidth_-a,viewTop:0,viewLeft:0,absoluteTop:0,absoluteLeft:this.workspace_.RTL?0:a}};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.getConstants().FULL_BLOCK_FIELDS&&(this.borderRect_?this.borderRect_.setAttribute("stroke",this.sourceBlock_.style.colourTertiary):this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.getConstants().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(){Blockly.prompt(Blockly.Msg.CHANGE_VALUE_TITLE,this.getText(),function(a){this.setValue(this.getValueFromEditorText_(a))}.bind(this))};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_.getScale(),d=this.getConstants().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.getConstants().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.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,b,c);this.moveSurfaceWrapper_=this.clickSurfaceWrapper_=this.clickWrapper_=this.line_=this.gauge_=null};Blockly.utils.object.inherits(Blockly.FieldAngle,Blockly.FieldTextInput);Blockly.FieldAngle.prototype.DEFAULT_VALUE=0; +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(Blockly.utils.Svg.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(Blockly.utils.Svg.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(Blockly.utils.Svg.CIRCLE,{cx:Blockly.FieldAngle.HALF,cy:Blockly.FieldAngle.HALF,r:Blockly.FieldAngle.RADIUS,"class":"blocklyAngleCircle"}, +a);this.gauge_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{"class":"blocklyAngleGauge"},a);this.line_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{x1:Blockly.FieldAngle.HALF,y1:Blockly.FieldAngle.HALF,"class":"blocklyAngleLine"},a);for(var c=0;360>c;c+=15)Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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;Blockly.FieldCheckbox.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.FieldCheckbox,Blockly.Field);Blockly.FieldCheckbox.prototype.DEFAULT_VALUE=!1;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.configure_=function(a){Blockly.FieldCheckbox.superClass_.configure_.call(this,a);a.checkCharacter&&(this.checkChar_=a.checkCharacter)};Blockly.FieldCheckbox.prototype.initView=function(){Blockly.FieldCheckbox.superClass_.initView.call(this);Blockly.utils.dom.addClass(this.textElement_,"blocklyCheckbox");this.textElement_.style.display=this.value_?"block":"none"}; +Blockly.FieldCheckbox.prototype.render_=function(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)};Blockly.FieldCheckbox.prototype.getDisplayText_=function(){return this.checkChar_||Blockly.FieldCheckbox.CHECK_CHAR};Blockly.FieldCheckbox.prototype.setCheckCharacter=function(a){this.checkChar_=a;this.forceRerender()};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,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.getConstants().FIELD_COLOUR_DEFAULT_WIDTH,this.getConstants().FIELD_COLOUR_DEFAULT_HEIGHT);this.getConstants().FIELD_COLOUR_FULL_BLOCK?this.clickTarget_=this.sourceBlock_.getSvgRoot():(this.createBorderRect_(),this.borderRect_.style.fillOpacity="1")}; +Blockly.FieldColour.prototype.applyColour=function(){this.getConstants().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_.rendered&&(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.prototype.DEFAULT_VALUE=Blockly.FieldColour.COLOURS[0];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_)switch(a.name){case Blockly.navigation.actionNames.PREVIOUS:return this.moveHighlightBy_(0,-1),!0;case Blockly.navigation.actionNames.NEXT:return this.moveHighlightBy_(0,1),!0;case Blockly.navigation.actionNames.OUT:return this.moveHighlightBy_(-1,0),!0;case Blockly.navigation.actionNames.IN:return this.moveHighlightBy_(1,0),!0;default:return!1}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.suffixField=this.prefixField=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(Blockly.utils.Svg.IMAGE,{},this.fieldGroup_);this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_();this.borderRect_&&Blockly.utils.dom.addClass(this.borderRect_,"blocklyDropdownRect")}; +Blockly.FieldDropdown.prototype.shouldAddBorderRect_=function(){return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!this.sourceBlock_.isShadow()}; +Blockly.FieldDropdown.prototype.createTextArrow_=function(){this.arrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.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(Blockly.utils.Svg.IMAGE,{height:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_);this.svgArrow_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.getConstants().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());a=this.menu_.getElement();Blockly.utils.dom.addClass(a,"blocklyDropdownMenu");if(this.getConstants().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_&&this.menu_.setHighlighted(this.selectedMenuItem_);this.applyColour()}; +Blockly.FieldDropdown.prototype.dropdownCreate_=function(){var a=new Blockly.Menu;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.prototype.DEFAULT_VALUE="";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(Blockly.utils.Svg.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_);this.clickHandler_&&(this.imageElement_.style.cursor="pointer")};Blockly.FieldImage.prototype.updateSize_=function(){}; +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){Blockly.FieldMultilineInput.superClass_.constructor.call(this,a,b,c);this.textGroup_=null};Blockly.utils.object.inherits(Blockly.FieldMultilineInput,Blockly.FieldTextInput);Blockly.FieldMultilineInput.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.text);return new Blockly.FieldMultilineInput(b,void 0,a)};Blockly.FieldMultilineInput.prototype.toXml=function(a){a.textContent=this.getValue().replace(/\n/g," ");return a}; +Blockly.FieldMultilineInput.prototype.fromXml=function(a){this.setValue(a.textContent.replace(/ /g,"\n"))};Blockly.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}; +Blockly.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.getText();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+=this.getConstants().FIELD_TEXT_HEIGHT+(0this.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="string"===typeof a?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.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.getConstants().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+" .blocklyFlyoutLabelText {","fill: #000;","}",a+" .blocklyText.blocklyBubbleText {","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;","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};Blockly.Events.MarkerMove=function(a,b,c,d){var e=a?a.workspace.id:void 0;d&&d.getType()==Blockly.ASTNode.types.WORKSPACE&&(e=d.getLocation().id);Blockly.Events.MarkerMove.superClass_.constructor.call(this,e);this.blockId=a?a.id:null;this.oldNode=c;this.newNode=d;this.isCursor=b};Blockly.utils.object.inherits(Blockly.Events.MarkerMove,Blockly.Events.UiBase);Blockly.Events.MarkerMove.prototype.type=Blockly.Events.MARKER_MOVE; +Blockly.Events.MarkerMove.prototype.toJson=function(){var a=Blockly.Events.MarkerMove.superClass_.toJson.call(this);a.isCursor=this.isCursor;a.blockId=this.blockId;a.oldNode=this.oldNode;a.newNode=this.newNode;return a};Blockly.Events.MarkerMove.prototype.fromJson=function(a){Blockly.Events.MarkerMove.superClass_.fromJson.call(this,a);this.isCursor=a.isCursor;this.blockId=a.blockId;this.oldNode=a.oldNode;this.newNode=a.newNode}; +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MARKER_MOVE,Blockly.Events.MarkerMove);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.getMarker=function(){return this.marker_};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(Blockly.utils.Svg.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.draw=function(a,b){if(b){this.constants_=this.workspace_.getRenderer().getConstants();var c=this.isCursor()?this.constants_.CURSOR_COLOUR:this.constants_.MARKER_COLOUR;this.colour_=this.marker_.colour||c;this.applyColour_(b);this.showAtLocation_(b);this.fireMarkerEvent_(a,b);a=this.currentMarkerSvg.childNodes[0];void 0!==a&&a.beginElement&&a.beginElement()}else this.hide()}; +Blockly.blockRendering.MarkerSvg.prototype.showAtLocation_=function(a){var b=a.getLocation();a.getType()==Blockly.ASTNode.types.BLOCK?this.showWithBlock_(a):a.getType()==Blockly.ASTNode.types.OUTPUT?this.showWithOutput_(a):b.type==Blockly.INPUT_VALUE?this.showWithInput_(a):b.type==Blockly.NEXT_STATEMENT?this.showWithNext_(a):a.getType()==Blockly.ASTNode.types.PREVIOUS?this.showWithPrevious_(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.showWithBlockPrevOutput_=function(a){a=a.getSourceBlock();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.showWithBlock_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithPrevious_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithOutput_=function(a){this.showWithBlockPrevOutput_(a)}; +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.fireMarkerEvent_=function(a,b){var c=b.getSourceBlock();a=new Blockly.Events.MarkerMove(c,this.isCursor(),a,b);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(Blockly.utils.Svg.G,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT},this.svgGroup_);this.markerSvgLine_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT,style:"display: none"},this.markerSvg_);this.markerSvgRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT, +{"class":"blocklyVerticalMarker",rx:10,ry:10,style:"display: none"},this.markerSvg_);this.markerInput_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none"},this.markerSvg_);this.markerBlock_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none",fill:"none","stroke-width":this.constants_.CURSOR_STROKE_WIDTH},this.markerSvg_);if(this.isCursor()){var a=this.getBlinkProperties_();Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE, +a,this.markerSvgLine_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerInput_);a.attributeName="stroke";Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerBlock_)}return this.markerSvg_}; +Blockly.blockRendering.MarkerSvg.prototype.applyColour_=function(a){this.markerSvgLine_.setAttribute("fill",this.colour_);this.markerSvgRect_.setAttribute("stroke",this.colour_);this.markerInput_.setAttribute("fill",this.colour_);this.markerBlock_.setAttribute("stroke",this.colour_);this.isCursor()&&(a=this.colour_+";transparent;transparent;",this.markerSvgLine_.firstChild.setAttribute("values",a),this.markerInput_.firstChild.setAttribute("values",a),this.markerBlock_.firstChild.setAttribute("values", +a))};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){Object.prototype.hasOwnProperty.call(Blockly.blockRendering.Types,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.inputRows=[];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_);this.inputRows.push(a);var 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.inputRows.push(a));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;d.blocklyPathLight,",a+" .blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"])};Blockly.geras.Highlighter=function(a){this.info_=a;this.inlineSteps_=this.steps_="";this.RTL_=this.info_.RTL;a=a.getRenderer();this.constants_=a.getConstants();this.highlightConstants_=a.getHighlightConstants();this.highlightOffset_=this.highlightConstants_.OFFSET;this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER;this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER;this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB;this.notchPaths_=this.highlightConstants_.NOTCH;this.startPaths_= +this.highlightConstants_.START_HAT;this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH};Blockly.geras.Highlighter.prototype.getPath=function(){return this.steps_+"\n"+this.inlineSteps_}; +Blockly.geras.Highlighter.prototype.drawTopCorner=function(a){this.steps_+=Blockly.utils.svgPaths.moveBy(a.xPos,this.info_.startY);for(var b=0,c;c=a.elements[b];b++)Blockly.blockRendering.Types.isLeftSquareCorner(c)?this.steps_+=this.highlightConstants_.START_POINT:Blockly.blockRendering.Types.isLeftRoundedCorner(c)?this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):Blockly.blockRendering.Types.isPreviousConnection(c)?this.steps_+=this.notchPaths_.pathLeft:Blockly.blockRendering.Types.isHat(c)? +this.steps_+=this.startPaths_.path(this.RTL_):Blockly.blockRendering.Types.isSpacer(c)&&0!=c.width&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",c.xPos+c.width-this.highlightOffset_));this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",a.xPos+a.width-this.highlightOffset_)};Blockly.geras.Highlighter.prototype.drawJaggedEdge_=function(a){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+Blockly.utils.svgPaths.lineOnAxis("v",a.height-this.jaggedTeethPaths_.height-this.highlightOffset_))}; +Blockly.geras.Highlighter.prototype.drawValueInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-b.connectionHeight;this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos+b.width-this.highlightOffset_,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",c)}else this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos+b.width,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}; +Blockly.geras.Highlighter.prototype.drawStatementInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-2*this.insideCornerPaths_.height;this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos,a.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",c)+this.insideCornerPaths_.pathBottom(this.RTL_)+Blockly.utils.svgPaths.lineTo(a.width-b.xPos-this.insideCornerPaths_.width,0)}else this.steps_+=Blockly.utils.svgPaths.moveTo(b.xPos,a.yPos+a.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+ +Blockly.utils.svgPaths.lineTo(a.width-b.xPos-this.insideCornerPaths_.width,0)};Blockly.geras.Highlighter.prototype.drawRightSideRow=function(a){var b=a.xPos+a.width-this.highlightOffset_;a.followsStatement&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",b));this.RTL_&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("H",b),a.height>this.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;eb?b:f;e=e?-1:1;c=(d?-1:1)*c/2;return Blockly.utils.svgPaths.lineTo(-e*f,c)+Blockly.utils.svgPaths.lineTo(e*f,c)}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width:function(c){c/=2;return c>b?b:c},height:function(c){return c},connectionOffsetY:function(c){return c/2},connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c, +!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.makeRounded=function(){function a(d,e,f){var g=d>c?d-c:0;d=(d>c?c:d)/2;return Blockly.utils.svgPaths.arc("a","0 0,1",d,Blockly.utils.svgPaths.point((e?-1:1)*d,(e?-1:1)*d))+Blockly.utils.svgPaths.lineOnAxis("v",(f?1:-1)*g)+Blockly.utils.svgPaths.arc("a","0 0,1",d,Blockly.utils.svgPaths.point((e?1:-1)*d,(e?-1:1)*d))}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,c=2*b;return{type:this.SHAPES.ROUND,isDynamic:!0,width:function(d){d/=2;return d>b?b:d},height:function(d){return d}, +connectionOffsetY:function(d){return d/2},connectionOffsetX:function(d){return-d},pathDown:function(d){return a(d,!1,!1)},pathUp:function(d){return a(d,!0,!1)},pathRightDown:function(d){return a(d,!1,!0)},pathRightUp:function(d){return a(d,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.makeSquared=function(){function a(c,d,e){c-=2*b;return Blockly.utils.svgPaths.arc("a","0 0,1",b,Blockly.utils.svgPaths.point((d?-1:1)*b,(d?-1:1)*b))+Blockly.utils.svgPaths.lineOnAxis("v",(e?1:-1)*c)+Blockly.utils.svgPaths.arc("a","0 0,1",b,Blockly.utils.svgPaths.point((d?1:-1)*b,(d?-1:1)*b))}var b=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE,isDynamic:!0,width:function(c){return b},height:function(c){return c},connectionOffsetY:function(c){return c/2}, +connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c,!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; +Blockly.zelos.ConstantProvider.prototype.shapeFor=function(a){var b=a.getCheck();!b&&a.targetConnection&&(b=a.targetConnection.getCheck());switch(a.type){case Blockly.INPUT_VALUE:case Blockly.OUTPUT_VALUE:a=a.getSourceBlock().getOutputShape();if(null!=a)switch(a){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}if(b&&-1!=b.indexOf("Boolean"))return this.HEXAGONAL;if(b&&-1!=b.indexOf("Number"))return this.ROUNDED; +b&&b.indexOf("String");return this.ROUNDED;case Blockly.PREVIOUS_STATEMENT:case Blockly.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type");}}; +Blockly.zelos.ConstantProvider.prototype.makeNotch=function(){function a(l){return Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/2,0),Blockly.utils.svgPaths.point(l*e*3/4,g/2),Blockly.utils.svgPaths.point(l*e,g)])+Blockly.utils.svgPaths.line([Blockly.utils.svgPaths.point(l*e,f)])+Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/4,g/2),Blockly.utils.svgPaths.point(l*e/2,g),Blockly.utils.svgPaths.point(l*e,g)])+Blockly.utils.svgPaths.lineOnAxis("h",l*d)+Blockly.utils.svgPaths.curve("c", +[Blockly.utils.svgPaths.point(l*e/2,0),Blockly.utils.svgPaths.point(l*e*3/4,-(g/2)),Blockly.utils.svgPaths.point(l*e,-g)])+Blockly.utils.svgPaths.line([Blockly.utils.svgPaths.point(l*e,-f)])+Blockly.utils.svgPaths.curve("c",[Blockly.utils.svgPaths.point(l*e/4,-(g/2)),Blockly.utils.svgPaths.point(l*e/2,-g),Blockly.utils.svgPaths.point(l*e,-g)])}var b=this.NOTCH_WIDTH,c=this.NOTCH_HEIGHT,d=b/3,e=d/3,f=c/2,g=f/2,h=a(1),k=a(-1);return{type:this.SHAPES.NOTCH,width:b,height:c,pathLeft:h,pathRight:k}}; +Blockly.zelos.ConstantProvider.prototype.makeInsideCorners=function(){var a=this.CORNER_RADIUS,b=Blockly.utils.svgPaths.arc("a","0 0,0",a,Blockly.utils.svgPaths.point(-a,a)),c=Blockly.utils.svgPaths.arc("a","0 0,1",a,Blockly.utils.svgPaths.point(-a,a)),d=Blockly.utils.svgPaths.arc("a","0 0,0",a,Blockly.utils.svgPaths.point(a,a)),e=Blockly.utils.svgPaths.arc("a","0 0,1",a,Blockly.utils.svgPaths.point(a,a));return{width:a,height:a,pathTop:b,pathBottom:d,rightWidth:a,rightHeight:a,pathTopRight:c,pathBottomRight:e}}; +Blockly.zelos.ConstantProvider.prototype.generateSecondaryColour_=function(a){return Blockly.utils.colour.blend("#000",a,.15)||a};Blockly.zelos.ConstantProvider.prototype.generateTertiaryColour_=function(a){return Blockly.utils.colour.blend("#000",a,.25)||a}; +Blockly.zelos.ConstantProvider.prototype.createDom=function(a,b,c){Blockly.zelos.ConstantProvider.superClass_.createDom.call(this,a,b,c);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.DEFS,{},a);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FILTER,{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},b);c= +Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},c);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFLOOD,{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},b);this.selectedGlowFilterId= +b.id;this.selectedGlowFilter_=b;a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FILTER,{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},a);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFUNCA,{type:"table", +tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},b);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FEFLOOD,{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},a);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.FECOMPOSITE,{"in":"SourceGraphic",in2:"outGlow",operator:"over"},a);this.replacementGlowFilterId=a.id;this.replacementGlowFilter_= +a}; +Blockly.zelos.ConstantProvider.prototype.getCSS_=function(a){return[a+" .blocklyText,",a+" .blocklyFlyoutLabelText {","font: "+this.FIELD_TEXT_FONTWEIGHT+" "+this.FIELD_TEXT_FONTSIZE+"pt "+this.FIELD_TEXT_FONTFAMILY+";","}",a+" .blocklyText {","fill: #fff;","}",a+" .blocklyNonEditableText>rect: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+" .blocklyFlyoutLabelText {","fill: #575E75;","}",a+" .blocklyText.blocklyBubbleText {","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: "+this.SELECTED_GLOW_COLOUR+";","}",a+" .blocklyDisabled > .blocklyOutlinePath {","fill: url(#blocklyDisabledPattern"+this.randomIdentifier+")","}",a+" .blocklyInsertionMarker>.blocklyPath {", +"fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};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&&!a.statementInputCount&&!a.nextConnection};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&&!a.statementInputCount&&!a.nextConnection};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.hasStatementInput=0=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))&&fc?c:this.height/2,b-c*(1-Math.sin(Math.acos((c-this.constants_.SMALL_PADDING)/c)));default:return 0}if(Blockly.blockRendering.Types.isInlineInput(a)){var e=a.connectedBlock;a=e?e.pathObject.outputShapeType: +a.shape.type;return e&&e.outputConnection&&(e.statementInputCount||e.nextConnection)||c==d.SHAPES.HEXAGONAL&&c!=a?0:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][a]}return Blockly.blockRendering.Types.isField(a)?c==d.SHAPES.ROUND&&a.field instanceof Blockly.FieldTextInput?b-2.75*d.GRID_UNIT:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][0]:Blockly.blockRendering.Types.isIcon(a)?this.constants_.SMALL_PADDING:0}; +Blockly.zelos.RenderInfo.prototype.finalizeVerticalAlignment_=function(){if(!this.outputConnection)for(var a=2;a=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);this.rightSide&&(this.widthWithChildren+=this.rightSide.width)};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.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):Blockly.zelos.Drawer.superClass_.drawOutline_.call(this)}; +Blockly.zelos.Drawer.prototype.drawLeft_=function(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?this.drawLeftDynamicConnection_():Blockly.zelos.Drawer.superClass_.drawLeft_.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 + +import * as Blockly from './core'; +export = Blockly.Blocks; diff --git a/static/js/dist/blocks.js b/static/js/dist/blocks.js new file mode 100644 index 0000000..595be5a --- /dev/null +++ b/static/js/dist/blocks.js @@ -0,0 +1,27 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blocks_compressed'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blocks_compressed')); + } else { // Browser + root.Blockly.Blocks = factory(root.Blockly); + } +}(this, function(Blockly) { +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly Blocks module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Blocks = {}; + +return Blockly.Blocks; +})); diff --git a/static/js/dist/blocks/colour.js b/static/js/dist/blocks/colour.js new file mode 100644 index 0000000..9ab3acb --- /dev/null +++ b/static/js/dist/blocks/colour.js @@ -0,0 +1,122 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/blocks/lists.js b/static/js/dist/blocks/lists.js new file mode 100644 index 0000000..37c53ee --- /dev/null +++ b/static/js/dist/blocks/lists.js @@ -0,0 +1,862 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 && !itemBlock.isInsertionMarker()) { + 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) + .setAlign(Blockly.ALIGN_RIGHT); + 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/static/js/dist/blocks/logic.js b/static/js/dist/blocks/logic.js new file mode 100644 index 0000000..c45089d --- /dev/null +++ b/static/js/dist/blocks/logic.js @@ -0,0 +1,635 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 && !clauseBlock.isInsertionMarker()) { + 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 && + !this.workspace.connectionChecker.doTypeChecks( + blockA.outputConnection, 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.workspace.connectionChecker.doTypeChecks( + block.outputConnection, 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/static/js/dist/blocks/loops.js b/static/js/dist/blocks/loops.js new file mode 100644 index 0000000..772871d --- /dev/null +++ b/static/js/dist/blocks/loops.js @@ -0,0 +1,356 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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) { + // Don't change state if: + // * It's at the start of a drag. + // * It's not a move event. + if (!this.workspace.isDragging || this.workspace.isDragging() || + e.type != Blockly.Events.BLOCK_MOVE) { + return; + } + var enabled = Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN + .getSurroundLoop(this); + this.setWarningText(enabled ? null : + Blockly.Msg['CONTROLS_FLOW_STATEMENTS_WARNING']); + if (!this.isInFlyout) { + var group = Blockly.Events.getGroup(); + // Makes it so the move and the disable event get undone together. + Blockly.Events.setGroup(e.group); + this.setEnabled(enabled); + Blockly.Events.setGroup(group); + } + } +}; + +Blockly.Extensions.registerMixin('controls_flow_in_loop_check', + Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN); diff --git a/static/js/dist/blocks/math.js b/static/js/dist/blocks/math.js new file mode 100644 index 0000000..b6827c5 --- /dev/null +++ b/static/js/dist/blocks/math.js @@ -0,0 +1,566 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 "divisible 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/static/js/dist/blocks/procedures.js b/static/js/dist/blocks/procedures.js new file mode 100644 index 0000000..242fa4f --- /dev/null +++ b/static/js/dist/blocks/procedures.js @@ -0,0 +1,1080 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 initName = Blockly.Procedures.findLegalName('', this); + var nameField = new Blockly.FieldTextInput(initName, + 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 && !paramBlock.isInsertionMarker()) { + 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 initName = Blockly.Procedures.findLegalName('', this); + var nameField = new Blockly.FieldTextInput(initName, + 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); + var caselessName = varName.toLowerCase(); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].id == this.getSourceBlock().id) { + continue; + } + // Other blocks values may not be set yet when this is loaded. + var otherVar = blocks[i].getFieldValue('NAME'); + if (otherVar && otherVar.toLowerCase() == caselessName) { + 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('', '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 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_; + }, + /** + * 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.getVars()) != 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'); + var callName = this.getProcedureCall(); + if (!callName) { + // Rename if name is empty string. + callName = Blockly.Procedures.findLegalName('', this); + this.renameProcedure('', callName); + } + field.appendChild(Blockly.utils.xml.createTextNode(callName)); + 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 programmatically 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.argumentVarModels_ = []; + 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, + getVars: Blockly.Blocks['procedures_callnoreturn'].getVars, + 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/static/js/dist/blocks/text.js b/static/js/dist/blocks/text.js new file mode 100644 index 0000000..9e806be --- /dev/null +++ b/static/js/dist/blocks/text.js @@ -0,0 +1,923 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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, 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); + } + // 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 && !itemBlock.isInsertionMarker()) { + 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) + .setAlign(Blockly.ALIGN_RIGHT); + 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/static/js/dist/blocks/variables.js b/static/js/dist/blocks/variables.js new file mode 100644 index 0000000..65967f9 --- /dev/null +++ b/static/js/dist/blocks/variables.js @@ -0,0 +1,163 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/blocks/variables_dynamic.js b/static/js/dist/blocks/variables_dynamic.js new file mode 100644 index 0000000..de9a364 --- /dev/null +++ b/static/js/dist/blocks/variables_dynamic.js @@ -0,0 +1,180 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/blocks_compressed.js b/static/js/dist/blocks_compressed.js new file mode 100644 index 0000000..4d216d8 --- /dev/null +++ b/static/js/dist/blocks_compressed.js @@ -0,0 +1,182 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.Blocks = factory(root.Blockly); + } +}(this, function(Blockly) { + '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,d=0;d","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,d=1;d<=this.elseifCount_;d++){var e=a.newBlock("controls_if_elseif");e.initSvg();c.connect(e.previousConnection);c=e.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],d=null;a&&!a.isInsertionMarker();){switch(a.type){case "controls_if_elseif":this.elseifCount_++; +b.push(a.valueConnection_);c.push(a.statementConnection_);break;case "controls_if_else":this.elseCount_++;d=a.statementConnection_;break;default:throw TypeError("Unknown block type: "+a.type);}a=a.nextConnection&&a.nextConnection.targetBlock()}this.updateShape_();this.reconnectChildBlocks_(b,c,d)},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),d=this.getInput("DO"+b);a.valueConnection_=c&&c.connection.targetConnection; +a.statementConnection_=d&&d.connection.targetConnection;b++;break;case "controls_if_else":d=this.getInput("ELSE");a.statementConnection_=d&&d.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 d=1;this.getInput("IF"+d);){var e=this.getInput("IF"+d),f=this.getInput("DO"+ +d);a.push(e.connection.targetConnection);b.push(f.connection.targetConnection);d++}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 d=1;d<=this.elseifCount_;d++)Blockly.Mutator.reconnect(a[d],this,"IF"+d),Blockly.Mutator.reconnect(b[d],this,"DO"+d);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&&!this.workspace.connectionChecker.doTypeChecks(b.outputConnection,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"),d=this.outputConnection.targetConnection;if((b||c)&&d)for(var e=0;2>e;e++){var f=1==e?b:c;f&&!f.workspace.connectionChecker.doTypeChecks(f.outputConnection,d)&&(Blockly.Events.setGroup(a.group),d===this.prevParentConnection_?(this.unplug(),d.getSourceBlock().bumpNeighbours()):(f.unplug(),f.bumpNeighbours()),Blockly.Events.setGroup(!1))}this.prevParentConnection_= +d}};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 d={enabled:!0};d.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);d.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(d)}}}}; +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){if(this.workspace.isDragging&&!this.workspace.isDragging()&&a.type==Blockly.Events.BLOCK_MOVE){var b=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(this); +this.setWarningText(b?null:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);if(!this.isInFlyout){var c=Blockly.Events.getGroup();Blockly.Events.setGroup(a.group);this.setEnabled(b);Blockly.Events.setGroup(c)}}}};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=Blockly.Procedures.findLegalName("",this);a=new Blockly.FieldTextInput(a,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 + +import * as Blockly from './blockly'; +export = Blockly; diff --git a/static/js/dist/core.js b/static/js/dist/core.js new file mode 100644 index 0000000..9fdc506 --- /dev/null +++ b/static/js/dist/core.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +(function (Blockly){ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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]; + }); +}; + +// Override textToDomDocument and provide Node.js alternatives to DOMParser and +// XMLSerializer. +if (typeof Blockly.utils.global.document !== 'object') { + Blockly.utils.global.DOMParser = require("jsdom/lib/jsdom/living").DOMParser; + Blockly.utils.global.XMLSerializer = require("jsdom/lib/jsdom/living").XMLSerializer; + var doc = Blockly.utils.xml.textToDomDocument( + ''); + Blockly.utils.xml.document = function() { + return doc; + }; +} + +module.exports = Blockly; +})(require('./blockly')); diff --git a/static/js/dist/core/block.js b/static/js/dist/core/block.js new file mode 100644 index 0000000..b66da2f --- /dev/null +++ b/static/js/dist/core/block.js @@ -0,0 +1,1995 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing one block. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Block'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.Connection'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Events.BlockCreate'); +goog.require('Blockly.Events.BlockDelete'); +goog.require('Blockly.Events.BlockMove'); +goog.require('Blockly.Extensions'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.Input'); +goog.require('Blockly.navigation'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.deprecation'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.string'); +goog.require('Blockly.Workspace'); + +goog.requireType('Blockly.IASTNodeLocation'); + + +/** + * 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 + * @implements {Blockly.IASTNodeLocation} + * @throws When the prototypeName is not valid or not allowed. + */ +Blockly.Block = function(workspace, prototypeName, opt_id) { + if (Blockly.Generator && + typeof Blockly.Generator.prototype[prototypeName] != 'undefined') { + // Occluding Generator class members is not allowed. + throw Error('Block prototypeName "' + prototypeName + + '" conflicts with Blockly.Generator members.'); + } + + /** @type {string} */ + this.id = (opt_id && !workspace.getBlockById(opt_id)) ? + opt_id : Blockly.utils.genUid(); + workspace.setBlockById(this.id, this); + /** @type {Blockly.Connection} */ + this.outputConnection = null; + /** @type {Blockly.Connection} */ + this.nextConnection = null; + /** @type {Blockly.Connection} */ + this.previousConnection = null; + /** @type {!Array.} */ + this.inputList = []; + /** @type {boolean|undefined} */ + this.inputsInline = undefined; + /** + * @type {boolean} + * @private + */ + this.disabled = false; + /** @type {!Blockly.Tooltip.TipInfo} */ + this.tooltip = ''; + /** @type {boolean} */ + this.contextMenu = true; + + /** + * @type {Blockly.Block} + * @protected + */ + this.parentBlock_ = null; + + /** + * @type {!Array.} + * @protected + */ + this.childBlocks_ = []; + + /** + * @type {boolean} + * @private + */ + this.deletable_ = true; + + /** + * @type {boolean} + * @private + */ + this.movable_ = true; + + /** + * @type {boolean} + * @private + */ + this.editable_ = true; + + /** + * @type {boolean} + * @private + */ + this.isShadow_ = false; + + /** + * @type {boolean} + * @protected + */ + this.collapsed_ = false; + + /** + * @type {?number} + * @protected + */ + this.outputShape_ = null; + + /** + * A string representing the comment attached to this block. + * @type {string|Blockly.Comment} + * @deprecated August 2019. Use getCommentText instead. + */ + this.comment = null; + + /** + * A model of the comment attached to this block. + * @type {!Blockly.Block.CommentModel} + * @package + */ + this.commentModel = { + text: null, + pinned: false, + size: new Blockly.utils.Size(160, 80) + }; + + /** + * The block's position in workspace units. (0, 0) is at the workspace's + * origin; scale does not change this value. + * @type {!Blockly.utils.Coordinate} + * @private + */ + this.xy_ = new Blockly.utils.Coordinate(0, 0); + + /** @type {!Blockly.Workspace} */ + this.workspace = workspace; + /** @type {boolean} */ + this.isInFlyout = workspace.isFlyout; + /** @type {boolean} */ + this.isInMutator = workspace.isMutator; + + /** @type {boolean} */ + this.RTL = workspace.RTL; + + /** + * True if this block is an insertion marker. + * @type {boolean} + * @protected + */ + this.isInsertionMarker_ = false; + + /** + * Name of the type of hat. + * @type {string|undefined} + */ + this.hat = undefined; + + /** @type {?boolean} */ + this.rendered = null; + + /** + * A count of statement inputs on the block. + * @type {number} + * @package + */ + this.statementInputCount = 0; + + // Copy the type-specific functions and data from the prototype. + if (prototypeName) { + /** @type {string} */ + this.type = prototypeName; + var prototype = Blockly.Blocks[prototypeName]; + if (!prototype || typeof prototype != 'object') { + throw TypeError('Unknown block type: ' + prototypeName); + } + Blockly.utils.object.mixin(this, prototype); + } + + workspace.addTopBlock(this); + workspace.addTypedBlock(this); + + // All events fired should be part of the same group. + // Any events fired during init should not be undoable, + // so that block creation is atomic. + var existingGroup = Blockly.Events.getGroup(); + if (!existingGroup) { + Blockly.Events.setGroup(true); + } + var initialUndoFlag = Blockly.Events.recordUndo; + + try { + // Call an initialization function, if it exists. + if (typeof this.init == 'function') { + Blockly.Events.recordUndo = false; + this.init(); + Blockly.Events.recordUndo = initialUndoFlag; + } + + // Fire a create event. + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.BlockCreate(this)); + } + + } finally { + if (!existingGroup) { + Blockly.Events.setGroup(false); + } + // In case init threw, recordUndo flag should still be reset. + Blockly.Events.recordUndo = initialUndoFlag; + } + + // Record initial inline state. + /** @type {boolean|undefined} */ + this.inputsInlineDefault = this.inputsInline; + + // Bind an onchange function, if it exists. + if (typeof this.onchange == 'function') { + this.setOnChange(this.onchange); + } +}; + +/** + * @typedef {{ + * text:?string, + * pinned:boolean, + * size:Blockly.utils.Size + * }} + */ +Blockly.Block.CommentModel; + +/** + * The language-neutral id given to the collapsed input. + * @const {string} + */ +Blockly.Block.COLLAPSED_INPUT_NAME = '_TEMP_COLLAPSED_INPUT'; +/** + * The language-neutral id given to the collapsed field. + * @const {string} + */ +Blockly.Block.COLLAPSED_FIELD_NAME = '_TEMP_COLLAPSED_FIELD'; + +/** + * Optional text data that round-trips between blocks and XML. + * Has no effect. May be used by 3rd parties for meta information. + * @type {?string} + */ +Blockly.Block.prototype.data = null; + +/** + * Has this block been disposed of? + * @type {boolean} + * @package + */ +Blockly.Block.prototype.disposed = false; + +/** + * Colour of the block as HSV hue value (0-360) + * This may be null if the block colour was not set via a hue number. + * @type {?number} + * @private + */ +Blockly.Block.prototype.hue_ = null; + +/** + * Colour of the block in '#RRGGBB' format. + * @type {string} + * @protected + */ +Blockly.Block.prototype.colour_ = '#000000'; + +/** + * Name of the block style. + * @type {?string} + * @protected + */ +Blockly.Block.prototype.styleName_ = null; + +/** + * An optional method called during initialization. + * @type {?function()} + */ +Blockly.Block.prototype.init; + +/** + * 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)} + */ +Blockly.Block.prototype.onchange; + +/** + * An optional serialization method for defining how to serialize the + * mutation state. This must be coupled with defining `domToMutation`. + * @type {?function(...):!Element} + */ +Blockly.Block.prototype.mutationToDom; + +/** + * An optional deserialization method for defining how to deserialize the + * mutation state. This must be coupled with defining `mutationToDom`. + * @type {?function(!Element)} + */ +Blockly.Block.prototype.domToMutation; + +/** + * An optional property for suppressing adding STATEMENT_PREFIX and + * STATEMENT_SUFFIX to generated code. + * @type {?boolean} + */ +Blockly.Block.prototype.suppressPrefixSuffix; + +/** + * 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.} + */ +Blockly.Block.prototype.getDeveloperVariables; + +/** + * 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} + */ +Blockly.Block.prototype.dispose = function(healStack) { + if (!this.workspace) { + // Already deleted. + return; + } + // Terminate onchange event calls. + if (this.onchangeWrapper_) { + this.workspace.removeChangeListener(this.onchangeWrapper_); + } + + this.unplug(healStack); + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.BlockDelete(this)); + } + Blockly.Events.disable(); + + try { + // This block is now at the top of the workspace. + // Remove this block from the workspace's list of top-most blocks. + if (this.workspace) { + this.workspace.removeTopBlock(this); + this.workspace.removeTypedBlock(this); + // Remove from block database. + this.workspace.removeBlockById(this.id); + this.workspace = null; + } + + // Just deleting this block from the DOM would result in a memory leak as + // well as corruption of the connection database. Therefore we must + // methodically step through the blocks and carefully disassemble them. + + if (Blockly.selected == this) { + Blockly.selected = null; + } + + // First, dispose of all my children. + for (var i = this.childBlocks_.length - 1; i >= 0; i--) { + this.childBlocks_[i].dispose(false); + } + // Then dispose of myself. + // Dispose of all inputs and their fields. + for (var i = 0, input; (input = this.inputList[i]); i++) { + input.dispose(); + } + this.inputList.length = 0; + // Dispose of any remaining connections (next/previous/output). + var connections = this.getConnections_(true); + for (var i = 0, connection; (connection = connections[i]); i++) { + connection.dispose(); + } + } finally { + Blockly.Events.enable(); + this.disposed = true; + } +}; + +/** + * 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 + */ +Blockly.Block.prototype.initModel = function() { + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (field.initModel) { + field.initModel(); + } + } + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.unplug = function(opt_healStack) { + if (this.outputConnection) { + this.unplugFromRow_(opt_healStack); + } else if (this.previousConnection) { + this.unplugFromStack_(opt_healStack); + } +}; + +/** + * Unplug this block's output from an input on another block. Optionally + * reconnect the block's parent to the only child block, if possible. + * @param {boolean=} opt_healStack Disconnect right-side block and connect to + * left-side block. Defaults to false. + * @private + */ +Blockly.Block.prototype.unplugFromRow_ = function(opt_healStack) { + var parentConnection = null; + if (this.outputConnection.isConnected()) { + parentConnection = this.outputConnection.targetConnection; + // Disconnect from any superior block. + this.outputConnection.disconnect(); + } + + // Return early in obvious cases. + if (!parentConnection || !opt_healStack) { + return; + } + + var thisConnection = this.getOnlyValueConnection_(); + if (!thisConnection || + !thisConnection.isConnected() || + thisConnection.targetBlock().isShadow()) { + // Too many or too few possible connections on this block, or there's + // nothing on the other side of this connection. + return; + } + + var childConnection = thisConnection.targetConnection; + // Disconnect the child block. + childConnection.disconnect(); + // Connect child to the parent if possible, otherwise bump away. + if (this.workspace.connectionChecker.canConnect( + childConnection, parentConnection, false)) { + parentConnection.connect(childConnection); + } else { + childConnection.onFailedConnect(parentConnection); + } +}; + +/** + * Returns the connection on the value input that is connected to another block. + * When an insertion marker is connected to a connection with a block already + * attached, the connected block is attached to the insertion marker. + * Since only one block can be displaced and attached to the insertion marker + * this should only ever return one connection. + * + * @return {Blockly.Connection} The connection on the value input, or null. + * @private + */ +Blockly.Block.prototype.getOnlyValueConnection_ = function() { + var connection = null; + for (var i = 0; i < this.inputList.length; i++) { + var thisConnection = this.inputList[i].connection; + if (thisConnection && thisConnection.type == Blockly.INPUT_VALUE && + thisConnection.targetConnection) { + if (connection) { + return null; // More than one value input found. + } + connection = thisConnection; + } + } + return connection; +}; + +/** + * Unplug this statement block from its superior block. Optionally reconnect + * the block underneath with the block on top. + * @param {boolean=} opt_healStack Disconnect child statement and reconnect + * stack. Defaults to false. + * @private + */ +Blockly.Block.prototype.unplugFromStack_ = function(opt_healStack) { + var previousTarget = null; + if (this.previousConnection.isConnected()) { + // Remember the connection that any next statements need to connect to. + previousTarget = this.previousConnection.targetConnection; + // Detach this block from the parent's tree. + this.previousConnection.disconnect(); + } + var nextBlock = this.getNextBlock(); + if (opt_healStack && nextBlock && !nextBlock.isShadow()) { + // Disconnect the next statement. + var nextTarget = this.nextConnection.targetConnection; + nextTarget.disconnect(); + if (previousTarget && + this.workspace.connectionChecker.canConnect( + previousTarget, nextTarget, false)) { + // Attach the next statement to the previous statement. + previousTarget.connect(nextTarget); + } + } +}; + +/** + * Returns all connections originating from this block. + * @param {boolean} _all If true, return all connections even hidden ones. + * @return {!Array.} Array of connections. + * @package + */ +Blockly.Block.prototype.getConnections_ = function(_all) { + var myConnections = []; + if (this.outputConnection) { + myConnections.push(this.outputConnection); + } + if (this.previousConnection) { + myConnections.push(this.previousConnection); + } + if (this.nextConnection) { + myConnections.push(this.nextConnection); + } + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.connection) { + myConnections.push(input.connection); + } + } + return myConnections; +}; + +/** + * Walks down a stack of blocks and finds the last next connection on the stack. + * @return {Blockly.Connection} The last next connection on the stack, or null. + * @package + */ +Blockly.Block.prototype.lastConnectionInStack = function() { + var nextConnection = this.nextConnection; + while (nextConnection) { + var nextBlock = nextConnection.targetBlock(); + if (!nextBlock) { + // Found a next connection with nothing on the other side. + return nextConnection; + } + nextConnection = nextBlock.nextConnection; + } + // Ran out of next connections. + return null; +}; + +/** + * Bump unconnected blocks out of alignment. Two blocks which aren't actually + * connected should not coincidentally line up on screen. + */ +Blockly.Block.prototype.bumpNeighbours = function() { + // noop. +}; + +/** + * Return the parent block or null if this block is at the top level. The parent + * block is either the block connected to the previous connection (for a statement + * block) or the block connected to the output connection (for a value block). + * @return {Blockly.Block} The block that holds the current block. + */ +Blockly.Block.prototype.getParent = function() { + // Look at the DOM to see if we are nested in another block. + return this.parentBlock_; +}; + +/** + * Return the input that connects to the specified block. + * @param {!Blockly.Block} block A block connected to an input on this block. + * @return {Blockly.Input} The input that connects to the specified block. + */ +Blockly.Block.prototype.getInputWithBlock = function(block) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.connection && input.connection.targetBlock() == block) { + return input; + } + } + return null; +}; + +/** + * Return the parent block that surrounds the current block, or null if this + * block has no surrounding block. A parent block might just be the previous + * statement, whereas the surrounding block is an if statement, while loop, etc. + * @return {Blockly.Block} The block that surrounds the current block. + */ +Blockly.Block.prototype.getSurroundParent = function() { + var block = this; + do { + var prevBlock = block; + block = block.getParent(); + if (!block) { + // Ran off the top. + return null; + } + } while (block.getNextBlock() == prevBlock); + // This block is an enclosing parent, not just a statement in a stack. + return block; +}; + +/** + * Return the next statement block directly connected to this block. + * @return {Blockly.Block} The next statement block or null. + */ +Blockly.Block.prototype.getNextBlock = function() { + return this.nextConnection && this.nextConnection.targetBlock(); +}; + +/** + * Returns the block connected to the previous connection. + * @return {Blockly.Block} The previous statement block or null. + */ +Blockly.Block.prototype.getPreviousBlock = function() { + return this.previousConnection && this.previousConnection.targetBlock(); +}; + +/** + * Return the connection on the first statement input on this block, or null if + * there are none. + * @return {Blockly.Connection} The first statement connection or null. + * @package + */ +Blockly.Block.prototype.getFirstStatementConnection = function() { + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.connection && input.connection.type == Blockly.NEXT_STATEMENT) { + return input.connection; + } + } + return null; +}; + +/** + * Return the top-most block in this block's tree. + * This will return itself if this block is at the top level. + * @return {!Blockly.Block} The root block. + */ +Blockly.Block.prototype.getRootBlock = function() { + var rootBlock; + var block = this; + do { + rootBlock = block; + block = rootBlock.parentBlock_; + } while (block); + return rootBlock; +}; + +/** + * 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 + */ +Blockly.Block.prototype.getTopStackBlock = function() { + var block = this; + do { + var previous = block.getPreviousBlock(); + } while (previous && previous.getNextBlock() == block && (block = previous)); + return 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. + */ +Blockly.Block.prototype.getChildren = function(ordered) { + if (!ordered) { + return this.childBlocks_; + } + var blocks = []; + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.connection) { + var child = input.connection.targetBlock(); + if (child) { + blocks.push(child); + } + } + } + var next = this.getNextBlock(); + if (next) { + blocks.push(next); + } + return blocks; +}; + +/** + * Set parent of this block to be a new block or null. + * @param {Blockly.Block} newParent New parent block. + */ +Blockly.Block.prototype.setParent = function(newParent) { + if (newParent == this.parentBlock_) { + return; + } + if (this.parentBlock_) { + // Remove this block from the old parent's child list. + Blockly.utils.arrayRemove(this.parentBlock_.childBlocks_, this); + + // Disconnect from superior blocks. + if (this.previousConnection && this.previousConnection.isConnected()) { + throw Error('Still connected to previous block.'); + } + if (this.outputConnection && this.outputConnection.isConnected()) { + throw Error('Still connected to parent block.'); + } + this.parentBlock_ = null; + // This block hasn't actually moved on-screen, so there's no need to update + // its connection locations. + } else { + // Remove this block from the workspace's list of top-most blocks. + this.workspace.removeTopBlock(this); + } + + this.parentBlock_ = newParent; + if (newParent) { + // Add this block to the new parent's child list. + newParent.childBlocks_.push(this); + } else { + this.workspace.addTopBlock(this); + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.getDescendants = function(ordered) { + var blocks = [this]; + var childBlocks = this.getChildren(ordered); + for (var child, i = 0; (child = childBlocks[i]); i++) { + blocks.push.apply(blocks, child.getDescendants(ordered)); + } + return blocks; +}; + +/** + * Get whether this block is deletable or not. + * @return {boolean} True if deletable. + */ +Blockly.Block.prototype.isDeletable = function() { + return this.deletable_ && !this.isShadow_ && + !(this.workspace && this.workspace.options.readOnly); +}; + +/** + * Set whether this block is deletable or not. + * @param {boolean} deletable True if deletable. + */ +Blockly.Block.prototype.setDeletable = function(deletable) { + this.deletable_ = deletable; +}; + +/** + * Get whether this block is movable or not. + * @return {boolean} True if movable. + */ +Blockly.Block.prototype.isMovable = function() { + return this.movable_ && !this.isShadow_ && + !(this.workspace && this.workspace.options.readOnly); +}; + +/** + * Set whether this block is movable or not. + * @param {boolean} movable True if movable. + */ +Blockly.Block.prototype.setMovable = function(movable) { + this.movable_ = movable; +}; + +/** + * 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. + */ +Blockly.Block.prototype.isDuplicatable = function() { + if (!this.workspace.hasBlockLimits()) { + return true; + } + return this.workspace.isCapacityAvailable( + Blockly.utils.getBlockTypeCounts(this, true)); +}; + +/** + * Get whether this block is a shadow block or not. + * @return {boolean} True if a shadow. + */ +Blockly.Block.prototype.isShadow = function() { + return this.isShadow_; +}; + +/** + * Set whether this block is a shadow block or not. + * @param {boolean} shadow True if a shadow. + */ +Blockly.Block.prototype.setShadow = function(shadow) { + this.isShadow_ = shadow; +}; + +/** + * Get whether this block is an insertion marker block or not. + * @return {boolean} True if an insertion marker. + */ +Blockly.Block.prototype.isInsertionMarker = function() { + return this.isInsertionMarker_; +}; + +/** + * Set whether this block is an insertion marker block or not. + * Once set this cannot be unset. + * @param {boolean} insertionMarker True if an insertion marker. + * @package + */ +Blockly.Block.prototype.setInsertionMarker = function(insertionMarker) { + this.isInsertionMarker_ = insertionMarker; +}; + +/** + * Get whether this block is editable or not. + * @return {boolean} True if editable. + */ +Blockly.Block.prototype.isEditable = function() { + return this.editable_ && !(this.workspace && this.workspace.options.readOnly); +}; + +/** + * Set whether this block is editable or not. + * @param {boolean} editable True if editable. + */ +Blockly.Block.prototype.setEditable = function(editable) { + this.editable_ = editable; + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + field.updateEditable(); + } + } +}; + +/** + * Returns if this block has been disposed of / deleted. + * @return {boolean} True if this block has been disposed of / deleted. + */ +Blockly.Block.prototype.isDisposed = function() { + return this.disposed; +}; + +/** + * 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 + */ +Blockly.Block.prototype.getMatchingConnection = function(otherBlock, conn) { + var connections = this.getConnections_(true); + var otherConnections = otherBlock.getConnections_(true); + if (connections.length != otherConnections.length) { + throw Error("Connection lists did not match in length."); + } + for (var i = 0; i < otherConnections.length; i++) { + if (otherConnections[i] == conn) { + return connections[i]; + } + } + return null; +}; + +/** + * Set the URL of this block's help page. + * @param {string|Function} url URL string for block help, or function that + * returns a URL. Null for no help. + */ +Blockly.Block.prototype.setHelpUrl = function(url) { + this.helpUrl = url; +}; + +/** + * Sets the tooltip for this block. + * @param {!Blockly.Tooltip.TipInfo} newTip The text for the tooltip, a function + * that returns the text for the tooltip, or a parent object whose tooltip + * will be used. To not display a tooltip pass the empty string. + */ +Blockly.Block.prototype.setTooltip = function(newTip) { + this.tooltip = newTip; +}; + +/** + * Returns the tooltip text for this block. + * @returns {!string} The tooltip text for this block. + */ +Blockly.Block.prototype.getTooltip = function() { + return Blockly.Tooltip.getTooltipOfObject(this); +}; + +/** + * Get the colour of a block. + * @return {string} #RRGGBB string. + */ +Blockly.Block.prototype.getColour = function() { + return this.colour_; +}; + +/** + * Get the name of the block style. + * @return {?string} Name of the block style. + */ +Blockly.Block.prototype.getStyleName = function() { + return this.styleName_; +}; + +/** + * Get the HSV hue value of a block. Null if hue not set. + * @return {?number} Hue value (0-360). + */ +Blockly.Block.prototype.getHue = function() { + return this.hue_; +}; + +/** + * 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. + */ +Blockly.Block.prototype.setColour = function(colour) { + var parsed = Blockly.utils.parseBlockColour(colour); + this.hue_ = parsed.hue; + this.colour_ = parsed.hex; +}; + +/** + * Set the style and colour values of a block. + * @param {string} blockStyleName Name of the block style + */ +Blockly.Block.prototype.setStyle = function(blockStyleName) { + this.styleName_ = blockStyleName; +}; + +/** + * 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 and not a function. + */ +Blockly.Block.prototype.setOnChange = function(onchangeFn) { + if (onchangeFn && typeof onchangeFn != 'function') { + throw Error('onchange must be a function.'); + } + if (this.onchangeWrapper_) { + this.workspace.removeChangeListener(this.onchangeWrapper_); + } + this.onchange = onchangeFn; + if (this.onchange) { + this.onchangeWrapper_ = onchangeFn.bind(this); + this.workspace.addChangeListener(this.onchangeWrapper_); + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.getField = function(name) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (field.name == name) { + return field; + } + } + } + return null; +}; + +/** + * Return all variables referenced by this block. + * @return {!Array.} List of variable names. + */ +Blockly.Block.prototype.getVars = function() { + var vars = []; + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (field.referencesVariables()) { + vars.push(field.getValue()); + } + } + } + return vars; +}; + +/** + * Return all variables referenced by this block. + * @return {!Array.} List of variable models. + * @package + */ +Blockly.Block.prototype.getVarModels = function() { + var vars = []; + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (field.referencesVariables()) { + var model = this.workspace.getVariableById( + /** @type {string} */ (field.getValue())); + // Check if the variable actually exists (and isn't just a potential + // variable). + if (model) { + vars.push(model); + } + } + } + } + return vars; +}; + +/** + * 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 + */ +Blockly.Block.prototype.updateVarName = function(variable) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (field.referencesVariables() && + variable.getId() == field.getValue()) { + field.refreshVariableName(); + } + } + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.renameVarById = function(oldId, newId) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (field.referencesVariables() && + oldId == field.getValue()) { + field.setValue(newId); + } + } + } +}; + +/** + * Returns the language-neutral value of the given field. + * @param {string} name The name of the field. + * @return {*} Value of the field or null if field does not exist. + */ +Blockly.Block.prototype.getFieldValue = function(name) { + var field = this.getField(name); + if (field) { + return field.getValue(); + } + return null; +}; + +/** + * Sets the value of the given field for this block. + * @param {*} newValue The value to set. + * @param {!string} name The name of the field to set the value of. + */ +Blockly.Block.prototype.setFieldValue = function(newValue, name) { + var field = this.getField(name); + if (!field) { + throw Error('Field "' + name + '" not found.'); + } + field.setValue(newValue); +}; + +/** + * 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. + */ +Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) { + if (newBoolean) { + if (opt_check === undefined) { + opt_check = null; + } + if (!this.previousConnection) { + if (this.outputConnection) { + throw Error('Remove output connection prior to adding previous ' + + 'connection.'); + } + this.previousConnection = + this.makeConnection_(Blockly.PREVIOUS_STATEMENT); + } + this.previousConnection.setCheck(opt_check); + } else { + if (this.previousConnection) { + if (this.previousConnection.isConnected()) { + throw Error('Must disconnect previous statement before removing ' + + 'connection.'); + } + this.previousConnection.dispose(); + this.previousConnection = null; + } + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) { + if (newBoolean) { + if (opt_check === undefined) { + opt_check = null; + } + if (!this.nextConnection) { + this.nextConnection = this.makeConnection_(Blockly.NEXT_STATEMENT); + } + this.nextConnection.setCheck(opt_check); + } else { + if (this.nextConnection) { + if (this.nextConnection.isConnected()) { + throw Error('Must disconnect next statement before removing ' + + 'connection.'); + } + this.nextConnection.dispose(); + this.nextConnection = null; + } + } +}; + +/** + * 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). + */ +Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) { + if (newBoolean) { + if (opt_check === undefined) { + opt_check = null; + } + if (!this.outputConnection) { + if (this.previousConnection) { + throw Error('Remove previous connection prior to adding output ' + + 'connection.'); + } + this.outputConnection = this.makeConnection_(Blockly.OUTPUT_VALUE); + } + this.outputConnection.setCheck(opt_check); + } else { + if (this.outputConnection) { + if (this.outputConnection.isConnected()) { + throw Error('Must disconnect output value before removing connection.'); + } + this.outputConnection.dispose(); + this.outputConnection = null; + } + } +}; + +/** + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. + */ +Blockly.Block.prototype.setInputsInline = function(newBoolean) { + if (this.inputsInline != newBoolean) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + this, 'inline', null, this.inputsInline, newBoolean)); + this.inputsInline = newBoolean; + } +}; + +/** + * Get whether value inputs are arranged horizontally or vertically. + * @return {boolean} True if inputs are horizontal. + */ +Blockly.Block.prototype.getInputsInline = function() { + if (this.inputsInline != undefined) { + // Set explicitly. + return this.inputsInline; + } + // Not defined explicitly. Figure out what would look best. + for (var i = 1; i < this.inputList.length; i++) { + if (this.inputList[i - 1].type == Blockly.DUMMY_INPUT && + this.inputList[i].type == Blockly.DUMMY_INPUT) { + // Two dummy inputs in a row. Don't inline them. + return false; + } + } + for (var i = 1; i < this.inputList.length; i++) { + if (this.inputList[i - 1].type == Blockly.INPUT_VALUE && + this.inputList[i].type == Blockly.DUMMY_INPUT) { + // Dummy input after a value input. Inline them. + return true; + } + } + return false; +}; + +/** + * Set the block's output shape. + * @param {?number} outputShape Value representing an output shape. + */ +Blockly.Block.prototype.setOutputShape = function(outputShape) { + this.outputShape_ = outputShape; +}; + +/** + * Get the block's output shape. + * @return {?number} Value representing output shape if one exists. + */ +Blockly.Block.prototype.getOutputShape = function() { + return this.outputShape_; +}; + +/** + * Get whether this block is enabled or not. + * @return {boolean} True if enabled. + */ +Blockly.Block.prototype.isEnabled = function() { + return !this.disabled; +}; + +/** + * Set whether the block is enabled or not. + * @param {boolean} enabled True if enabled. + */ +Blockly.Block.prototype.setEnabled = function(enabled) { + if (this.isEnabled() != enabled) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + this, 'disabled', null, this.disabled, !enabled)); + this.disabled = !enabled; + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.getInheritedDisabled = function() { + var ancestor = this.getSurroundParent(); + while (ancestor) { + if (ancestor.disabled) { + return true; + } + ancestor = ancestor.getSurroundParent(); + } + // Ran off the top. + return false; +}; + +/** + * Get whether the block is collapsed or not. + * @return {boolean} True if collapsed. + */ +Blockly.Block.prototype.isCollapsed = function() { + return this.collapsed_; +}; + +/** + * Set whether the block is collapsed or not. + * @param {boolean} collapsed True if collapsed. + */ +Blockly.Block.prototype.setCollapsed = function(collapsed) { + if (this.collapsed_ != collapsed) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + this, 'collapsed', null, this.collapsed_, collapsed)); + this.collapsed_ = collapsed; + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.toString = function(opt_maxLength, opt_emptyToken) { + var text = []; + var emptyFieldPlaceholder = opt_emptyToken || '?'; + + // Temporarily set flag to navigate to all fields. + var prevNavigateFields = Blockly.ASTNode.NAVIGATE_ALL_FIELDS; + Blockly.ASTNode.NAVIGATE_ALL_FIELDS = true; + + var node = Blockly.ASTNode.createBlockNode(this); + var rootNode = node; + + /** + * Whether or not to add parentheses around an input. + * @param {!Blockly.Connection} connection The connection. + * @return {boolean} True if we should add parentheses around the input. + */ + function shouldAddParentheses(connection) { + var checks = connection.getCheck(); + if (!checks && connection.targetConnection) { + checks = connection.targetConnection.getCheck(); + } + return !!checks && (checks.indexOf('Boolean') != -1 || + checks.indexOf('Number') != -1); + } + + /** + * Check that we haven't circled back to the original root node. + */ + function checkRoot() { + if (node && node.getType() == rootNode.getType() && + node.getLocation() == rootNode.getLocation()) { + node = null; + } + } + + // Traverse the AST building up our text string. + while (node) { + switch (node.getType()) { + case Blockly.ASTNode.types.INPUT: + var connection = /** @type {!Blockly.Connection} */ (node.getLocation()); + if (!node.in()) { + text.push(emptyFieldPlaceholder); + } else if (shouldAddParentheses(connection)) { + text.push('('); + } + break; + case Blockly.ASTNode.types.FIELD: + var field = /** @type {Blockly.Field} */ (node.getLocation()); + if (field.name != Blockly.Block.COLLAPSED_FIELD_NAME) { + text.push(field.getText()); + } + break; + } + + var current = node; + node = current.in() || current.next(); + if (!node) { + // Can't go in or next, keep going out until we can go next. + node = current.out(); + checkRoot(); + while (node && !node.next()) { + node = node.out(); + checkRoot(); + // If we hit an input on the way up, possibly close out parentheses. + if (node && node.getType() == Blockly.ASTNode.types.INPUT && + shouldAddParentheses( + /** @type {!Blockly.Connection} */ (node.getLocation()))) { + text.push(')'); + } + } + if (node) { + node = node.next(); + } + } + } + + // Restore state of NAVIGATE_ALL_FIELDS. + Blockly.ASTNode.NAVIGATE_ALL_FIELDS = prevNavigateFields; + + // Run through our text array and simplify expression to remove parentheses + // around single field blocks. + for (var i = 2, l = text.length; i < l; i++) { + if (text[i - 2] == '(' && text[i] == ')') { + text[i - 2] = text[i - 1]; + text.splice(i - 1, 2); + l -= 2; + } + } + + // Join the text array, removing spaces around added paranthesis. + text = text.join(' ').replace(/(\() | (\))/gmi, '$1$2').trim() || '???'; + if (opt_maxLength) { + // TODO: Improve truncation so that text from this block is given priority. + // E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not "1+2+3+4+5...". + // E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...". + if (text.length > opt_maxLength) { + text = text.substring(0, opt_maxLength - 3) + '...'; + } + } + return text; +}; + +/** + * 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. + */ +Blockly.Block.prototype.appendValueInput = function(name) { + return this.appendInput_(Blockly.INPUT_VALUE, name); +}; + +/** + * 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. + */ +Blockly.Block.prototype.appendStatementInput = function(name) { + return this.appendInput_(Blockly.NEXT_STATEMENT, name); +}; + +/** + * 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. + */ +Blockly.Block.prototype.appendDummyInput = function(opt_name) { + return this.appendInput_(Blockly.DUMMY_INPUT, opt_name || ''); +}; + +/** + * Initialize this block using a cross-platform, internationalization-friendly + * JSON description. + * @param {!Object} json Structured data describing the block. + */ +Blockly.Block.prototype.jsonInit = function(json) { + var warningPrefix = json['type'] ? 'Block "' + json['type'] + '": ' : ''; + + // Validate inputs. + if (json['output'] && json['previousStatement']) { + throw Error(warningPrefix + + 'Must not have both an output and a previousStatement.'); + } + + // Set basic properties of block. + // Makes styles backward compatible with old way of defining hat style. + if (json['style'] && json['style'].hat) { + this.hat = json['style'].hat; + // Must set to null so it doesn't error when checking for style and colour. + json['style'] = null; + } + + if (json['style'] && json['colour']) { + throw Error(warningPrefix + 'Must not have both a colour and a style.'); + } else if (json['style']) { + this.jsonInitStyle_(json, warningPrefix); + } else { + this.jsonInitColour_(json, warningPrefix); + } + + // Interpolate the message blocks. + var i = 0; + while (json['message' + i] !== undefined) { + this.interpolate_(json['message' + i], json['args' + i] || [], + json['lastDummyAlign' + i], warningPrefix); + i++; + } + + if (json['inputsInline'] !== undefined) { + this.setInputsInline(json['inputsInline']); + } + // Set output and previous/next connections. + if (json['output'] !== undefined) { + this.setOutput(true, json['output']); + } + if (json['outputShape'] !== undefined) { + this.setOutputShape(json['outputShape']); + } + if (json['previousStatement'] !== undefined) { + this.setPreviousStatement(true, json['previousStatement']); + } + if (json['nextStatement'] !== undefined) { + this.setNextStatement(true, json['nextStatement']); + } + if (json['tooltip'] !== undefined) { + var rawValue = json['tooltip']; + var localizedText = Blockly.utils.replaceMessageReferences(rawValue); + this.setTooltip(localizedText); + } + if (json['enableContextMenu'] !== undefined) { + var rawValue = json['enableContextMenu']; + this.contextMenu = !!rawValue; + } + if (json['helpUrl'] !== undefined) { + var rawValue = json['helpUrl']; + var localizedValue = Blockly.utils.replaceMessageReferences(rawValue); + this.setHelpUrl(localizedValue); + } + if (typeof json['extensions'] == 'string') { + console.warn( + warningPrefix + 'JSON attribute \'extensions\' should be an array of' + + ' strings. Found raw string in JSON for \'' + json['type'] + + '\' block.'); + json['extensions'] = [json['extensions']]; // Correct and continue. + } + + // Add the mutator to the block + if (json['mutator'] !== undefined) { + Blockly.Extensions.apply(json['mutator'], this, true); + } + + if (Array.isArray(json['extensions'])) { + var extensionNames = json['extensions']; + for (var j = 0; j < extensionNames.length; ++j) { + var extensionName = extensionNames[j]; + Blockly.Extensions.apply(extensionName, this, false); + } + } +}; + +/** + * Initialize the colour of this block from the JSON description. + * @param {!Object} json Structured data describing the block. + * @param {string} warningPrefix Warning prefix string identifying block. + * @private + */ +Blockly.Block.prototype.jsonInitColour_ = function(json, warningPrefix) { + if ('colour' in json) { + if (json['colour'] === undefined) { + console.warn(warningPrefix + 'Undefined colour value.'); + } else { + var rawValue = json['colour']; + try { + this.setColour(rawValue); + } catch (e) { + console.warn(warningPrefix + 'Illegal colour value: ', rawValue); + } + } + } +}; + +/** + * Initialize the style of this block from the JSON description. + * @param {!Object} json Structured data describing the block. + * @param {string} warningPrefix Warning prefix string identifying block. + * @private + */ +Blockly.Block.prototype.jsonInitStyle_ = function(json, warningPrefix) { + var blockStyleName = json['style']; + try { + this.setStyle(blockStyleName); + } catch (styleError) { + console.warn(warningPrefix + 'Style does not exist: ', blockStyleName); + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.mixin = function(mixinObj, opt_disableCheck) { + if (opt_disableCheck !== undefined && typeof opt_disableCheck != 'boolean') { + throw Error('opt_disableCheck must be a boolean if provided'); + } + if (!opt_disableCheck) { + var overwrites = []; + for (var key in mixinObj) { + if (this[key] !== undefined) { + overwrites.push(key); + } + } + if (overwrites.length) { + throw Error('Mixin will overwrite block members: ' + + JSON.stringify(overwrites)); + } + } + Blockly.utils.object.mixin(this, mixinObj); +}; + +/** + * Interpolate a message description onto the block. + * @param {string} message Text contains interpolation tokens (%1, %2, ...) + * that match with fields or inputs defined in the args array. + * @param {!Array} args Array of arguments to be interpolated. + * @param {string|undefined} lastDummyAlign If a dummy input is added at the + * end, how should it be aligned? + * @param {string} warningPrefix Warning prefix string identifying block. + * @private + */ +Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign, + warningPrefix) { + var tokens = Blockly.utils.tokenizeInterpolation(message); + // Interpolate the arguments. Build a list of elements. + var indexDup = []; + var indexCount = 0; + var elements = []; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (typeof token == 'number') { + if (token <= 0 || token > args.length) { + throw Error('Block "' + this.type + '": ' + + 'Message index %' + token + ' out of range.'); + } + if (indexDup[token]) { + throw Error('Block "' + this.type + '": ' + + 'Message index %' + token + ' duplicated.'); + } + indexDup[token] = true; + indexCount++; + elements.push(args[token - 1]); + } else { + token = token.trim(); + if (token) { + elements.push(token); + } + } + } + if (indexCount != args.length) { + throw Error('Block "' + this.type + '": ' + + 'Message does not reference all ' + args.length + ' arg(s).'); + } + // Add last dummy input if needed. + if (elements.length && (typeof elements[elements.length - 1] == 'string' || + Blockly.utils.string.startsWith( + elements[elements.length - 1]['type'], 'field_'))) { + var dummyInput = {type: 'input_dummy'}; + if (lastDummyAlign) { + dummyInput['align'] = lastDummyAlign; + } + elements.push(dummyInput); + } + // Lookup of alignment constants. + var alignmentLookup = { + 'LEFT': Blockly.ALIGN_LEFT, + 'RIGHT': Blockly.ALIGN_RIGHT, + 'CENTRE': Blockly.ALIGN_CENTRE, + 'CENTER': Blockly.ALIGN_CENTRE + }; + // Populate block with inputs and fields. + var fieldStack = []; + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + if (typeof element == 'string') { + fieldStack.push([element, undefined]); + } else { + var field = null; + var input = null; + do { + var altRepeat = false; + if (typeof element == 'string') { + field = new Blockly.FieldLabel(element); + } else { + switch (element['type']) { + case 'input_value': + input = this.appendValueInput(element['name']); + break; + case 'input_statement': + input = this.appendStatementInput(element['name']); + break; + case 'input_dummy': + input = this.appendDummyInput(element['name']); + break; + default: + // This should handle all field JSON parsing, including + // options that can be applied to any field type. + field = Blockly.fieldRegistry.fromJson(element); + + // Unknown field. + if (!field && element['alt']) { + element = element['alt']; + altRepeat = true; + } + } + } + } while (altRepeat); + if (field) { + fieldStack.push([field, element['name']]); + } else if (input) { + if (element['check']) { + input.setCheck(element['check']); + } + if (element['align']) { + var alignment = alignmentLookup[element['align'].toUpperCase()]; + if (alignment === undefined) { + console.warn(warningPrefix + 'Illegal align value: ', + element['align']); + } else { + input.setAlign(alignment); + } + } + for (var j = 0; j < fieldStack.length; j++) { + input.appendField(fieldStack[j][0], fieldStack[j][1]); + } + fieldStack.length = 0; + } + } + } +}; + +/** + * 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 + */ +Blockly.Block.prototype.appendInput_ = function(type, name) { + var connection = null; + if (type == Blockly.INPUT_VALUE || type == Blockly.NEXT_STATEMENT) { + connection = this.makeConnection_(type); + } + if (type == Blockly.NEXT_STATEMENT) { + this.statementInputCount++; + } + var input = new Blockly.Input(type, name, this, connection); + // Append input to list. + this.inputList.push(input); + return 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. + */ +Blockly.Block.prototype.moveInputBefore = function(name, refName) { + if (name == refName) { + return; + } + // Find both inputs. + var inputIndex = -1; + var refIndex = refName ? -1 : this.inputList.length; + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.name == name) { + inputIndex = i; + if (refIndex != -1) { + break; + } + } else if (refName && input.name == refName) { + refIndex = i; + if (inputIndex != -1) { + break; + } + } + } + if (inputIndex == -1) { + throw Error('Named input "' + name + '" not found.'); + } + if (refIndex == -1) { + throw Error('Reference input "' + refName + '" not found.'); + } + this.moveNumberedInputBefore(inputIndex, refIndex); +}; + +/** + * Move a numbered input to a different location on this block. + * @param {number} inputIndex Index of the input to move. + * @param {number} refIndex Index of input that should be after the moved input. + */ +Blockly.Block.prototype.moveNumberedInputBefore = function( + inputIndex, refIndex) { + // Validate arguments. + if (inputIndex == refIndex) { + throw Error('Can\'t move input to itself.'); + } + if (inputIndex >= this.inputList.length) { + throw RangeError('Input index ' + inputIndex + ' out of bounds.'); + } + if (refIndex > this.inputList.length) { + throw RangeError('Reference input ' + refIndex + ' out of bounds.'); + } + // Remove input. + var input = this.inputList[inputIndex]; + this.inputList.splice(inputIndex, 1); + if (inputIndex < refIndex) { + refIndex--; + } + // Reinsert input. + this.inputList.splice(refIndex, 0, input); +}; + +/** + * Remove an input from this block. + * @param {string} name The name of the input. + * @param {boolean=} opt_quiet True to prevent an error if input is not present. + * @return {boolean} True if operation succeeds, false if input is not present and opt_quiet is true + * @throws {Error} if the input is not present and opt_quiet is not true. + */ +Blockly.Block.prototype.removeInput = function(name, opt_quiet) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.name == name) { + if (input.type == Blockly.NEXT_STATEMENT) { + this.statementInputCount--; + } + input.dispose(); + this.inputList.splice(i, 1); + return true; + } + } + if (opt_quiet) { + return false; + } else { + throw Error('Input not found: ' + name); + } +}; + +/** + * 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. + */ +Blockly.Block.prototype.getInput = function(name) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.name == name) { + return input; + } + } + // This input does not exist. + return null; +}; + +/** + * 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. + */ +Blockly.Block.prototype.getInputTargetBlock = function(name) { + var input = this.getInput(name); + return input && input.connection && input.connection.targetBlock(); +}; + +/** + * Returns the comment on this block (or null if there is no comment). + * @return {?string} Block's comment. + */ +Blockly.Block.prototype.getCommentText = function() { + return this.commentModel.text; +}; + +/** + * Set this block's comment text. + * @param {?string} text The text, or null to delete. + */ +Blockly.Block.prototype.setCommentText = function(text) { + if (this.commentModel.text == text) { + return; + } + Blockly.Events.fire(new Blockly.Events.BlockChange( + this, 'comment', null, this.commentModel.text, text)); + this.commentModel.text = text; + this.comment = text; // For backwards compatibility. +}; + +/** + * 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. + */ +Blockly.Block.prototype.setWarningText = function(_text, _opt_id) { + // NOP. +}; + +/** + * Give this block a mutator dialog. + * @param {Blockly.Mutator} _mutator A mutator dialog instance or null to + * remove. + */ +Blockly.Block.prototype.setMutator = function(_mutator) { + // NOP. +}; + +/** + * 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. + */ +Blockly.Block.prototype.getRelativeToSurfaceXY = function() { + return this.xy_; +}; + +/** + * Move a block by a relative offset. + * @param {number} dx Horizontal offset, in workspace units. + * @param {number} dy Vertical offset, in workspace units. + */ +Blockly.Block.prototype.moveBy = function(dx, dy) { + if (this.parentBlock_) { + throw Error('Block has parent.'); + } + var event = new Blockly.Events.BlockMove(this); + this.xy_.translate(dx, dy); + event.recordNew(); + Blockly.Events.fire(event); +}; + +/** + * 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 + */ +Blockly.Block.prototype.makeConnection_ = function(type) { + return new Blockly.Connection(this, type); +}; + +/** + * 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. + */ +Blockly.Block.prototype.allInputsFilled = function(opt_shadowBlocksAreFilled) { + // Account for the shadow block filledness toggle. + if (opt_shadowBlocksAreFilled === undefined) { + opt_shadowBlocksAreFilled = true; + } + if (!opt_shadowBlocksAreFilled && this.isShadow()) { + return false; + } + + // Recursively check each input block of the current block. + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (!input.connection) { + continue; + } + var target = input.connection.targetBlock(); + if (!target || !target.allInputsFilled(opt_shadowBlocksAreFilled)) { + return false; + } + } + + // Recursively check the next block after the current block. + var next = this.getNextBlock(); + if (next) { + return next.allInputsFilled(opt_shadowBlocksAreFilled); + } + + return true; +}; + +/** + * 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. + */ +Blockly.Block.prototype.toDevString = function() { + var msg = this.type ? '"' + this.type + '" block' : 'Block'; + if (this.id) { + msg += ' (id="' + this.id + '")'; + } + return msg; +}; diff --git a/static/js/dist/core/block_animations.js b/static/js/dist/core/block_animations.js new file mode 100644 index 0000000..edf599d --- /dev/null +++ b/static/js/dist/core/block_animations.js @@ -0,0 +1,203 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Methods animating a block on connection and disconnection. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.blockAnimations'); + +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); + + +/** + * PID of disconnect UI animation. There can only be one at a time. + * @type {number} + * @private + */ +Blockly.blockAnimations.disconnectPid_ = 0; + +/** + * SVG group of wobbling block. There can only be one at a time. + * @type {Element} + * @private + */ +Blockly.blockAnimations.disconnectGroup_ = null; + +/** + * Play some UI effects (sound, animation) when disposing of a block. + * @param {!Blockly.BlockSvg} block The block being disposed of. + * @package + */ +Blockly.blockAnimations.disposeUiEffect = function(block) { + var workspace = block.workspace; + var svgGroup = block.getSvgRoot(); + workspace.getAudioManager().play('delete'); + + var xy = workspace.getSvgXY(svgGroup); + // Deeply clone the current block. + var clone = svgGroup.cloneNode(true); + clone.translateX_ = xy.x; + clone.translateY_ = xy.y; + clone.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')'); + workspace.getParentSvg().appendChild(clone); + clone.bBox_ = clone.getBBox(); + // Start the animation. + Blockly.blockAnimations.disposeUiStep_(clone, workspace.RTL, new Date, + workspace.scale); +}; + +/** + * Animate a cloned block and eventually dispose of it. + * This is a class method, not an instance method since the original block has + * been destroyed and is no longer accessible. + * @param {!Element} clone SVG element to animate and dispose of. + * @param {boolean} rtl True if RTL, false if LTR. + * @param {!Date} start Date of animation's start. + * @param {number} workspaceScale Scale of workspace. + * @private + */ +Blockly.blockAnimations.disposeUiStep_ = function(clone, rtl, start, + workspaceScale) { + var ms = new Date - start; + var percent = ms / 150; + if (percent > 1) { + Blockly.utils.dom.removeNode(clone); + } else { + var x = clone.translateX_ + + (rtl ? -1 : 1) * clone.bBox_.width * workspaceScale / 2 * percent; + var y = clone.translateY_ + clone.bBox_.height * workspaceScale * percent; + var scale = (1 - percent) * workspaceScale; + clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' + + ' scale(' + scale + ')'); + setTimeout(Blockly.blockAnimations.disposeUiStep_, 10, clone, rtl, start, + workspaceScale); + } +}; + +/** + * Play some UI effects (sound, ripple) after a connection has been established. + * @param {!Blockly.BlockSvg} block The block being connected. + * @package + */ +Blockly.blockAnimations.connectionUiEffect = function(block) { + var workspace = block.workspace; + var scale = workspace.scale; + workspace.getAudioManager().play('click'); + if (scale < 1) { + return; // Too small to care about visual effects. + } + // Determine the absolute coordinates of the inferior block. + var xy = workspace.getSvgXY(block.getSvgRoot()); + // Offset the coordinates based on the two connection types, fix scale. + if (block.outputConnection) { + xy.x += (block.RTL ? 3 : -3) * scale; + xy.y += 13 * scale; + } else if (block.previousConnection) { + xy.x += (block.RTL ? -23 : 23) * scale; + xy.y += 3 * scale; + } + var ripple = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.CIRCLE, + { + 'cx': xy.x, + 'cy': xy.y, + 'r': 0, + 'fill': 'none', + 'stroke': '#888', + 'stroke-width': 10 + }, + workspace.getParentSvg()); + // Start the animation. + Blockly.blockAnimations.connectionUiStep_(ripple, new Date, scale); +}; + +/** + * Expand a ripple around a connection. + * @param {!SVGElement} ripple Element to animate. + * @param {!Date} start Date of animation's start. + * @param {number} scale Scale of workspace. + * @private + */ +Blockly.blockAnimations.connectionUiStep_ = function(ripple, start, scale) { + var ms = new Date - start; + var percent = ms / 150; + if (percent > 1) { + Blockly.utils.dom.removeNode(ripple); + } else { + ripple.setAttribute('r', percent * 25 * scale); + ripple.style.opacity = 1 - percent; + Blockly.blockAnimations.disconnectPid_ = setTimeout( + Blockly.blockAnimations.connectionUiStep_, 10, ripple, start, scale); + } +}; + +/** + * Play some UI effects (sound, animation) when disconnecting a block. + * @param {!Blockly.BlockSvg} block The block being disconnected. + * @package + */ +Blockly.blockAnimations.disconnectUiEffect = function(block) { + block.workspace.getAudioManager().play('disconnect'); + if (block.workspace.scale < 1) { + return; // Too small to care about visual effects. + } + // Horizontal distance for bottom of block to wiggle. + var DISPLACEMENT = 10; + // Scale magnitude of skew to height of block. + var height = block.getHeightWidth().height; + var magnitude = Math.atan(DISPLACEMENT / height) / Math.PI * 180; + if (!block.RTL) { + magnitude *= -1; + } + // Start the animation. + Blockly.blockAnimations.disconnectUiStep_( + block.getSvgRoot(), magnitude, new Date); +}; +/** + * Animate a brief wiggle of a disconnected block. + * @param {!SVGElement} group SVG element to animate. + * @param {number} magnitude Maximum degrees skew (reversed for RTL). + * @param {!Date} start Date of animation's start. + * @private + */ +Blockly.blockAnimations.disconnectUiStep_ = function(group, magnitude, start) { + var DURATION = 200; // Milliseconds. + var WIGGLES = 3; // Half oscillations. + + var ms = new Date - start; + var percent = ms / DURATION; + + if (percent > 1) { + group.skew_ = ''; + } else { + var skew = Math.round( + Math.sin(percent * Math.PI * WIGGLES) * (1 - percent) * magnitude); + group.skew_ = 'skewX(' + skew + ')'; + Blockly.blockAnimations.disconnectGroup_ = group; + Blockly.blockAnimations.disconnectPid_ = + setTimeout(Blockly.blockAnimations.disconnectUiStep_, 10, group, + magnitude, start); + } + group.setAttribute('transform', group.translate_ + group.skew_); +}; + +/** + * Stop the disconnect UI animation immediately. + * @package + */ +Blockly.blockAnimations.disconnectUiStop = function() { + if (Blockly.blockAnimations.disconnectGroup_) { + clearTimeout(Blockly.blockAnimations.disconnectPid_); + var group = Blockly.blockAnimations.disconnectGroup_; + group.skew_ = ''; + group.setAttribute('transform', group.translate_); + Blockly.blockAnimations.disconnectGroup_ = null; + } +}; diff --git a/static/js/dist/core/block_drag_surface.js b/static/js/dist/core/block_drag_surface.js new file mode 100644 index 0000000..f8c47a6 --- /dev/null +++ b/static/js/dist/core/block_drag_surface.js @@ -0,0 +1,212 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A class that manages a surface for dragging blocks. When a + * block drag is started, we move the block (and children) to a separate DOM + * element that we move around using translate3d. At the end of the drag, the + * blocks are put back in into the SVG they came from. This helps performance by + * avoiding repainting the entire SVG on every mouse move while dragging blocks. + * @author picklesrus + */ + +'use strict'; + +goog.provide('Blockly.BlockDragSurfaceSvg'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); + + +/** + * 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 + */ +Blockly.BlockDragSurfaceSvg = function(container) { + /** + * @type {!Element} + * @private + */ + this.container_ = container; + this.createDom(); +}; + +/** + * The SVG drag surface. Set once by Blockly.BlockDragSurfaceSvg.createDom. + * @type {SVGElement} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.SVG_ = null; + +/** + * This is where blocks live while they are being dragged if the drag surface + * is enabled. + * @type {SVGElement} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.dragGroup_ = null; + +/** + * Containing HTML element; parent of the workspace and the drag surface. + * @type {Element} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.container_ = null; + +/** + * Cached value for the scale of the drag surface. + * Used to set/get the correct translation during and after a drag. + * @type {number} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.scale_ = 1; + +/** + * Cached value for the translation of the drag surface. + * This translation is in pixel units, because the scale is applied to the + * drag group rather than the top-level SVG. + * @type {Blockly.utils.Coordinate} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.surfaceXY_ = null; + +/** + * Create the drag surface and inject it into the container. + */ +Blockly.BlockDragSurfaceSvg.prototype.createDom = function() { + if (this.SVG_) { + return; // Already created. + } + this.SVG_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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': 'blocklyBlockDragSurface' + }, this.container_); + this.dragGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, {}, this.SVG_); +}; + +/** + * 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. + */ +Blockly.BlockDragSurfaceSvg.prototype.setBlocksAndShow = function(blocks) { + if (this.dragGroup_.childNodes.length) { + throw Error('Already dragging a block.'); + } + // appendChild removes the blocks from the previous parent + this.dragGroup_.appendChild(blocks); + this.SVG_.style.display = 'block'; + this.surfaceXY_ = new Blockly.utils.Coordinate(0, 0); +}; + +/** + * 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. + */ +Blockly.BlockDragSurfaceSvg.prototype.translateAndScaleGroup = function(x, y, + scale) { + this.scale_ = scale; + // This is a work-around to prevent a the blocks from rendering + // fuzzy while they are being dragged on the drag surface. + var fixedX = x.toFixed(0); + var fixedY = y.toFixed(0); + this.dragGroup_.setAttribute('transform', + 'translate(' + fixedX + ',' + fixedY + ') scale(' + scale + ')'); +}; + +/** + * Translate the drag surface's SVG based on its internal state. + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.translateSurfaceInternal_ = function() { + var x = this.surfaceXY_.x; + var y = this.surfaceXY_.y; + // This is a work-around to prevent a the blocks from rendering + // fuzzy while they are being dragged on the drag surface. + x = x.toFixed(0); + y = y.toFixed(0); + this.SVG_.style.display = 'block'; + + Blockly.utils.dom.setCssTransform(this.SVG_, + 'translate3d(' + x + 'px, ' + y + 'px, 0px)'); +}; + +/** + * Translate the entire drag surface during a drag. + * We translate the drag surface instead of the blocks inside the surface + * so that the browser avoids repainting the SVG. + * Because of this, the drag coordinates must be adjusted by scale. + * @param {number} x X translation for the entire surface. + * @param {number} y Y translation for the entire surface. + */ +Blockly.BlockDragSurfaceSvg.prototype.translateSurface = function(x, y) { + this.surfaceXY_ = new Blockly.utils.Coordinate(x * this.scale_, y * this.scale_); + this.translateSurfaceInternal_(); +}; + +/** + * 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. + */ +Blockly.BlockDragSurfaceSvg.prototype.getSurfaceTranslation = function() { + var xy = Blockly.utils.getRelativeXY(/** @type {!SVGElement} */ (this.SVG_)); + return new Blockly.utils.Coordinate(xy.x / this.scale_, xy.y / this.scale_); +}; + +/** + * Provide a reference to the drag group (primarily for + * BlockSvg.getRelativeToSurfaceXY). + * @return {SVGElement} Drag surface group element. + */ +Blockly.BlockDragSurfaceSvg.prototype.getGroup = function() { + return this.dragGroup_; +}; + +/** + * Get the current blocks on the drag surface, if any (primarily + * for BlockSvg.getRelativeToSurfaceXY). + * @return {Element} Drag surface block DOM element, or undefined if no blocks + * exist. + */ +Blockly.BlockDragSurfaceSvg.prototype.getCurrentBlock = function() { + return /** @type {Element} */ (this.dragGroup_.firstChild); +}; + +/** + * 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. + */ +Blockly.BlockDragSurfaceSvg.prototype.clearAndHide = function(opt_newSurface) { + if (opt_newSurface) { + // appendChild removes the node from this.dragGroup_ + opt_newSurface.appendChild(this.getCurrentBlock()); + } else { + this.dragGroup_.removeChild(this.getCurrentBlock()); + } + this.SVG_.style.display = 'none'; + if (this.dragGroup_.childNodes.length) { + throw Error('Drag group was not cleared.'); + } + this.surfaceXY_ = null; +}; diff --git a/static/js/dist/core/block_dragger.js b/static/js/dist/core/block_dragger.js new file mode 100644 index 0000000..34a97b1 --- /dev/null +++ b/static/js/dist/core/block_dragger.js @@ -0,0 +1,379 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Methods for dragging a block visually. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.BlockDragger'); + +goog.require('Blockly.blockAnimations'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockMove'); +goog.require('Blockly.Events.BlockDrag'); +goog.require('Blockly.InsertionMarkerManager'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); + + +/** + * 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 + */ +Blockly.BlockDragger = function(block, workspace) { + /** + * The top block in the stack that is being dragged. + * @type {!Blockly.BlockSvg} + * @private + */ + this.draggingBlock_ = block; + + /** + * The workspace on which the block is being dragged. + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = workspace; + + /** + * Object that keeps track of connections on dragged blocks. + * @type {!Blockly.InsertionMarkerManager} + * @private + */ + this.draggedConnectionManager_ = new Blockly.InsertionMarkerManager( + this.draggingBlock_); + + /** + * Which delete area the mouse pointer is over, if any. + * One of {@link Blockly.DELETE_AREA_TRASH}, + * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. + * @type {?number} + * @private + */ + this.deleteArea_ = null; + + /** + * Whether the block would be deleted if dropped immediately. + * @type {boolean} + * @private + */ + this.wouldDeleteBlock_ = false; + + /** + * The location of the top left corner of the dragging block at the beginning + * of the drag in workspace coordinates. + * @type {!Blockly.utils.Coordinate} + * @private + */ + this.startXY_ = this.draggingBlock_.getRelativeToSurfaceXY(); + + /** + * A list of all of the icons (comment, warning, and mutator) that are + * on this block and its descendants. Moving an icon moves the bubble that + * extends from it if that bubble is open. + * @type {Array.} + * @private + */ + this.dragIconData_ = Blockly.BlockDragger.initIconData_(block); +}; + +/** + * Sever all links from this object. + * @package + */ +Blockly.BlockDragger.prototype.dispose = function() { + this.dragIconData_.length = 0; + + if (this.draggedConnectionManager_) { + this.draggedConnectionManager_.dispose(); + } +}; + +/** + * Make a list of all of the icons (comment, warning, and mutator) that are + * on this block and its descendants. Moving an icon moves the bubble that + * extends from it if that bubble is open. + * @param {!Blockly.BlockSvg} block The root block that is being dragged. + * @return {!Array.} The list of all icons and their locations. + * @private + */ +Blockly.BlockDragger.initIconData_ = function(block) { + // Build a list of icons that need to be moved and where they started. + var dragIconData = []; + var descendants = block.getDescendants(false); + for (var i = 0, descendant; (descendant = descendants[i]); i++) { + var icons = descendant.getIcons(); + for (var j = 0; j < icons.length; j++) { + var data = { + // Blockly.utils.Coordinate with x and y properties (workspace coordinates). + location: icons[j].getIconLocation(), + // Blockly.Icon + icon: icons[j] + }; + dragIconData.push(data); + } + } + return dragIconData; +}; + +/** + * 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 + */ +Blockly.BlockDragger.prototype.startBlockDrag = function(currentDragDeltaXY, + healStack) { + if (!Blockly.Events.getGroup()) { + Blockly.Events.setGroup(true); + } + this.fireDragStartEvent_(); + + // Mutators don't have the same type of z-ordering as the normal workspace + // during a drag. They have to rely on the order of the blocks in the SVG. + // For performance reasons that usually happens at the end of a drag, + // but do it at the beginning for mutators. + if (this.workspace_.isMutator) { + this.draggingBlock_.bringToFront(); + } + + // During a drag there may be a lot of rerenders, but not field changes. + // Turn the cache on so we don't do spurious remeasures during the drag. + Blockly.utils.dom.startTextWidthCache(); + this.workspace_.setResizesEnabled(false); + Blockly.blockAnimations.disconnectUiStop(); + + if (this.draggingBlock_.getParent() || + (healStack && this.draggingBlock_.nextConnection && + this.draggingBlock_.nextConnection.targetBlock())) { + this.draggingBlock_.unplug(healStack); + var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); + var newLoc = Blockly.utils.Coordinate.sum(this.startXY_, delta); + + this.draggingBlock_.translate(newLoc.x, newLoc.y); + Blockly.blockAnimations.disconnectUiEffect(this.draggingBlock_); + this.draggedConnectionManager_.updateAvailableConnections(); + } + this.draggingBlock_.setDragging(true); + // For future consideration: we may be able to put moveToDragSurface inside + // the block dragger, which would also let the block not track the block drag + // surface. + this.draggingBlock_.moveToDragSurface(); + + var toolbox = this.workspace_.getToolbox(); + if (toolbox && typeof toolbox.addStyle == 'function') { + var style = this.draggingBlock_.isDeletable() ? 'blocklyToolboxDelete' : + 'blocklyToolboxGrab'; + toolbox.addStyle(style); + } +}; + +/** + * Fire a UI event at the start of a block drag. + * @private + */ +Blockly.BlockDragger.prototype.fireDragStartEvent_ = function() { + var event = new Blockly.Events.BlockDrag(this.draggingBlock_, true, + this.draggingBlock_.getDescendants(false)); + Blockly.Events.fire(event); +}; + +/** + * 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 + */ +Blockly.BlockDragger.prototype.dragBlock = function(e, currentDragDeltaXY) { + var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); + var newLoc = Blockly.utils.Coordinate.sum(this.startXY_, delta); + + this.draggingBlock_.moveDuringDrag(newLoc); + this.dragIcons_(delta); + + this.deleteArea_ = this.workspace_.isDeleteArea(e); + this.draggedConnectionManager_.update(delta, this.deleteArea_); + + this.updateCursorDuringBlockDrag_(); +}; + +/** + * 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 + */ +Blockly.BlockDragger.prototype.endBlockDrag = function(e, currentDragDeltaXY) { + // Make sure internal state is fresh. + this.dragBlock(e, currentDragDeltaXY); + this.dragIconData_ = []; + this.fireDragEndEvent_(); + + Blockly.utils.dom.stopTextWidthCache(); + + Blockly.blockAnimations.disconnectUiStop(); + + var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); + var newLoc = Blockly.utils.Coordinate.sum(this.startXY_, delta); + this.draggingBlock_.moveOffDragSurface(newLoc); + + var deleted = this.maybeDeleteBlock_(); + if (!deleted) { + // These are expensive and don't need to be done if we're deleting. + this.draggingBlock_.moveConnections(delta.x, delta.y); + this.draggingBlock_.setDragging(false); + this.fireMoveEvent_(); + if (this.draggedConnectionManager_.wouldConnectBlock()) { + // Applying connections also rerenders the relevant blocks. + this.draggedConnectionManager_.applyConnections(); + } else { + this.draggingBlock_.render(); + } + this.draggingBlock_.scheduleSnapAndBump(); + } + this.workspace_.setResizesEnabled(true); + + var toolbox = this.workspace_.getToolbox(); + if (toolbox && typeof toolbox.removeStyle == 'function') { + var style = this.draggingBlock_.isDeletable() ? 'blocklyToolboxDelete' : + 'blocklyToolboxGrab'; + toolbox.removeStyle(style); + } + Blockly.Events.setGroup(false); +}; + +/** + * Fire a UI event at the end of a block drag. + * @private + */ +Blockly.BlockDragger.prototype.fireDragEndEvent_ = function() { + var event = new Blockly.Events.BlockDrag(this.draggingBlock_, false, + this.draggingBlock_.getDescendants(false)); + Blockly.Events.fire(event); +}; + +/** + * Fire a move event at the end of a block drag. + * @private + */ +Blockly.BlockDragger.prototype.fireMoveEvent_ = function() { + var event = new Blockly.Events.BlockMove(this.draggingBlock_); + event.oldCoordinate = this.startXY_; + event.recordNew(); + Blockly.Events.fire(event); +}; + +/** + * Shut the trash can and, if necessary, delete the dragging block. + * Should be called at the end of a block drag. + * @return {boolean} Whether the block was deleted. + * @private + */ +Blockly.BlockDragger.prototype.maybeDeleteBlock_ = function() { + var trashcan = this.workspace_.trashcan; + + if (this.wouldDeleteBlock_) { + if (trashcan) { + setTimeout(trashcan.closeLid.bind(trashcan), 100); + } + // Fire a move event, so we know where to go back to for an undo. + this.fireMoveEvent_(); + this.draggingBlock_.dispose(false, true); + Blockly.draggingConnections = []; + } else if (trashcan) { + // Make sure the trash can lid is closed. + trashcan.closeLid(); + } + return this.wouldDeleteBlock_; +}; + +/** + * Update the cursor (and possibly the trash can lid) to reflect whether the + * dragging block would be deleted if released immediately. + * @private + */ +Blockly.BlockDragger.prototype.updateCursorDuringBlockDrag_ = function() { + this.wouldDeleteBlock_ = this.draggedConnectionManager_.wouldDeleteBlock(); + var trashcan = this.workspace_.trashcan; + if (this.wouldDeleteBlock_) { + this.draggingBlock_.setDeleteStyle(true); + if (this.deleteArea_ == Blockly.DELETE_AREA_TRASH && trashcan) { + trashcan.setLidOpen(true); + } + } else { + this.draggingBlock_.setDeleteStyle(false); + if (trashcan) { + trashcan.setLidOpen(false); + } + } +}; + +/** + * Convert a coordinate object from pixels to workspace units, including a + * correction for mutator workspaces. + * This function does not consider differing origins. It simply scales the + * input's x and y values. + * @param {!Blockly.utils.Coordinate} pixelCoord A coordinate with x and y values + * in CSS pixel units. + * @return {!Blockly.utils.Coordinate} The input coordinate divided by the workspace + * scale. + * @private + */ +Blockly.BlockDragger.prototype.pixelsToWorkspaceUnits_ = function(pixelCoord) { + var result = new Blockly.utils.Coordinate( + pixelCoord.x / this.workspace_.scale, + pixelCoord.y / this.workspace_.scale); + if (this.workspace_.isMutator) { + // If we're in a mutator, its scale is always 1, purely because of some + // oddities in our rendering optimizations. The actual scale is the same as + // the scale on the parent workspace. + // Fix that for dragging. + var mainScale = this.workspace_.options.parentWorkspace.scale; + result.scale(1 / mainScale); + } + return result; +}; + +/** + * Move all of the icons connected to this drag. + * @param {!Blockly.utils.Coordinate} dxy How far to move the icons from their + * original positions, in workspace units. + * @private + */ +Blockly.BlockDragger.prototype.dragIcons_ = function(dxy) { + // Moving icons moves their associated bubbles. + for (var i = 0; i < this.dragIconData_.length; i++) { + var data = this.dragIconData_[i]; + data.icon.setIconLocation(Blockly.utils.Coordinate.sum(data.location, dxy)); + } +}; + +/** + * 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 + */ +Blockly.BlockDragger.prototype.getInsertionMarkers = function() { + // No insertion markers with the old style of dragged connection managers. + if (this.draggedConnectionManager_ && + this.draggedConnectionManager_.getInsertionMarkers) { + return this.draggedConnectionManager_.getInsertionMarkers(); + } + return []; +}; diff --git a/static/js/dist/core/block_svg.js b/static/js/dist/core/block_svg.js new file mode 100644 index 0000000..95f7114 --- /dev/null +++ b/static/js/dist/core/block_svg.js @@ -0,0 +1,1755 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Methods for graphically rendering a block as SVG. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.BlockSvg'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.Block'); +goog.require('Blockly.blockAnimations'); +goog.require('Blockly.blockRendering.IPathObject'); +goog.require('Blockly.constants'); +goog.require('Blockly.ContextMenu'); +goog.require('Blockly.ContextMenuRegistry'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockMove'); +goog.require('Blockly.Events.Selected'); +goog.require('Blockly.Msg'); +goog.require('Blockly.navigation'); +goog.require('Blockly.RenderedConnection'); +goog.require('Blockly.TabNavigateCursor'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.Touch'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.deprecation'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Rect'); +goog.require('Blockly.utils.userAgent'); + +goog.requireType('Blockly.IASTNodeLocationSvg'); +goog.requireType('Blockly.IBoundedElement'); +goog.requireType('Blockly.ICopyable'); + + +/** + * 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} + * @implements {Blockly.IASTNodeLocationSvg} + * @implements {Blockly.IBoundedElement} + * @implements {Blockly.ICopyable} + * @constructor + */ +Blockly.BlockSvg = function(workspace, prototypeName, opt_id) { + // Create core elements for the block. + /** + * @type {!SVGGElement} + * @private + */ + this.svgGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, {}, null); + this.svgGroup_.translate_ = ''; + + /** + * A block style object. + * @type {!Blockly.Theme.BlockStyle} + */ + this.style = workspace.getRenderer().getConstants().getBlockStyle(null); + + /** + * The renderer's path object. + * @type {Blockly.blockRendering.IPathObject} + * @package + */ + this.pathObject = workspace.getRenderer().makePathObject( + this.svgGroup_, this.style); + + /** @type {boolean} */ + this.rendered = false; + /** + * Is this block currently rendering? Used to stop recursive render calls + * from actually triggering a re-render. + * @type {boolean} + * @private + */ + this.renderIsInProgress_ = false; + + + /** @type {!Blockly.WorkspaceSvg} */ + this.workspace = workspace; + + /** @type {Blockly.RenderedConnection} */ + this.outputConnection = null; + /** @type {Blockly.RenderedConnection} */ + this.nextConnection = null; + /** @type {Blockly.RenderedConnection} */ + this.previousConnection = null; + + /** + * Whether to move the block to the drag surface when it is dragged. + * True if it should move, false if it should be translated directly. + * @type {boolean} + * @private + */ + this.useDragSurface_ = + Blockly.utils.is3dSupported() && !!workspace.getBlockDragSurface(); + + var svgPath = this.pathObject.svgPath; + svgPath.tooltip = this; + Blockly.Tooltip.bindMouseEvents(svgPath); + Blockly.BlockSvg.superClass_.constructor.call(this, + workspace, prototypeName, opt_id); + + // Expose this block's ID on its top-level SVG group. + if (this.svgGroup_.dataset) { + this.svgGroup_.dataset['id'] = this.id; + } else if (Blockly.utils.userAgent.IE) { + // SVGElement.dataset is not available on IE11, but data-* properties + // can be set with setAttribute(). + this.svgGroup_.setAttribute('data-id', this.id); + } +}; +Blockly.utils.object.inherits(Blockly.BlockSvg, Blockly.Block); + +/** + * Height of this block, not including any statement blocks above or below. + * Height is in workspace units. + */ +Blockly.BlockSvg.prototype.height = 0; + +/** + * Width of this block, including any connected value blocks. + * Width is in workspace units. + */ +Blockly.BlockSvg.prototype.width = 0; + +/** + * Map from IDs for warnings text to PIDs of functions to apply them. + * Used to be able to maintain multiple warnings. + * @type {Object.} + * @private + */ +Blockly.BlockSvg.prototype.warningTextDb_ = null; + +/** + * Constant for identifying rows that are to be rendered inline. + * Don't collide with Blockly.INPUT_VALUE and friends. + * @const + */ +Blockly.BlockSvg.INLINE = -1; + +/** + * 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 + */ +Blockly.BlockSvg.COLLAPSED_WARNING_ID = 'TEMP_COLLAPSED_WARNING_'; + +/** + * 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} + */ +Blockly.BlockSvg.prototype.decompose; + +/** + * 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)} + */ +Blockly.BlockSvg.prototype.compose; + +/** + * An optional method for defining custom block context menu items. + * @type {?function(!Array.)} + */ +Blockly.BlockSvg.prototype.customContextMenu; + +/** + * An property used internally to reference the block's rendering debugger. + * @type {?Blockly.blockRendering.Debug} + * @package + */ +Blockly.BlockSvg.prototype.renderingDebugger; + +/** + * Create and initialize the SVG representation of the block. + * May be called more than once. + */ +Blockly.BlockSvg.prototype.initSvg = function() { + if (!this.workspace.rendered) { + throw TypeError('Workspace is headless.'); + } + for (var i = 0, input; (input = this.inputList[i]); i++) { + input.init(); + } + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].createIcon(); + } + this.applyColour(); + this.pathObject.updateMovable(this.isMovable()); + var svg = this.getSvgRoot(); + if (!this.workspace.options.readOnly && !this.eventsInit_ && svg) { + Blockly.bindEventWithChecks_( + svg, 'mousedown', this, this.onMouseDown_); + } + this.eventsInit_ = true; + + if (!svg.parentNode) { + this.workspace.getCanvas().appendChild(svg); + } +}; + +/** + * Get the secondary colour of a block. + * @return {?string} #RRGGBB string. + */ +Blockly.BlockSvg.prototype.getColourSecondary = function() { + return this.style.colourSecondary; +}; + +/** + * Get the tertiary colour of a block. + * @return {?string} #RRGGBB string. + */ +Blockly.BlockSvg.prototype.getColourTertiary = function() { + return this.style.colourTertiary; +}; + +/** + * Get the shadow colour of a block. + * @return {?string} #RRGGBB string. + * @deprecated Use style.colourSecondary. (2020 January 21) + */ +Blockly.BlockSvg.prototype.getColourShadow = function() { + Blockly.utils.deprecation.warn( + 'BlockSvg.prototype.getColourShadow', + 'January 2020', + 'January 2021', + 'style.colourSecondary'); + return this.getColourSecondary(); +}; + +/** + * Get the border colour(s) of a block. + * @return {{colourDark, colourLight, colourBorder}} An object containing + * colour values for the border(s) of the block. If the block is using a + * style the colourBorder will be defined and equal to the tertiary colour + * of the style (#RRGGBB string). Otherwise the colourDark and colourLight + * attributes will be defined (#RRGGBB strings). + * @deprecated Use style.colourTertiary. (2020 January 21) + */ +Blockly.BlockSvg.prototype.getColourBorder = function() { + Blockly.utils.deprecation.warn( + 'BlockSvg.prototype.getColourBorder', + 'January 2020', + 'January 2021', + 'style.colourTertiary'); + var colourTertiary = this.getColourTertiary(); + return { + colourBorder: colourTertiary, + colourLight: null, + colourDark: null + }; +}; + +/** + * Select this block. Highlight it visually. + */ +Blockly.BlockSvg.prototype.select = function() { + if (this.isShadow() && this.getParent()) { + // Shadow blocks should not be selected. + this.getParent().select(); + return; + } + if (Blockly.selected == this) { + return; + } + var oldId = null; + if (Blockly.selected) { + oldId = Blockly.selected.id; + // Unselect any previously selected block. + Blockly.Events.disable(); + try { + Blockly.selected.unselect(); + } finally { + Blockly.Events.enable(); + } + } + var event = new Blockly.Events.Selected(oldId, this.id, this.workspace.id); + Blockly.Events.fire(event); + Blockly.selected = this; + this.addSelect(); +}; + +/** + * Unselect this block. Remove its highlighting. + */ +Blockly.BlockSvg.prototype.unselect = function() { + if (Blockly.selected != this) { + return; + } + var event = new Blockly.Events.Selected(this.id, null, this.workspace.id); + event.workspaceId = this.workspace.id; + Blockly.Events.fire(event); + Blockly.selected = null; + this.removeSelect(); +}; + +/** + * Block's mutator icon (if any). + * @type {Blockly.Mutator} + */ +Blockly.BlockSvg.prototype.mutator = null; + +/** + * Block's comment icon (if any). + * @type {Blockly.Comment} + * @deprecated August 2019. Use getCommentIcon instead. + */ +Blockly.BlockSvg.prototype.comment = null; + +/** + * Block's comment icon (if any). + * @type {Blockly.Comment} + * @private + */ +Blockly.BlockSvg.prototype.commentIcon_ = null; + +/** + * Block's warning icon (if any). + * @type {Blockly.Warning} + */ +Blockly.BlockSvg.prototype.warning = null; + +/** + * Returns a list of mutator, comment, and warning icons. + * @return {!Array} List of icons. + */ +Blockly.BlockSvg.prototype.getIcons = function() { + var icons = []; + if (this.mutator) { + icons.push(this.mutator); + } + if (this.commentIcon_) { + icons.push(this.commentIcon_); + } + if (this.warning) { + icons.push(this.warning); + } + return icons; +}; + +/** + * Set parent of this block to be a new block or null. + * @param {Blockly.Block} newParent New parent block. + * @override + */ +Blockly.BlockSvg.prototype.setParent = function(newParent) { + var oldParent = this.parentBlock_; + if (newParent == oldParent) { + return; + } + + Blockly.utils.dom.startTextWidthCache(); + Blockly.BlockSvg.superClass_.setParent.call(this, newParent); + Blockly.utils.dom.stopTextWidthCache(); + + var svgRoot = this.getSvgRoot(); + + // Bail early if workspace is clearing, or we aren't rendered. + // We won't need to reattach ourselves anywhere. + if (this.workspace.isClearing || !svgRoot) { + return; + } + + var oldXY = this.getRelativeToSurfaceXY(); + if (newParent) { + newParent.getSvgRoot().appendChild(svgRoot); + var newXY = this.getRelativeToSurfaceXY(); + // Move the connections to match the child's new position. + this.moveConnections(newXY.x - oldXY.x, newXY.y - oldXY.y); + } + // If we are losing a parent, we want to move our DOM element to the + // root of the workspace. + else if (oldParent) { + this.workspace.getCanvas().appendChild(svgRoot); + this.translate(oldXY.x, oldXY.y); + } + + this.applyColour(); +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { + var x = 0; + var y = 0; + + var dragSurfaceGroup = this.useDragSurface_ ? + this.workspace.getBlockDragSurface().getGroup() : null; + + var element = this.getSvgRoot(); + if (element) { + do { + // Loop through this block and every parent. + var xy = Blockly.utils.getRelativeXY(element); + x += xy.x; + y += xy.y; + // If this element is the current element on the drag surface, include + // the translation of the drag surface itself. + if (this.useDragSurface_ && + this.workspace.getBlockDragSurface().getCurrentBlock() == element) { + var surfaceTranslation = + this.workspace.getBlockDragSurface().getSurfaceTranslation(); + x += surfaceTranslation.x; + y += surfaceTranslation.y; + } + element = /** @type {!SVGElement} */ (element.parentNode); + } while (element && element != this.workspace.getCanvas() && + element != dragSurfaceGroup); + } + return new Blockly.utils.Coordinate(x, y); +}; + +/** + * Move a block by a relative offset. + * @param {number} dx Horizontal offset in workspace units. + * @param {number} dy Vertical offset in workspace units. + */ +Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { + if (this.parentBlock_) { + throw Error('Block has parent.'); + } + var eventsEnabled = Blockly.Events.isEnabled(); + if (eventsEnabled) { + var event = new Blockly.Events.BlockMove(this); + } + var xy = this.getRelativeToSurfaceXY(); + this.translate(xy.x + dx, xy.y + dy); + this.moveConnections(dx, dy); + if (eventsEnabled) { + event.recordNew(); + Blockly.Events.fire(event); + } + this.workspace.resizeContents(); +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.translate = function(x, y) { + this.getSvgRoot().setAttribute('transform', + 'translate(' + x + ',' + y + ')'); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.moveToDragSurface = function() { + if (!this.useDragSurface_) { + return; + } + // The translation for drag surface blocks, + // is equal to the current relative-to-surface position, + // to keep the position in sync as it move on/off the surface. + // This is in workspace coordinates. + var xy = this.getRelativeToSurfaceXY(); + this.clearTransformAttributes_(); + this.workspace.getBlockDragSurface().translateSurface(xy.x, xy.y); + // Execute the move on the top-level SVG component + var svg = this.getSvgRoot(); + if (svg) { + this.workspace.getBlockDragSurface().setBlocksAndShow(svg); + } +}; + +/** + * Move a block to a position. + * @param {Blockly.utils.Coordinate} xy The position to move to in workspace units. + */ +Blockly.BlockSvg.prototype.moveTo = function(xy) { + var curXY = this.getRelativeToSurfaceXY(); + this.moveBy(xy.x - curXY.x, xy.y - curXY.y); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.moveOffDragSurface = function(newXY) { + if (!this.useDragSurface_) { + return; + } + // Translate to current position, turning off 3d. + this.translate(newXY.x, newXY.y); + this.workspace.getBlockDragSurface().clearAndHide(this.workspace.getCanvas()); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.moveDuringDrag = function(newLoc) { + if (this.useDragSurface_) { + this.workspace.getBlockDragSurface().translateSurface(newLoc.x, newLoc.y); + } else { + this.svgGroup_.translate_ = 'translate(' + newLoc.x + ',' + newLoc.y + ')'; + this.svgGroup_.setAttribute('transform', + this.svgGroup_.translate_ + this.svgGroup_.skew_); + } +}; + +/** + * Clear the block of transform="..." attributes. + * Used when the block is switching from 3d to 2d transform or vice versa. + * @private + */ +Blockly.BlockSvg.prototype.clearTransformAttributes_ = function() { + this.getSvgRoot().removeAttribute('transform'); +}; + +/** + * Snap this block to the nearest grid point. + */ +Blockly.BlockSvg.prototype.snapToGrid = function() { + if (!this.workspace) { + return; // Deleted block. + } + if (this.workspace.isDragging()) { + return; // Don't bump blocks during a drag. + } + if (this.getParent()) { + return; // Only snap top-level blocks. + } + if (this.isInFlyout) { + return; // Don't move blocks around in a flyout. + } + var grid = this.workspace.getGrid(); + if (!grid || !grid.shouldSnap()) { + return; // Config says no snapping. + } + var spacing = grid.getSpacing(); + var half = spacing / 2; + var xy = this.getRelativeToSurfaceXY(); + var dx = Math.round((xy.x - half) / spacing) * spacing + half - xy.x; + var dy = Math.round((xy.y - half) / spacing) * spacing + half - xy.y; + dx = Math.round(dx); + dy = Math.round(dy); + if (dx != 0 || dy != 0) { + this.moveBy(dx, dy); + } +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.getBoundingRectangle = function() { + var blockXY = this.getRelativeToSurfaceXY(); + var blockBounds = this.getHeightWidth(); + var left, right; + if (this.RTL) { + left = blockXY.x - blockBounds.width; + right = blockXY.x; + } else { + left = blockXY.x; + right = blockXY.x + blockBounds.width; + } + return new Blockly.utils.Rect( + blockXY.y, blockXY.y + blockBounds.height, left, right); +}; + +/** + * Notify every input on this block to mark its fields as dirty. + * A dirty field is a field that needs to be re-rendered. + */ +Blockly.BlockSvg.prototype.markDirty = function() { + this.pathObject.constants = + (/** @type {!Blockly.WorkspaceSvg} */ (this.workspace)) + .getRenderer().getConstants(); + for (var i = 0, input; (input = this.inputList[i]); i++) { + input.markDirty(); + } +}; + +/** + * Set whether the block is collapsed or not. + * @param {boolean} collapsed True if collapsed. + */ +Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { + if (this.collapsed_ == collapsed) { + return; + } + Blockly.BlockSvg.superClass_.setCollapsed.call(this, collapsed); + if (!collapsed) { + this.updateCollapsed_(); + } else if (this.rendered) { + this.render(); + // Don't bump neighbours. Users like to store collapsed functions together + // and bumping makes them go out of alignment. + } +}; + +/** + * Makes sure that when the block is collapsed, it is rendered correctly + * for that state. + * @private + */ +Blockly.BlockSvg.prototype.updateCollapsed_ = function() { + var collapsed = this.isCollapsed(); + var collapsedInputName = Blockly.Block.COLLAPSED_INPUT_NAME; + var collapsedFieldName = Blockly.Block.COLLAPSED_FIELD_NAME; + + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.name != collapsedInputName) { + input.setVisible(!collapsed); + } + } + + if (!collapsed) { + this.removeInput(collapsedInputName); + return; + } + + var icons = this.getIcons(); + for (var i = 0, icon; (icon = icons[i]); i++) { + icon.setVisible(false); + } + + var text = this.toString(Blockly.COLLAPSE_CHARS); + var field = this.getField(collapsedFieldName); + if (field) { + field.setValue(text); + return; + } + var input = this.getInput(collapsedInputName) || + this.appendDummyInput(collapsedInputName); + input.appendField(new Blockly.FieldLabel(text), collapsedFieldName); +}; + +/** + * Open the next (or previous) FieldTextInput. + * @param {!Blockly.Field} start Current field. + * @param {boolean} forward If true go forward, otherwise backward. + */ +Blockly.BlockSvg.prototype.tab = function(start, forward) { + var tabCursor = new Blockly.TabNavigateCursor(); + tabCursor.setCurNode(Blockly.ASTNode.createFieldNode(start)); + var currentNode = tabCursor.getCurNode(); + var actionName = forward ? + Blockly.navigation.actionNames.NEXT : Blockly.navigation.actionNames.PREVIOUS; + + tabCursor.onBlocklyAction( + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ ({name: actionName})); + + var nextNode = tabCursor.getCurNode(); + if (nextNode && nextNode !== currentNode) { + var nextField = /** @type {!Blockly.Field} */ (nextNode.getLocation()); + nextField.showEditor(); + + // Also move the cursor if we're in keyboard nav mode. + if (this.workspace.keyboardAccessibilityMode) { + this.workspace.getCursor().setCurNode(nextNode); + } + } +}; + +/** + * Handle a mouse-down on an SVG block. + * @param {!Event} e Mouse down event or touch start event. + * @private + */ +Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { + var gesture = this.workspace && this.workspace.getGesture(e); + if (gesture) { + gesture.handleBlockStart(e, this); + } +}; + +/** + * Load the block's help page in a new window. + * @package + */ +Blockly.BlockSvg.prototype.showHelp = function() { + var url = (typeof this.helpUrl == 'function') ? this.helpUrl() : this.helpUrl; + if (url) { + window.open(url); + } +}; + +/** + * Generate the context menu for this block. + * @protected + * @return {Array.} Context menu options + */ +Blockly.BlockSvg.prototype.generateContextMenu = function() { + if (this.workspace.options.readOnly || !this.contextMenu) { + return null; + } + var menuOptions = Blockly.ContextMenuRegistry.registry.getContextMenuOptions( + Blockly.ContextMenuRegistry.ScopeType.BLOCK, {block: this}); + + // Allow the block to add or modify menuOptions. + if (this.customContextMenu) { + this.customContextMenu(menuOptions); + } + + return menuOptions; +}; + +/** + * Show the context menu for this block. + * @param {!Event} e Mouse event. + * @package + */ +Blockly.BlockSvg.prototype.showContextMenu = function(e) { + var menuOptions = this.generateContextMenu(); + + if (menuOptions && menuOptions.length) { + Blockly.ContextMenu.show(e, menuOptions, this.RTL); + Blockly.ContextMenu.currentBlock = this; + } +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.moveConnections = function(dx, dy) { + if (!this.rendered) { + // Rendering is required to lay out the blocks. + // This is probably an invisible block attached to a collapsed block. + return; + } + var myConnections = this.getConnections_(false); + for (var i = 0; i < myConnections.length; i++) { + myConnections[i].moveBy(dx, dy); + } + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].computeIconLocation(); + } + + // Recurse through all blocks attached under this one. + for (var i = 0; i < this.childBlocks_.length; i++) { + this.childBlocks_[i].moveConnections(dx, dy); + } +}; + +/** + * Recursively adds or removes the dragging class to this node and its children. + * @param {boolean} adding True if adding, false if removing. + * @package + */ +Blockly.BlockSvg.prototype.setDragging = function(adding) { + if (adding) { + var group = this.getSvgRoot(); + group.translate_ = ''; + group.skew_ = ''; + Blockly.draggingConnections = + Blockly.draggingConnections.concat(this.getConnections_(true)); + Blockly.utils.dom.addClass( + /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging'); + } else { + Blockly.draggingConnections = []; + Blockly.utils.dom.removeClass( + /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging'); + } + // Recurse through all blocks attached under this one. + for (var i = 0; i < this.childBlocks_.length; i++) { + this.childBlocks_[i].setDragging(adding); + } +}; + +/** + * Set whether this block is movable or not. + * @param {boolean} movable True if movable. + */ +Blockly.BlockSvg.prototype.setMovable = function(movable) { + Blockly.BlockSvg.superClass_.setMovable.call(this, movable); + this.pathObject.updateMovable(movable); +}; + +/** + * Set whether this block is editable or not. + * @param {boolean} editable True if editable. + */ +Blockly.BlockSvg.prototype.setEditable = function(editable) { + Blockly.BlockSvg.superClass_.setEditable.call(this, editable); + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].updateEditable(); + } +}; + +/** + * Set whether this block is a shadow block or not. + * @param {boolean} shadow True if a shadow. + */ +Blockly.BlockSvg.prototype.setShadow = function(shadow) { + Blockly.BlockSvg.superClass_.setShadow.call(this, shadow); + this.applyColour(); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.setInsertionMarker = function(insertionMarker) { + if (this.isInsertionMarker_ == insertionMarker) { + return; // No change. + } + this.isInsertionMarker_ = insertionMarker; + if (this.isInsertionMarker_) { + this.setColour(this.workspace.getRenderer().getConstants(). + INSERTION_MARKER_COLOUR); + this.pathObject.updateInsertionMarker(true); + } +}; + +/** + * Return the root node of the SVG or null if none exists. + * @return {!SVGGElement} The root SVG node (probably a group). + */ +Blockly.BlockSvg.prototype.getSvgRoot = function() { + return this.svgGroup_; +}; + +/** + * 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} + */ +Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { + if (!this.workspace) { + // The block has already been deleted. + return; + } + Blockly.Tooltip.dispose(); + Blockly.Tooltip.unbindMouseEvents(this.pathObject.svgPath); + Blockly.utils.dom.startTextWidthCache(); + // Save the block's workspace temporarily so we can resize the + // contents once the block is disposed. + var blockWorkspace = this.workspace; + // If this block is being dragged, unlink the mouse events. + if (Blockly.selected == this) { + this.unselect(); + this.workspace.cancelCurrentGesture(); + } + // If this block has a context menu open, close it. + if (Blockly.ContextMenu.currentBlock == this) { + Blockly.ContextMenu.hide(); + } + + if (this.workspace.keyboardAccessibilityMode) { + Blockly.navigation.moveCursorOnBlockDelete(this); + } + + if (animate && this.rendered) { + this.unplug(healStack); + Blockly.blockAnimations.disposeUiEffect(this); + } + // Stop rerendering. + this.rendered = false; + + // Clear pending warnings. + if (this.warningTextDb_) { + for (var n in this.warningTextDb_) { + clearTimeout(this.warningTextDb_[n]); + } + this.warningTextDb_ = null; + } + + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].dispose(); + } + Blockly.BlockSvg.superClass_.dispose.call(this, !!healStack); + + Blockly.utils.dom.removeNode(this.svgGroup_); + blockWorkspace.resizeContents(); + // Sever JavaScript to DOM connections. + this.svgGroup_ = null; + Blockly.utils.dom.stopTextWidthCache(); +}; + +/** + * Encode a block for copying. + * @return {?Blockly.ICopyable.CopyData} Copy metadata, or null if the block is + * an insertion marker. + * @package + */ +Blockly.BlockSvg.prototype.toCopyData = function() { + if (this.isInsertionMarker_) { + return null; + } + var xml = /** @type {!Element} */ (Blockly.Xml.blockToDom(this, true)); + // Copy only the selected block and internal blocks. + Blockly.Xml.deleteNext(xml); + // Encode start position in XML. + var xy = this.getRelativeToSurfaceXY(); + xml.setAttribute('x', this.RTL ? -xy.x : xy.x); + xml.setAttribute('y', xy.y); + return { + xml: xml, + source: this.workspace, + typeCounts: Blockly.utils.getBlockTypeCounts(this, true) + }; +}; + +/** + * Change the colour of a block. + * @package + */ +Blockly.BlockSvg.prototype.applyColour = function() { + this.pathObject.applyColour(this); + + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].applyColour(); + } + + for (var x = 0, input; (input = this.inputList[x]); x++) { + for (var y = 0, field; (field = input.fieldRow[y]); y++) { + field.applyColour(); + } + } +}; + +/** + * Enable or disable a block. + */ +Blockly.BlockSvg.prototype.updateDisabled = function() { + var children = this.getChildren(false); + this.applyColour(); + if (this.isCollapsed()) { + return; + } + for (var i = 0, child; (child = children[i]); i++) { + if (child.rendered) { + child.updateDisabled(); + } + } +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.getCommentIcon = function() { + return this.commentIcon_; +}; + +/** + * Set this block's comment text. + * @param {?string} text The text, or null to delete. + */ +Blockly.BlockSvg.prototype.setCommentText = function(text) { + if (!Blockly.Comment) { + throw Error('Missing require for Blockly.Comment'); + } + if (this.commentModel.text == text) { + return; + } + Blockly.BlockSvg.superClass_.setCommentText.call(this, text); + + var shouldHaveComment = text != null; + if (!!this.commentIcon_ == shouldHaveComment) { + // If the comment's state of existence is correct, but the text is new + // that means we're just updating a comment. + this.commentIcon_.updateText(); + return; + } + if (shouldHaveComment) { + this.commentIcon_ = new Blockly.Comment(this); + this.comment = this.commentIcon_; // For backwards compatibility. + } else { + this.commentIcon_.dispose(); + this.commentIcon_ = null; + this.comment = null; // For backwards compatibility. + } + if (this.rendered) { + this.render(); + // Adding or removing a comment icon will cause the block to change shape. + this.bumpNeighbours(); + } +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.setWarningText = function(text, opt_id) { + if (!Blockly.Warning) { + throw Error('Missing require for Blockly.Warning'); + } + if (!this.warningTextDb_) { + // Create a database of warning PIDs. + // Only runs once per block (and only those with warnings). + this.warningTextDb_ = Object.create(null); + } + var id = opt_id || ''; + if (!id) { + // Kill all previous pending processes, this edit supersedes them all. + for (var n in this.warningTextDb_) { + clearTimeout(this.warningTextDb_[n]); + delete this.warningTextDb_[n]; + } + } else if (this.warningTextDb_[id]) { + // Only queue up the latest change. Kill any earlier pending process. + clearTimeout(this.warningTextDb_[id]); + delete this.warningTextDb_[id]; + } + if (this.workspace.isDragging()) { + // Don't change the warning text during a drag. + // Wait until the drag finishes. + var thisBlock = this; + this.warningTextDb_[id] = setTimeout(function() { + if (thisBlock.workspace) { // Check block wasn't deleted. + delete thisBlock.warningTextDb_[id]; + thisBlock.setWarningText(text, id); + } + }, 100); + return; + } + if (this.isInFlyout) { + text = null; + } + + var changedState = false; + if (typeof text == 'string') { + // Bubble up to add a warning on top-most collapsed block. + var parent = this.getSurroundParent(); + var collapsedParent = null; + while (parent) { + if (parent.isCollapsed()) { + collapsedParent = parent; + } + parent = parent.getSurroundParent(); + } + if (collapsedParent) { + collapsedParent.setWarningText(Blockly.Msg['COLLAPSED_WARNINGS_WARNING'], + Blockly.BlockSvg.COLLAPSED_WARNING_ID); + } + + if (!this.warning) { + this.warning = new Blockly.Warning(this); + changedState = true; + } + this.warning.setText(/** @type {string} */ (text), id); + } else { + // Dispose all warnings if no ID is given. + if (this.warning && !id) { + this.warning.dispose(); + changedState = true; + } else if (this.warning) { + var oldText = this.warning.getText(); + this.warning.setText('', id); + var newText = this.warning.getText(); + if (!newText) { + this.warning.dispose(); + } + changedState = oldText != newText; + } + } + if (changedState && this.rendered) { + this.render(); + // Adding or removing a warning icon will cause the block to change shape. + this.bumpNeighbours(); + } +}; + +/** + * Give this block a mutator dialog. + * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. + */ +Blockly.BlockSvg.prototype.setMutator = function(mutator) { + if (this.mutator && this.mutator !== mutator) { + this.mutator.dispose(); + } + if (mutator) { + mutator.setBlock(this); + this.mutator = mutator; + mutator.createIcon(); + } + if (this.rendered) { + this.render(); + // Adding or removing a mutator icon will cause the block to change shape. + this.bumpNeighbours(); + } +}; + +/** + * Set whether the block is enabled or not. + * @param {boolean} enabled True if enabled. + */ +Blockly.BlockSvg.prototype.setEnabled = function(enabled) { + if (this.isEnabled() != enabled) { + Blockly.BlockSvg.superClass_.setEnabled.call(this, enabled); + if (this.rendered && !this.getInheritedDisabled()) { + this.updateDisabled(); + } + } +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.setHighlighted = function(highlighted) { + if (!this.rendered) { + return; + } + this.pathObject.updateHighlighted(highlighted); +}; + +/** + * Select this block. Highlight it visually. + */ +Blockly.BlockSvg.prototype.addSelect = function() { + this.pathObject.updateSelected(true); +}; + +/** + * Unselect this block. Remove its highlighting. + */ +Blockly.BlockSvg.prototype.removeSelect = function() { + this.pathObject.updateSelected(false); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.setDeleteStyle = function(enable) { + this.pathObject.updateDraggingDelete(enable); +}; + + +// Overrides of functions on Blockly.Block that take into account whether the +// block has been rendered. +/** + * Get the colour of a block. + * @return {string} #RRGGBB string. + */ +Blockly.BlockSvg.prototype.getColour = function() { + return this.style.colourPrimary; +}; + +/** + * Change the colour of a block. + * @param {number|string} colour HSV hue value, or #RRGGBB string. + */ +Blockly.BlockSvg.prototype.setColour = function(colour) { + Blockly.BlockSvg.superClass_.setColour.call(this, colour); + var styleObj = this.workspace.getRenderer().getConstants() + .getBlockStyleForColour(this.colour_); + + this.pathObject.setStyle(styleObj.style); + this.style = styleObj.style; + this.styleName_ = styleObj.name; + + this.applyColour(); +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.setStyle = function(blockStyleName) { + var blockStyle = this.workspace.getRenderer() + .getConstants().getBlockStyle(blockStyleName); + this.styleName_ = blockStyleName; + + if (blockStyle) { + this.hat = blockStyle.hat; + this.pathObject.setStyle(blockStyle); + // Set colour to match Block. + this.colour_ = blockStyle.colourPrimary; + this.style = blockStyle; + + this.applyColour(); + } else { + throw Error('Invalid style name: ' + blockStyleName); + } +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.bringToFront = function() { + var block = this; + do { + var root = block.getSvgRoot(); + var parent = root.parentNode; + var childNodes = parent.childNodes; + // Avoid moving the block if it's already at the bottom. + if (childNodes[childNodes.length - 1] !== root) { + parent.appendChild(root); + } + block = block.getParent(); + } while (block); +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.setPreviousStatement = function(newBoolean, + opt_check) { + Blockly.BlockSvg.superClass_.setPreviousStatement.call(this, newBoolean, + opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours(); + } +}; + +/** + * 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. + */ +Blockly.BlockSvg.prototype.setNextStatement = function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setNextStatement.call(this, newBoolean, + opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours(); + } +}; + +/** + * 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). + */ +Blockly.BlockSvg.prototype.setOutput = function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setOutput.call(this, newBoolean, opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours(); + } +}; + +/** + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. + */ +Blockly.BlockSvg.prototype.setInputsInline = function(newBoolean) { + Blockly.BlockSvg.superClass_.setInputsInline.call(this, newBoolean); + + if (this.rendered) { + this.render(); + this.bumpNeighbours(); + } +}; + +/** + * 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. + * @return {boolean} True if operation succeeds, false if input is not present and opt_quiet is true + * @throws {Error} if the input is not present and + * opt_quiet is not true. + */ +Blockly.BlockSvg.prototype.removeInput = function(name, opt_quiet) { + var removed = Blockly.BlockSvg.superClass_.removeInput.call(this, name, opt_quiet); + + if (this.rendered) { + this.render(); + // Removing an input will cause the block to change shape. + this.bumpNeighbours(); + } + + return removed; +}; + +/** + * Move a numbered input to a different location on this block. + * @param {number} inputIndex Index of the input to move. + * @param {number} refIndex Index of input that should be after the moved input. + */ +Blockly.BlockSvg.prototype.moveNumberedInputBefore = function( + inputIndex, refIndex) { + Blockly.BlockSvg.superClass_.moveNumberedInputBefore.call(this, inputIndex, + refIndex); + + if (this.rendered) { + this.render(); + // Moving an input will cause the block to change shape. + this.bumpNeighbours(); + } +}; + +/** + * Add a value input, statement input or local variable to this block. + * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or + * Blockly.DUMMY_INPUT. + * @param {string} name Language-neutral identifier which may used to find this + * input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. + * @private + */ +Blockly.BlockSvg.prototype.appendInput_ = function(type, name) { + var input = Blockly.BlockSvg.superClass_.appendInput_.call(this, type, name); + + if (this.rendered) { + this.render(); + // Adding an input will cause the block to change shape. + this.bumpNeighbours(); + } + return input; +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.setConnectionTracking = function(track) { + if (this.previousConnection) { + this.previousConnection.setTracking(track); + } + if (this.outputConnection) { + this.outputConnection.setTracking(track); + } + if (this.nextConnection) { + this.nextConnection.setTracking(track); + var child = this.nextConnection.targetBlock(); + if (child) { + child.setConnectionTracking(track); + } + } + + if (this.collapsed_) { + // When track is true, we don't want to start tracking collapsed + // connections. When track is false, we're already not tracking + // collapsed connections, so no need to update. + return; + } + + for (var i = 0; i < this.inputList.length; i++) { + var conn = this.inputList[i].connection; + if (conn) { + conn.setTracking(track); + + // Pass tracking on down the chain. + var block = conn.targetBlock(); + if (block) { + block.setConnectionTracking(track); + } + } + } +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.getConnections_ = function(all) { + var myConnections = []; + if (all || this.rendered) { + if (this.outputConnection) { + myConnections.push(this.outputConnection); + } + if (this.previousConnection) { + myConnections.push(this.previousConnection); + } + if (this.nextConnection) { + myConnections.push(this.nextConnection); + } + if (all || !this.collapsed_) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + if (input.connection) { + myConnections.push(input.connection); + } + } + } + } + return myConnections; +}; + +/** + * Walks down a stack of blocks and finds the last next connection on the stack. + * @return {Blockly.RenderedConnection} The last next connection on the stack, + * or null. + * @package + * @override + */ +Blockly.BlockSvg.prototype.lastConnectionInStack = function() { + return /** @type {Blockly.RenderedConnection} */ ( + Blockly.BlockSvg.superClass_.lastConnectionInStack.call(this)); +}; + +/** + * 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.RenderedConnection} The matching connection on this block, + * or null. + * @package + * @override + */ +Blockly.BlockSvg.prototype.getMatchingConnection = function(otherBlock, conn) { + return /** @type {Blockly.RenderedConnection} */ ( + Blockly.BlockSvg.superClass_.getMatchingConnection.call(this, + otherBlock, conn)); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.makeConnection_ = function(type) { + return new Blockly.RenderedConnection(this, type); +}; + +/** + * Bump unconnected blocks out of alignment. Two blocks which aren't actually + * connected should not coincidentally line up on screen. + */ +Blockly.BlockSvg.prototype.bumpNeighbours = function() { + if (!this.workspace) { + return; // Deleted block. + } + if (this.workspace.isDragging()) { + return; // Don't bump blocks during a drag. + } + var rootBlock = this.getRootBlock(); + if (rootBlock.isInFlyout) { + return; // Don't move blocks around in a flyout. + } + // Loop through every connection on this block. + var myConnections = this.getConnections_(false); + for (var i = 0, connection; (connection = myConnections[i]); i++) { + + // Spider down from this block bumping all sub-blocks. + if (connection.isConnected() && connection.isSuperior()) { + connection.targetBlock().bumpNeighbours(); + } + + var neighbours = connection.neighbours(Blockly.SNAP_RADIUS); + for (var j = 0, otherConnection; (otherConnection = neighbours[j]); j++) { + + // If both connections are connected, that's probably fine. But if + // either one of them is unconnected, then there could be confusion. + if (!connection.isConnected() || !otherConnection.isConnected()) { + // Only bump blocks if they are from different tree structures. + if (otherConnection.getSourceBlock().getRootBlock() != rootBlock) { + + // Always bump the inferior block. + if (connection.isSuperior()) { + otherConnection.bumpAwayFrom(connection); + } else { + connection.bumpAwayFrom(otherConnection); + } + } + } + } + } +}; + +/** + * Schedule snapping to grid and bumping neighbours to occur after a brief + * delay. + * @package + */ +Blockly.BlockSvg.prototype.scheduleSnapAndBump = function() { + var block = this; + // Ensure that any snap and bump are part of this move's event group. + var group = Blockly.Events.getGroup(); + + setTimeout(function() { + Blockly.Events.setGroup(group); + block.snapToGrid(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY / 2); + + setTimeout(function() { + Blockly.Events.setGroup(group); + block.bumpNeighbours(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.positionNearConnection = function(sourceConnection, + targetConnection) { + // We only need to position the new block if it's before the existing one, + // otherwise its position is set by the previous block. + if (sourceConnection.type == Blockly.NEXT_STATEMENT || + sourceConnection.type == Blockly.INPUT_VALUE) { + var dx = targetConnection.x - sourceConnection.x; + var dy = targetConnection.y - sourceConnection.y; + + this.moveBy(dx, dy); + } +}; + +/** + * Return the parent block or null if this block is at the top level. + * @return {Blockly.BlockSvg} The block that holds the current block. + * @override + */ +Blockly.BlockSvg.prototype.getParent = function() { + return /** @type {!Blockly.BlockSvg} */ ( + Blockly.BlockSvg.superClass_.getParent.call(this)); +}; + +/** + * Return the top-most block in this block's tree. + * This will return itself if this block is at the top level. + * @return {!Blockly.BlockSvg} The root block. + * @override + */ +Blockly.BlockSvg.prototype.getRootBlock = function() { + return /** @type {!Blockly.BlockSvg} */ ( + Blockly.BlockSvg.superClass_.getRootBlock.call(this)); +}; + +/** + * Lays out and reflows a block based on its contents and settings. + * @param {boolean=} opt_bubble If false, just render this block. + * If true, also render block's parent, grandparent, etc. Defaults to true. + */ +Blockly.BlockSvg.prototype.render = function(opt_bubble) { + if (this.renderIsInProgress_) { + return; // Don't allow recursive renders. + } + this.renderIsInProgress_ = true; + try { + this.rendered = true; + Blockly.utils.dom.startTextWidthCache(); + + if (this.isCollapsed()) { + this.updateCollapsed_(); + } + this.workspace.getRenderer().render(this); + this.updateConnectionLocations_(); + + if (opt_bubble !== false) { + var parentBlock = this.getParent(); + if (parentBlock) { + parentBlock.render(true); + } else { + // Top-most block. Fire an event to allow scrollbars to resize. + this.workspace.resizeContents(); + } + } + + Blockly.utils.dom.stopTextWidthCache(); + this.updateMarkers_(); + } finally { + this.renderIsInProgress_ = false; + } +}; + +/** + * Redraw any attached marker or cursor svgs if needed. + * @protected + */ +Blockly.BlockSvg.prototype.updateMarkers_ = function() { + if (this.workspace.keyboardAccessibilityMode && this.pathObject.cursorSvg) { + this.workspace.getCursor().draw(); + } + if (this.workspace.keyboardAccessibilityMode && this.pathObject.markerSvg) { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).draw(); + } +}; + +/** + * Update all of the connections on this block with the new locations calculated + * during rendering. Also move all of the connected blocks based on the new + * connection locations. + * @private + */ +Blockly.BlockSvg.prototype.updateConnectionLocations_ = function() { + var blockTL = this.getRelativeToSurfaceXY(); + // Don't tighten previous or output connections because they are inferior + // connections. + if (this.previousConnection) { + this.previousConnection.moveToOffset(blockTL); + } + if (this.outputConnection) { + this.outputConnection.moveToOffset(blockTL); + } + + for (var i = 0; i < this.inputList.length; i++) { + var conn = this.inputList[i].connection; + if (conn) { + conn.moveToOffset(blockTL); + if (conn.isConnected()) { + conn.tighten(); + } + } + } + + if (this.nextConnection) { + this.nextConnection.moveToOffset(blockTL); + if (this.nextConnection.isConnected()) { + this.nextConnection.tighten(); + } + } +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.setCursorSvg = function(cursorSvg) { + this.pathObject.setCursorSvg(cursorSvg); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.setMarkerSvg = function(markerSvg) { + this.pathObject.setMarkerSvg(markerSvg); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.getHeightWidth = function() { + var height = this.height; + var width = this.width; + // Recursively add size of subsequent blocks. + var nextBlock = this.getNextBlock(); + if (nextBlock) { + var nextHeightWidth = nextBlock.getHeightWidth(); + var workspace = /** @type {!Blockly.WorkspaceSvg} */ (this.workspace); + var tabHeight = workspace.getRenderer().getConstants().NOTCH_HEIGHT; + height += nextHeightWidth.height - tabHeight; + width = Math.max(width, nextHeightWidth.width); + } + return {height: height, width: width}; +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.fadeForReplacement = function(add) { + this.pathObject.updateReplacementFade(add); +}; + +/** + * 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 + */ +Blockly.BlockSvg.prototype.highlightShapeForInput = function(conn, add) { + this.pathObject.updateShapeForInputHighlight(conn, add); +}; diff --git a/static/js/dist/core/blockly.js b/static/js/dist/core/blockly.js new file mode 100644 index 0000000..acf235e --- /dev/null +++ b/static/js/dist/core/blockly.js @@ -0,0 +1,629 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Core JavaScript library for Blockly. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * The top level namespace used to access the Blockly library. + * @namespace Blockly + */ +goog.provide('Blockly'); + +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Ui'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.inject'); +goog.require('Blockly.Procedures'); +goog.require('Blockly.ShortcutRegistry'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.Touch'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.colour'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.Variables'); +goog.require('Blockly.WidgetDiv'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.Xml'); + + +/** + * 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} + */ +Blockly.VERSION = 'uncompiled'; + +/** + * The main workspace most recently used. + * Set by Blockly.WorkspaceSvg.prototype.markFocused + * @type {Blockly.Workspace} + */ +Blockly.mainWorkspace = null; + +/** + * Currently selected block. + * @type {?Blockly.ICopyable} + */ +Blockly.selected = null; + +/** + * All of the connections on blocks that are currently being dragged. + * @type {!Array.} + * @package + */ +Blockly.draggingConnections = []; + +/** + * Contents of the local clipboard. + * @type {Element} + * @private + */ +Blockly.clipboardXml_ = null; + +/** + * Source of the local clipboard. + * @type {Blockly.WorkspaceSvg} + * @private + */ +Blockly.clipboardSource_ = null; + +/** + * Map of types to type counts for the clipboard object and descendants. + * @type {Object} + * @private + */ +Blockly.clipboardTypeCounts_ = null; + +/** + * Cached value for whether 3D is supported. + * @type {?boolean} + * @private + */ +Blockly.cache3dSupported_ = null; + +/** + * Container element to render the WidgetDiv, DropDownDiv and Tooltip. + * @type {?Element} + * @package + */ +Blockly.parentContainer = null; + +/** + * Blockly opaque event data used to unbind events when using + * `Blockly.bindEvent_` and `Blockly.bindEventWithChecks_`. + * @typedef {!Array.} + */ +Blockly.EventData; + +/** + * Returns the dimensions of the specified SVG image. + * @param {!SVGElement} svg SVG image. + * @return {!Blockly.utils.Size} Contains width and height properties. + */ +Blockly.svgSize = function(svg) { + svg = /** @type {?} */ (svg); + return new Blockly.utils.Size(svg.cachedWidth_, svg.cachedHeight_); +}; + +/** + * Size the workspace when the contents change. This also updates + * scrollbars accordingly. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to resize. + */ +Blockly.resizeSvgContents = function(workspace) { + workspace.resizeContents(); +}; + +/** + * 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. + */ +Blockly.svgResize = function(workspace) { + var mainWorkspace = workspace; + while (mainWorkspace.options.parentWorkspace) { + mainWorkspace = mainWorkspace.options.parentWorkspace; + } + var svg = mainWorkspace.getParentSvg(); + var div = svg.parentNode; + if (!div) { + // Workspace deleted, or something. + return; + } + var width = div.offsetWidth; + var height = div.offsetHeight; + if (svg.cachedWidth_ != width) { + svg.setAttribute('width', width + 'px'); + svg.cachedWidth_ = width; + } + if (svg.cachedHeight_ != height) { + svg.setAttribute('height', height + 'px'); + svg.cachedHeight_ = height; + } + mainWorkspace.resize(); +}; + +/** + * Handle a key-down on SVG drawing surface. Does nothing if the main workspace + * is not visible. + * @param {!KeyboardEvent} e Key down event. + * @package + */ +// TODO (https://github.com/google/blockly/issues/1998) handle cases where there +// are multiple workspaces and non-main workspaces are able to accept input. +Blockly.onKeyDown = function(e) { + var mainWorkspace = Blockly.mainWorkspace; + if (!mainWorkspace) { + return; + } + + if (Blockly.utils.isTargetInput(e) || + (mainWorkspace.rendered && !mainWorkspace.isVisible())) { + // When focused on an HTML text input widget, don't trap any keys. + // Ignore keypresses on rendered workspaces that have been explicitly + // hidden. + return; + } + Blockly.ShortcutRegistry.registry.onKeyDown(mainWorkspace, e); +}; + +/** + * Delete the given block. + * @param {!Blockly.BlockSvg} selected The block to delete. + * @package + */ +Blockly.deleteBlock = function(selected) { + if (!selected.workspace.isFlyout) { + Blockly.Events.setGroup(true); + Blockly.hideChaff(); + selected.dispose(/* heal */ true, true); + Blockly.Events.setGroup(false); + } +}; + +/** + * Copy a block or workspace comment onto the local clipboard. + * @param {!Blockly.ICopyable} toCopy Block or Workspace Comment to be copied. + * @package + */ +Blockly.copy = function(toCopy) { + var data = toCopy.toCopyData(); + if (data) { + Blockly.clipboardXml_ = data.xml; + Blockly.clipboardSource_ = data.source; + Blockly.clipboardTypeCounts_ = data.typeCounts; + } +}; + +/** + * Paste a block or workspace comment on to the main workspace. + * @return {boolean} True if the paste was successful, false otherwise. + * @package + */ +Blockly.paste = function() { + if (!Blockly.clipboardXml_) { + return false; + } + // Pasting always pastes to the main workspace, even if the copy + // started in a flyout workspace. + var workspace = Blockly.clipboardSource_; + if (workspace.isFlyout) { + workspace = workspace.targetWorkspace; + } + if (Blockly.clipboardTypeCounts_ && + workspace.isCapacityAvailable(Blockly.clipboardTypeCounts_)) { + Blockly.Events.setGroup(true); + workspace.paste(Blockly.clipboardXml_); + Blockly.Events.setGroup(false); + return true; + } + return false; +}; + +/** + * Duplicate this block and its children, or a workspace comment. + * @param {!Blockly.ICopyable} toDuplicate Block or Workspace Comment to be + * copied. + * @package + */ +Blockly.duplicate = function(toDuplicate) { + // Save the clipboard. + var clipboardXml = Blockly.clipboardXml_; + var clipboardSource = Blockly.clipboardSource_; + + // Create a duplicate via a copy/paste operation. + Blockly.copy(toDuplicate); + toDuplicate.workspace.paste(Blockly.clipboardXml_); + + // Restore the clipboard. + Blockly.clipboardXml_ = clipboardXml; + Blockly.clipboardSource_ = clipboardSource; +}; + +/** + * Cancel the native context menu, unless the focus is on an HTML input widget. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.onContextMenu_ = function(e) { + if (!Blockly.utils.isTargetInput(e)) { + // When focused on an HTML text input widget, don't cancel the context menu. + e.preventDefault(); + } +}; + +/** + * Close tooltips, context menus, dropdown selections, etc. + * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. + */ +Blockly.hideChaff = function(opt_allowToolbox) { + Blockly.Tooltip.hide(); + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); + if (!opt_allowToolbox) { + var workspace = Blockly.getMainWorkspace(); + // For now the trashcan flyout always autocloses because it overlays the + // trashcan UI (no trashcan to click to close it). + if (workspace.trashcan && + workspace.trashcan.flyout) { + workspace.trashcan.closeFlyout(); + } + var toolbox = workspace.getToolbox(); + if (toolbox && + toolbox.getFlyout() && + toolbox.getFlyout().autoClose) { + toolbox.clearSelection(); + } + } +}; + +/** + * 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. + */ +Blockly.getMainWorkspace = function() { + return /** @type {!Blockly.Workspace} */ (Blockly.mainWorkspace); +}; + +/** + * 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. + */ +Blockly.alert = function(message, opt_callback) { + alert(message); + if (opt_callback) { + opt_callback(); + } +}; + +/** + * 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. + */ +Blockly.confirm = function(message, callback) { + callback(confirm(message)); +}; + +/** + * 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. + */ +Blockly.prompt = function(message, defaultValue, callback) { + callback(prompt(message, defaultValue)); +}; + +/** + * Helper function for defining a block from JSON. The resulting function has + * the correct value of jsonDef at the point in code where jsonInit is called. + * @param {!Object} jsonDef The JSON definition of a block. + * @return {function()} A function that calls jsonInit with the correct value + * of jsonDef. + * @private + */ +Blockly.jsonInitFactory_ = function(jsonDef) { + return function() { + this.jsonInit(jsonDef); + }; +}; + +/** + * 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. + */ +Blockly.defineBlocksWithJsonArray = function(jsonArray) { + for (var i = 0; i < jsonArray.length; i++) { + var elem = jsonArray[i]; + if (!elem) { + console.warn( + 'Block definition #' + i + ' in JSON array is ' + elem + '. ' + + 'Skipping.'); + } else { + var typename = elem.type; + if (typename == null || typename === '') { + console.warn( + 'Block definition #' + i + + ' in JSON array is missing a type attribute. Skipping.'); + } else { + if (Blockly.Blocks[typename]) { + console.warn( + 'Block definition #' + i + ' in JSON array' + + ' overwrites prior definition of "' + typename + '".'); + } + Blockly.Blocks[typename] = { + init: Blockly.jsonInitFactory_(elem) + }; + } + } + } +}; + +/** + * 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_. + */ +Blockly.bindEventWithChecks_ = function(node, name, thisObject, func, + opt_noCaptureIdentifier, opt_noPreventDefault) { + var handled = false; + var wrapFunc = function(e) { + var captureIdentifier = !opt_noCaptureIdentifier; + // Handle each touch point separately. If the event was a mouse event, this + // will hand back an array with one element, which we're fine handling. + var events = Blockly.Touch.splitEventByTouches(e); + for (var i = 0, event; (event = events[i]); i++) { + if (captureIdentifier && !Blockly.Touch.shouldHandleEvent(event)) { + continue; + } + Blockly.Touch.setClientFromTouch(event); + if (thisObject) { + func.call(thisObject, event); + } else { + func(event); + } + handled = true; + } + }; + + var bindData = []; + if (Blockly.utils.global['PointerEvent'] && + (name in Blockly.Touch.TOUCH_MAP)) { + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, wrapFunc, false); + bindData.push([node, type, wrapFunc]); + } + } else { + node.addEventListener(name, wrapFunc, false); + bindData.push([node, name, wrapFunc]); + + // Add equivalent touch event. + if (name in Blockly.Touch.TOUCH_MAP) { + var touchWrapFunc = function(e) { + wrapFunc(e); + // Calling preventDefault stops the browser from scrolling/zooming the + // page. + var preventDef = !opt_noPreventDefault; + if (handled && preventDef) { + e.preventDefault(); + } + }; + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, touchWrapFunc, false); + bindData.push([node, type, touchWrapFunc]); + } + } + } + return bindData; +}; + + +/** + * 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_. + */ +Blockly.bindEvent_ = function(node, name, thisObject, func) { + var wrapFunc = function(e) { + if (thisObject) { + func.call(thisObject, e); + } else { + func(e); + } + }; + + var bindData = []; + if (Blockly.utils.global['PointerEvent'] && + (name in Blockly.Touch.TOUCH_MAP)) { + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, wrapFunc, false); + bindData.push([node, type, wrapFunc]); + } + } else { + node.addEventListener(name, wrapFunc, false); + bindData.push([node, name, wrapFunc]); + + // Add equivalent touch event. + if (name in Blockly.Touch.TOUCH_MAP) { + var touchWrapFunc = function(e) { + // Punt on multitouch events. + if (e.changedTouches && e.changedTouches.length == 1) { + // Map the touch event's properties to the event. + var touchPoint = e.changedTouches[0]; + e.clientX = touchPoint.clientX; + e.clientY = touchPoint.clientY; + } + wrapFunc(e); + + // Stop the browser from scrolling/zooming the page. + e.preventDefault(); + }; + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, touchWrapFunc, false); + bindData.push([node, type, touchWrapFunc]); + } + } + } + return bindData; +}; + +/** + * 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. + */ +Blockly.unbindEvent_ = function(bindData) { + while (bindData.length) { + var bindDatum = bindData.pop(); + var node = bindDatum[0]; + var name = bindDatum[1]; + var func = bindDatum[2]; + node.removeEventListener(name, func, false); + } + return func; +}; + +/** + * Is the given string a number (includes negative and decimals). + * @param {string} str Input string. + * @return {boolean} True if number, false otherwise. + */ +Blockly.isNumber = function(str) { + return /^\s*-?\d+(\.\d+)?\s*$/.test(str); +}; + +/** + * Convert a hue (HSV model) into an RGB hex triplet. + * @param {number} hue Hue on a colour wheel (0-360). + * @return {string} RGB code, e.g. '#5ba65b'. + */ +Blockly.hueToHex = function(hue) { + return Blockly.utils.colour.hsvToHex(hue, Blockly.HSV_SATURATION, + Blockly.HSV_VALUE * 255); +}; + +/** + * 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 + */ +Blockly.checkBlockColourConstants = function() { + Blockly.checkBlockColourConstant_( + 'LOGIC_HUE', ['Blocks', 'logic', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'LOGIC_HUE', ['Constants', 'Logic', 'HUE'], 210); + Blockly.checkBlockColourConstant_( + 'LOOPS_HUE', ['Blocks', 'loops', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'LOOPS_HUE', ['Constants', 'Loops', 'HUE'], 120); + Blockly.checkBlockColourConstant_( + 'MATH_HUE', ['Blocks', 'math', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'MATH_HUE', ['Constants', 'Math', 'HUE'], 230); + Blockly.checkBlockColourConstant_( + 'TEXTS_HUE', ['Blocks', 'texts', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'TEXTS_HUE', ['Constants', 'Text', 'HUE'], 160); + Blockly.checkBlockColourConstant_( + 'LISTS_HUE', ['Blocks', 'lists', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'LISTS_HUE', ['Constants', 'Lists', 'HUE'], 260); + Blockly.checkBlockColourConstant_( + 'COLOUR_HUE', ['Blocks', 'colour', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'COLOUR_HUE', ['Constants', 'Colour', 'HUE'], 20); + Blockly.checkBlockColourConstant_( + 'VARIABLES_HUE', ['Blocks', 'variables', 'HUE'], undefined); + Blockly.checkBlockColourConstant_( + 'VARIABLES_HUE', ['Constants', 'Variables', 'HUE'], 330); + // Blockly.Blocks.variables_dynamic.HUE never existed. + Blockly.checkBlockColourConstant_( + 'VARIABLES_DYNAMIC_HUE', ['Constants', 'VariablesDynamic', 'HUE'], 310); + Blockly.checkBlockColourConstant_( + 'PROCEDURES_HUE', ['Blocks', 'procedures', 'HUE'], undefined); + // Blockly.Constants.Procedures.HUE never existed. +}; + +/** + * Checks for a constant in the Blockly namespace, verifying it is undefined or + * has the old/original value. Prints a warning if this is not true. + * @param {string} msgName The Msg constant identifier. + * @param {Array.} blocklyNamePath The name parts of the tested + * constant. + * @param {number|undefined} expectedValue The expected value of the constant. + * @private + */ +Blockly.checkBlockColourConstant_ = function( + msgName, blocklyNamePath, expectedValue) { + var namePath = 'Blockly'; + var value = Blockly; + for (var i = 0; i < blocklyNamePath.length; ++i) { + namePath += '.' + blocklyNamePath[i]; + if (value) { + value = value[blocklyNamePath[i]]; + } + } + + if (value && value !== expectedValue) { + var warningPattern = (expectedValue === undefined) ? + '%1 has been removed. Use Blockly.Msg["%2"].' : + '%1 is deprecated and unused. Override Blockly.Msg["%2"].'; + var warning = warningPattern.replace('%1', namePath).replace('%2', msgName); + console.warn(warning); + } +}; + +/** + * Set the parent container. This is the container element that the WidgetDiv, + * DropDownDiv, and Tooltip are rendered into the first time `Blockly.inject` + * is called. + * This method is a NOP if called after the first ``Blockly.inject``. + * @param {!Element} container The container element. + */ +Blockly.setParentContainer = function(container) { + Blockly.parentContainer = container; +}; diff --git a/static/js/dist/core/blocks.js b/static/js/dist/core/blocks.js new file mode 100644 index 0000000..c39f81c --- /dev/null +++ b/static/js/dist/core/blocks.js @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2013 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A mapping of block type names to block prototype objects. + * @author spertus@google.com (Ellen Spertus) + */ +'use strict'; + +/** + * A mapping of block type names to block prototype objects. + * @name Blockly.Blocks + */ +goog.provide('Blockly.Blocks'); + +/** + * A mapping of block type names to block prototype objects. + * @type {!Object.} + */ +Blockly.Blocks = Object.create(null); diff --git a/static/js/dist/core/bubble.js b/static/js/dist/core/bubble.js new file mode 100644 index 0000000..0cfd785 --- /dev/null +++ b/static/js/dist/core/bubble.js @@ -0,0 +1,934 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object representing a UI bubble. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Bubble'); + +goog.require('Blockly.Scrollbar'); +goog.require('Blockly.Touch'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.math'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.Workspace'); + +goog.requireType('Blockly.IBubble'); +goog.requireType('Blockly.utils.Metrics'); + + +/** + * 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. + * @implements {Blockly.IBubble} + * @constructor + */ +Blockly.Bubble = function( + workspace, content, shape, anchorXY, bubbleWidth, bubbleHeight) { + this.workspace_ = workspace; + this.content_ = content; + this.shape_ = shape; + + /** + * Method to call on resize of bubble. + * @type {?function()} + * @private + */ + this.resizeCallback_ = null; + + /** + * Method to call on move of bubble. + * @type {?function()} + * @private + */ + this.moveCallback_ = null; + + /** + * Mouse down on bubbleBack_ event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseDownBubbleWrapper_ = null; + + /** + * Mouse down on resizeGroup_ event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseDownResizeWrapper_ = null; + + /** + * Describes whether this bubble has been disposed of (nodes and event + * listeners removed from the page) or not. + * @type {boolean} + * @package + */ + this.disposed = false; + + var angle = Blockly.Bubble.ARROW_ANGLE; + if (this.workspace_.RTL) { + angle = -angle; + } + this.arrow_radians_ = Blockly.utils.math.toRadians(angle); + + var canvas = workspace.getBubbleCanvas(); + canvas.appendChild(this.createDom_(content, !!(bubbleWidth && bubbleHeight))); + + this.setAnchorLocation(anchorXY); + if (!bubbleWidth || !bubbleHeight) { + var bBox = /** @type {SVGLocatable} */ (this.content_).getBBox(); + bubbleWidth = bBox.width + 2 * Blockly.Bubble.BORDER_WIDTH; + bubbleHeight = bBox.height + 2 * Blockly.Bubble.BORDER_WIDTH; + } + this.setBubbleSize(bubbleWidth, bubbleHeight); + + // Render the bubble. + this.positionBubble_(); + this.renderArrow_(); + this.rendered_ = true; +}; + +/** + * Width of the border around the bubble. + */ +Blockly.Bubble.BORDER_WIDTH = 6; + +/** + * Determines the thickness of the base of the arrow in relation to the size + * of the bubble. Higher numbers result in thinner arrows. + */ +Blockly.Bubble.ARROW_THICKNESS = 5; + +/** + * The number of degrees that the arrow bends counter-clockwise. + */ +Blockly.Bubble.ARROW_ANGLE = 20; + +/** + * The sharpness of the arrow's bend. Higher numbers result in smoother arrows. + */ +Blockly.Bubble.ARROW_BEND = 4; + +/** + * Distance between arrow point and anchor point. + */ +Blockly.Bubble.ANCHOR_RADIUS = 8; + +/** + * Mouse up event data. + * @type {?Blockly.EventData} + * @private + */ +Blockly.Bubble.onMouseUpWrapper_ = null; + +/** + * Mouse move event data. + * @type {?Blockly.EventData} + * @private + */ +Blockly.Bubble.onMouseMoveWrapper_ = null; + +/** + * Stop binding to the global mouseup and mousemove events. + * @private + */ +Blockly.Bubble.unbindDragEvents_ = function() { + if (Blockly.Bubble.onMouseUpWrapper_) { + Blockly.unbindEvent_(Blockly.Bubble.onMouseUpWrapper_); + Blockly.Bubble.onMouseUpWrapper_ = null; + } + if (Blockly.Bubble.onMouseMoveWrapper_) { + Blockly.unbindEvent_(Blockly.Bubble.onMouseMoveWrapper_); + Blockly.Bubble.onMouseMoveWrapper_ = null; + } +}; + +/** + * Handle a mouse-up event while dragging a bubble's border or resize handle. + * @param {!Event} _e Mouse up event. + * @private + */ +Blockly.Bubble.bubbleMouseUp_ = function(_e) { + Blockly.Touch.clearTouchIdentifier(); + Blockly.Bubble.unbindDragEvents_(); +}; + +/** + * Flag to stop incremental rendering during construction. + * @private + */ +Blockly.Bubble.prototype.rendered_ = false; + +/** + * Absolute coordinate of anchor point, in workspace coordinates. + * @type {Blockly.utils.Coordinate} + * @private + */ +Blockly.Bubble.prototype.anchorXY_ = null; + +/** + * Relative X coordinate of bubble with respect to the anchor's centre, + * in workspace units. + * In RTL mode the initial value is negated. + * @private + */ +Blockly.Bubble.prototype.relativeLeft_ = 0; + +/** + * Relative Y coordinate of bubble with respect to the anchor's centre, in + * workspace units. + * @private + */ +Blockly.Bubble.prototype.relativeTop_ = 0; + +/** + * Width of bubble, in workspace units. + * @private + */ +Blockly.Bubble.prototype.width_ = 0; + +/** + * Height of bubble, in workspace units. + * @private + */ +Blockly.Bubble.prototype.height_ = 0; + +/** + * Automatically position and reposition the bubble. + * @private + */ +Blockly.Bubble.prototype.autoLayout_ = true; + +/** + * Create the bubble's DOM. + * @param {!Element} content SVG content for the bubble. + * @param {boolean} hasResize Add diagonal resize gripper if true. + * @return {!SVGElement} The bubble's SVG group. + * @private + */ +Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { + /* Create the bubble. Here's the markup that will be generated: + + + + + + + + + + + [...content goes here...] + + */ + this.bubbleGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, {}, null); + var filter = { + 'filter': 'url(#' + + this.workspace_.getRenderer().getConstants().embossFilterId + ')' + }; + if (Blockly.utils.userAgent.JAVA_FX) { + // Multiple reports that JavaFX can't handle filters. + // https://github.com/google/blockly/issues/99 + filter = {}; + } + var bubbleEmboss = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, filter, this.bubbleGroup_); + this.bubbleArrow_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.PATH, {}, bubbleEmboss); + this.bubbleBack_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, { + 'class': 'blocklyDraggable', + 'x': 0, + 'y': 0, + 'rx': Blockly.Bubble.BORDER_WIDTH, + 'ry': Blockly.Bubble.BORDER_WIDTH + }, + bubbleEmboss); + if (hasResize) { + this.resizeGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, + {'class': this.workspace_.RTL ? 'blocklyResizeSW' : 'blocklyResizeSE'}, + this.bubbleGroup_); + var resizeSize = 2 * Blockly.Bubble.BORDER_WIDTH; + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.POLYGON, + {'points': '0,x x,x x,0'.replace(/x/g, resizeSize.toString())}, + this.resizeGroup_); + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, { + 'class': 'blocklyResizeLine', + 'x1': resizeSize / 3, + 'y1': resizeSize - 1, + 'x2': resizeSize - 1, + 'y2': resizeSize / 3 + }, + this.resizeGroup_); + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, { + 'class': 'blocklyResizeLine', + 'x1': resizeSize * 2 / 3, + 'y1': resizeSize - 1, + 'x2': resizeSize - 1, + 'y2': resizeSize * 2 / 3 + }, + this.resizeGroup_); + } else { + this.resizeGroup_ = null; + } + + if (!this.workspace_.options.readOnly) { + this.onMouseDownBubbleWrapper_ = Blockly.bindEventWithChecks_( + this.bubbleBack_, 'mousedown', this, this.bubbleMouseDown_); + if (this.resizeGroup_) { + this.onMouseDownResizeWrapper_ = Blockly.bindEventWithChecks_( + this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); + } + } + this.bubbleGroup_.appendChild(content); + return this.bubbleGroup_; +}; + +/** + * Return the root node of the bubble's SVG group. + * @return {!SVGElement} The root SVG node of the bubble's group. + */ +Blockly.Bubble.prototype.getSvgRoot = function() { + return this.bubbleGroup_; +}; + +/** + * Expose the block's ID on the bubble's top-level SVG group. + * @param {string} id ID of block. + */ +Blockly.Bubble.prototype.setSvgId = function(id) { + if (this.bubbleGroup_.dataset) { + this.bubbleGroup_.dataset['blockId'] = id; + } +}; + +/** + * Handle a mouse-down on bubble's border. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.Bubble.prototype.bubbleMouseDown_ = function(e) { + var gesture = this.workspace_.getGesture(e); + if (gesture) { + gesture.handleBubbleStart(e, this); + } +}; + +/** + * Show the context menu for this bubble. + * @param {!Event} _e Mouse event. + * @package + */ +Blockly.Bubble.prototype.showContextMenu = function(_e) { + // NOP on bubbles, but used by the bubble dragger to pass events to + // workspace comments. +}; + +/** + * Get whether this bubble is deletable or not. + * @return {boolean} True if deletable. + * @package + */ +Blockly.Bubble.prototype.isDeletable = function() { + return false; +}; + +/** + * Update the style of this bubble when it is dragged over a delete area. + * @param {boolean} _enable True if the bubble is about to be deleted, false + * otherwise. + */ +Blockly.Bubble.prototype.setDeleteStyle = function(_enable) { + // NOP if bubble is not deletable. +}; + +/** + * Handle a mouse-down on bubble's resize corner. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.Bubble.prototype.resizeMouseDown_ = function(e) { + this.promote(); + Blockly.Bubble.unbindDragEvents_(); + if (Blockly.utils.isRightButton(e)) { + // No right-click. + e.stopPropagation(); + return; + } + // Left-click (or middle click) + this.workspace_.startDrag( + e, + 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(); + // This event has been handled. No need to bubble up to the document. + e.stopPropagation(); +}; + +/** + * Resize this bubble to follow the mouse. + * @param {!Event} e Mouse move event. + * @private + */ +Blockly.Bubble.prototype.resizeMouseMove_ = function(e) { + this.autoLayout_ = false; + var newXY = this.workspace_.moveDrag(e); + this.setBubbleSize(this.workspace_.RTL ? -newXY.x : newXY.x, newXY.y); + if (this.workspace_.RTL) { + // RTL requires the bubble to move its left edge. + this.positionBubble_(); + } +}; + +/** + * Register a function as a callback event for when the bubble is resized. + * @param {!Function} callback The function to call on resize. + */ +Blockly.Bubble.prototype.registerResizeEvent = function(callback) { + this.resizeCallback_ = callback; +}; + +/** + * Register a function as a callback event for when the bubble is moved. + * @param {!Function} callback The function to call on move. + */ +Blockly.Bubble.prototype.registerMoveEvent = function(callback) { + this.moveCallback_ = callback; +}; + +/** + * Move this bubble to the top of the stack. + * @return {boolean} Whether or not the bubble has been moved. + * @package + */ +Blockly.Bubble.prototype.promote = function() { + var svgGroup = this.bubbleGroup_.parentNode; + if (svgGroup.lastChild !== this.bubbleGroup_) { + svgGroup.appendChild(this.bubbleGroup_); + return true; + } + return false; +}; + +/** + * Notification that the anchor has moved. + * Update the arrow and bubble accordingly. + * @param {!Blockly.utils.Coordinate} xy Absolute location. + */ +Blockly.Bubble.prototype.setAnchorLocation = function(xy) { + this.anchorXY_ = xy; + if (this.rendered_) { + this.positionBubble_(); + } +}; + +/** + * Position the bubble so that it does not fall off-screen. + * @private + */ +Blockly.Bubble.prototype.layoutBubble_ = function() { + // Get the metrics in workspace units. + var metrics = this.workspace_.getMetrics(); + metrics.viewLeft /= this.workspace_.scale; + metrics.viewWidth /= this.workspace_.scale; + metrics.viewTop /= this.workspace_.scale; + metrics.viewHeight /= this.workspace_.scale; + + var optimalLeft = this.getOptimalRelativeLeft_(metrics); + var optimalTop = this.getOptimalRelativeTop_(metrics); + var bbox = this.shape_.getBBox(); + + var topPosition = { + x: optimalLeft, + y: -this.height_ - + this.workspace_.getRenderer().getConstants().MIN_BLOCK_HEIGHT + }; + var startPosition = {x: -this.width_ - 30, y: optimalTop}; + var endPosition = {x: bbox.width, y: optimalTop}; + var bottomPosition = {x: optimalLeft, y: bbox.height}; + + var closerPosition = bbox.width < bbox.height ? endPosition : bottomPosition; + var fartherPosition = bbox.width < bbox.height ? bottomPosition : endPosition; + + var topPositionOverlap = this.getOverlap_(topPosition, metrics); + var startPositionOverlap = this.getOverlap_(startPosition, metrics); + var closerPositionOverlap = this.getOverlap_(closerPosition, metrics); + var fartherPositionOverlap = this.getOverlap_(fartherPosition, metrics); + + // Set the position to whichever position shows the most of the bubble, + // with tiebreaks going in the order: top > start > close > far. + var mostOverlap = Math.max( + topPositionOverlap, startPositionOverlap, closerPositionOverlap, + fartherPositionOverlap); + if (topPositionOverlap == mostOverlap) { + this.relativeLeft_ = topPosition.x; + this.relativeTop_ = topPosition.y; + return; + } + if (startPositionOverlap == mostOverlap) { + this.relativeLeft_ = startPosition.x; + this.relativeTop_ = startPosition.y; + return; + } + if (closerPositionOverlap == mostOverlap) { + this.relativeLeft_ = closerPosition.x; + this.relativeTop_ = closerPosition.y; + return; + } + // TODO: I believe relativeLeft_ should actually be called relativeStart_ + // and then the math should be fixed to reflect this. (hopefully it'll + // make it look simpler) + this.relativeLeft_ = fartherPosition.x; + this.relativeTop_ = fartherPosition.y; +}; + +/** + * Calculate the what percentage of the bubble overlaps with the visible + * workspace (what percentage of the bubble is visible). + * @param {!{x: number, y: number}} relativeMin The position of the top-left + * corner of the bubble relative to the anchor point. + * @param {!Blockly.utils.Metrics} metrics The metrics of the workspace the + * bubble will appear in. + * @return {number} The percentage of the bubble that is visible. + * @private + */ +Blockly.Bubble.prototype.getOverlap_ = function(relativeMin, metrics) { + // The position of the top-left corner of the bubble in workspace units. + var bubbleMin = { + x: this.workspace_.RTL ? (this.anchorXY_.x - relativeMin.x - this.width_) : + (relativeMin.x + this.anchorXY_.x), + y: relativeMin.y + this.anchorXY_.y + }; + // The position of the bottom-right corner of the bubble in workspace units. + var bubbleMax = {x: bubbleMin.x + this.width_, y: bubbleMin.y + this.height_}; + + // We could adjust these values to account for the scrollbars, but the + // bubbles should have been adjusted to not collide with them anyway, so + // giving the workspace a slightly larger "bounding box" shouldn't affect the + // calculation. + + // The position of the top-left corner of the workspace. + var workspaceMin = {x: metrics.viewLeft, y: metrics.viewTop}; + // The position of the bottom-right corner of the workspace. + var workspaceMax = { + x: metrics.viewLeft + metrics.viewWidth, + y: metrics.viewTop + metrics.viewHeight + }; + + var overlapWidth = Math.min(bubbleMax.x, workspaceMax.x) - + Math.max(bubbleMin.x, workspaceMin.x); + var overlapHeight = Math.min(bubbleMax.y, workspaceMax.y) - + Math.max(bubbleMin.y, workspaceMin.y); + return Math.max( + 0, + Math.min( + 1, (overlapWidth * overlapHeight) / (this.width_ * this.height_))); +}; + +/** + * Calculate what the optimal horizontal position of the top-left corner of the + * bubble is (relative to the anchor point) so that the most area of the + * bubble is shown. + * @param {!Blockly.utils.Metrics} metrics The metrics of the workspace the + * bubble will appear in. + * @return {number} The optimal horizontal position of the top-left corner + * of the bubble. + * @private + */ +Blockly.Bubble.prototype.getOptimalRelativeLeft_ = function(metrics) { + var relativeLeft = -this.width_ / 4; + + // No amount of sliding left or right will give us a better overlap. + if (this.width_ > metrics.viewWidth) { + return relativeLeft; + } + + if (this.workspace_.RTL) { + // Bubble coordinates are flipped in RTL. + var bubbleRight = this.anchorXY_.x - relativeLeft; + var bubbleLeft = bubbleRight - this.width_; + + var workspaceRight = metrics.viewLeft + metrics.viewWidth; + var workspaceLeft = metrics.viewLeft + + // Thickness in workspace units. + (Blockly.Scrollbar.scrollbarThickness / this.workspace_.scale); + } else { + var bubbleLeft = relativeLeft + this.anchorXY_.x; + var bubbleRight = bubbleLeft + this.width_; + + var workspaceLeft = metrics.viewLeft; + var workspaceRight = metrics.viewLeft + metrics.viewWidth - + // Thickness in workspace units. + (Blockly.Scrollbar.scrollbarThickness / this.workspace_.scale); + } + + if (this.workspace_.RTL) { + if (bubbleLeft < workspaceLeft) { + // Slide the bubble right until it is onscreen. + relativeLeft = -(workspaceLeft - this.anchorXY_.x + this.width_); + } else if (bubbleRight > workspaceRight) { + // Slide the bubble left until it is onscreen. + relativeLeft = -(workspaceRight - this.anchorXY_.x); + } + } else { + if (bubbleLeft < workspaceLeft) { + // Slide the bubble right until it is onscreen. + relativeLeft = workspaceLeft - this.anchorXY_.x; + } else if (bubbleRight > workspaceRight) { + // Slide the bubble left until it is onscreen. + relativeLeft = workspaceRight - this.anchorXY_.x - this.width_; + } + } + + return relativeLeft; +}; + +/** + * Calculate what the optimal vertical position of the top-left corner of + * the bubble is (relative to the anchor point) so that the most area of the + * bubble is shown. + * @param {!Blockly.utils.Metrics} metrics The metrics of the workspace the + * bubble will appear in. + * @return {number} The optimal vertical position of the top-left corner + * of the bubble. + * @private + */ +Blockly.Bubble.prototype.getOptimalRelativeTop_ = function(metrics) { + var relativeTop = -this.height_ / 4; + + // No amount of sliding up or down will give us a better overlap. + if (this.height_ > metrics.viewHeight) { + return relativeTop; + } + + var bubbleTop = this.anchorXY_.y + relativeTop; + var bubbleBottom = bubbleTop + this.height_; + var workspaceTop = metrics.viewTop; + var workspaceBottom = metrics.viewTop + metrics.viewHeight - + // Thickness in workspace units. + (Blockly.Scrollbar.scrollbarThickness / this.workspace_.scale); + + var anchorY = this.anchorXY_.y; + if (bubbleTop < workspaceTop) { + // Slide the bubble down until it is onscreen. + relativeTop = workspaceTop - anchorY; + } else if (bubbleBottom > workspaceBottom) { + // Slide the bubble up until it is onscreen. + relativeTop = workspaceBottom - anchorY - this.height_; + } + + return relativeTop; +}; + +/** + * Move the bubble to a location relative to the anchor's centre. + * @private + */ +Blockly.Bubble.prototype.positionBubble_ = function() { + var left = this.anchorXY_.x; + if (this.workspace_.RTL) { + left -= this.relativeLeft_ + this.width_; + } else { + left += this.relativeLeft_; + } + var top = this.relativeTop_ + this.anchorXY_.y; + this.moveTo(left, top); +}; + +/** + * 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 + */ +Blockly.Bubble.prototype.moveTo = function(x, y) { + this.bubbleGroup_.setAttribute('transform', 'translate(' + x + ',' + y + ')'); +}; + +/** + * Triggers a move callback if one exists at the end of a drag. + * @param {boolean} adding True if adding, false if removing. + * @package + */ +Blockly.Bubble.prototype.setDragging = function(adding) { + if (!adding && this.moveCallback_) { + this.moveCallback_(); + } +}; + +/** + * Get the dimensions of this bubble. + * @return {!Blockly.utils.Size} The height and width of the bubble. + */ +Blockly.Bubble.prototype.getBubbleSize = function() { + return new Blockly.utils.Size(this.width_, this.height_); +}; + +/** + * Size this bubble. + * @param {number} width Width of the bubble. + * @param {number} height Height of the bubble. + */ +Blockly.Bubble.prototype.setBubbleSize = function(width, height) { + var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; + // Minimum size of a bubble. + width = Math.max(width, doubleBorderWidth + 45); + height = Math.max(height, doubleBorderWidth + 20); + this.width_ = width; + this.height_ = height; + this.bubbleBack_.setAttribute('width', width); + this.bubbleBack_.setAttribute('height', height); + if (this.resizeGroup_) { + if (this.workspace_.RTL) { + // Mirror the resize group. + var resizeSize = 2 * Blockly.Bubble.BORDER_WIDTH; + this.resizeGroup_.setAttribute( + 'transform', + 'translate(' + resizeSize + ',' + (height - doubleBorderWidth) + + ') scale(-1 1)'); + } else { + this.resizeGroup_.setAttribute( + 'transform', + 'translate(' + (width - doubleBorderWidth) + ',' + + (height - doubleBorderWidth) + ')'); + } + } + if (this.autoLayout_) { + this.layoutBubble_(); + } + this.positionBubble_(); + this.renderArrow_(); + + // Allow the contents to resize. + if (this.resizeCallback_) { + this.resizeCallback_(); + } +}; + +/** + * Draw the arrow between the bubble and the origin. + * @private + */ +Blockly.Bubble.prototype.renderArrow_ = function() { + var steps = []; + // Find the relative coordinates of the center of the bubble. + var relBubbleX = this.width_ / 2; + var relBubbleY = this.height_ / 2; + // Find the relative coordinates of the center of the anchor. + var relAnchorX = -this.relativeLeft_; + var relAnchorY = -this.relativeTop_; + if (relBubbleX == relAnchorX && relBubbleY == relAnchorY) { + // Null case. Bubble is directly on top of the anchor. + // Short circuit this rather than wade through divide by zeros. + steps.push('M ' + relBubbleX + ',' + relBubbleY); + } else { + // Compute the angle of the arrow's line. + var rise = relAnchorY - relBubbleY; + var run = relAnchorX - relBubbleX; + if (this.workspace_.RTL) { + run *= -1; + } + var hypotenuse = Math.sqrt(rise * rise + run * run); + var angle = Math.acos(run / hypotenuse); + if (rise < 0) { + angle = 2 * Math.PI - angle; + } + // Compute a line perpendicular to the arrow. + var rightAngle = angle + Math.PI / 2; + if (rightAngle > Math.PI * 2) { + rightAngle -= Math.PI * 2; + } + var rightRise = Math.sin(rightAngle); + var rightRun = Math.cos(rightAngle); + + // Calculate the thickness of the base of the arrow. + var bubbleSize = this.getBubbleSize(); + var thickness = + (bubbleSize.width + bubbleSize.height) / Blockly.Bubble.ARROW_THICKNESS; + thickness = Math.min(thickness, bubbleSize.width, bubbleSize.height) / 4; + + // Back the tip of the arrow off of the anchor. + var backoffRatio = 1 - Blockly.Bubble.ANCHOR_RADIUS / hypotenuse; + relAnchorX = relBubbleX + backoffRatio * run; + relAnchorY = relBubbleY + backoffRatio * rise; + + // Coordinates for the base of the arrow. + var baseX1 = relBubbleX + thickness * rightRun; + var baseY1 = relBubbleY + thickness * rightRise; + var baseX2 = relBubbleX - thickness * rightRun; + var baseY2 = relBubbleY - thickness * rightRise; + + // Distortion to curve the arrow. + var swirlAngle = angle + this.arrow_radians_; + if (swirlAngle > Math.PI * 2) { + swirlAngle -= Math.PI * 2; + } + var swirlRise = + Math.sin(swirlAngle) * hypotenuse / Blockly.Bubble.ARROW_BEND; + var swirlRun = + Math.cos(swirlAngle) * hypotenuse / Blockly.Bubble.ARROW_BEND; + + steps.push('M' + baseX1 + ',' + baseY1); + steps.push( + 'C' + (baseX1 + swirlRun) + ',' + (baseY1 + swirlRise) + ' ' + + relAnchorX + ',' + relAnchorY + ' ' + relAnchorX + ',' + relAnchorY); + steps.push( + 'C' + relAnchorX + ',' + relAnchorY + ' ' + (baseX2 + swirlRun) + ',' + + (baseY2 + swirlRise) + ' ' + baseX2 + ',' + baseY2); + } + steps.push('z'); + this.bubbleArrow_.setAttribute('d', steps.join(' ')); +}; + +/** + * Change the colour of a bubble. + * @param {string} hexColour Hex code of colour. + */ +Blockly.Bubble.prototype.setColour = function(hexColour) { + this.bubbleBack_.setAttribute('fill', hexColour); + this.bubbleArrow_.setAttribute('fill', hexColour); +}; + +/** + * Dispose of this bubble. + */ +Blockly.Bubble.prototype.dispose = function() { + if (this.onMouseDownBubbleWrapper_) { + Blockly.unbindEvent_(this.onMouseDownBubbleWrapper_); + } + if (this.onMouseDownResizeWrapper_) { + Blockly.unbindEvent_(this.onMouseDownResizeWrapper_); + } + Blockly.Bubble.unbindDragEvents_(); + Blockly.utils.dom.removeNode(this.bubbleGroup_); + this.disposed = true; +}; + +/** + * 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 + */ +Blockly.Bubble.prototype.moveDuringDrag = function(dragSurface, newLoc) { + if (dragSurface) { + dragSurface.translateSurface(newLoc.x, newLoc.y); + } else { + this.moveTo(newLoc.x, newLoc.y); + } + if (this.workspace_.RTL) { + this.relativeLeft_ = this.anchorXY_.x - newLoc.x - this.width_; + } else { + this.relativeLeft_ = newLoc.x - this.anchorXY_.x; + } + this.relativeTop_ = newLoc.y - this.anchorXY_.y; + this.renderArrow_(); +}; + +/** + * 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. + */ +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_); +}; + +/** + * 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 + */ +Blockly.Bubble.prototype.setAutoLayout = function(enable) { + this.autoLayout_ = enable; +}; + +/** + * Create the text for a non editable bubble. + * @param {string} text The text to display. + * @return {!SVGTextElement} The top-level node of the text. + * @package + */ +Blockly.Bubble.textToDom = function(text) { + var paragraph = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TEXT, + { + 'class': 'blocklyText blocklyBubbleText blocklyNoPointerEvents', + 'y': Blockly.Bubble.BORDER_WIDTH + }, + null); + var lines = text.split('\n'); + for (var i = 0; i < lines.length; i++) { + var tspanElement = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TSPAN, + {'dy': '1em', 'x': Blockly.Bubble.BORDER_WIDTH}, paragraph); + var textNode = document.createTextNode(lines[i]); + tspanElement.appendChild(textNode); + } + return paragraph; +}; + +/** + * Creates a bubble that can not be edited. + * @param {!SVGTextElement} paragraphElement The text element for the non editable bubble. + * @param {!Blockly.BlockSvg} block The block that the bubble is attached to. + * @param {!Blockly.utils.Coordinate} iconXY The coordinate of the icon. + * @return {!Blockly.Bubble} The non editable bubble. + * @package + */ +Blockly.Bubble.createNonEditableBubble = function(paragraphElement, block, iconXY) { + var bubble = new Blockly.Bubble( + /** @type {!Blockly.WorkspaceSvg} */ (block.workspace), + paragraphElement, block.pathObject.svgPath, + /** @type {!Blockly.utils.Coordinate} */ (iconXY), null, null); + // Expose this bubble's block's ID on its top-level SVG group. + bubble.setSvgId(block.id); + if (block.RTL) { + // Right-align the paragraph. + // This cannot be done until the bubble is rendered on screen. + var maxWidth = paragraphElement.getBBox().width; + for (var i = 0, textElement; + (textElement = paragraphElement.childNodes[i]); i++) { + + textElement.setAttribute('text-anchor', 'end'); + textElement.setAttribute('x', maxWidth + Blockly.Bubble.BORDER_WIDTH); + } + } + return bubble; +}; diff --git a/static/js/dist/core/bubble_dragger.js b/static/js/dist/core/bubble_dragger.js new file mode 100644 index 0000000..732165b --- /dev/null +++ b/static/js/dist/core/bubble_dragger.js @@ -0,0 +1,275 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Methods for dragging a bubble visually. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.BubbleDragger'); + +goog.require('Blockly.Bubble'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.CommentMove'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); + +goog.requireType('Blockly.IBubble'); + + +/** + * 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.IBubble} bubble The item on the bubble canvas to drag. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. + * @constructor + */ +Blockly.BubbleDragger = function(bubble, workspace) { + /** + * The item on the bubble canvas that is being dragged. + * @type {!Blockly.IBubble} + * @private + */ + this.draggingBubble_ = bubble; + + /** + * The workspace on which the bubble is being dragged. + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = workspace; + + /** + * Which delete area the mouse pointer is over, if any. + * One of {@link Blockly.DELETE_AREA_TRASH}, + * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. + * @type {?number} + * @private + */ + this.deleteArea_ = null; + + /** + * Whether the bubble would be deleted if dropped immediately. + * @type {boolean} + * @private + */ + this.wouldDeleteBubble_ = false; + + /** + * The location of the top left corner of the dragging bubble's body at the + * beginning of the drag, in workspace coordinates. + * @type {!Blockly.utils.Coordinate} + * @private + */ + this.startXY_ = this.draggingBubble_.getRelativeToSurfaceXY(); + + /** + * The drag surface to move bubbles to during a drag, or null if none should + * be used. Block dragging and bubble dragging use the same surface. + * @type {Blockly.BlockDragSurfaceSvg} + * @private + */ + this.dragSurface_ = + Blockly.utils.is3dSupported() && !!workspace.getBlockDragSurface() ? + workspace.getBlockDragSurface() : + null; +}; + +/** + * Sever all links from this object. + * @package + * @suppress {checkTypes} + */ +Blockly.BubbleDragger.prototype.dispose = function() { + this.draggingBubble_ = null; + this.workspace_ = null; + this.dragSurface_ = null; +}; + +/** + * Start dragging a bubble. This includes moving it to the drag surface. + * @package + */ +Blockly.BubbleDragger.prototype.startBubbleDrag = function() { + if (!Blockly.Events.getGroup()) { + Blockly.Events.setGroup(true); + } + + this.workspace_.setResizesEnabled(false); + this.draggingBubble_.setAutoLayout(false); + if (this.dragSurface_) { + this.moveToDragSurface_(); + } + + this.draggingBubble_.setDragging && this.draggingBubble_.setDragging(true); + + var toolbox = this.workspace_.getToolbox(); + if (toolbox && typeof toolbox.addStyle == 'function') { + var style = this.draggingBubble_.isDeletable() ? 'blocklyToolboxDelete' : + 'blocklyToolboxGrab'; + toolbox.addStyle(style); + } +}; + +/** + * 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 + */ +Blockly.BubbleDragger.prototype.dragBubble = function(e, currentDragDeltaXY) { + var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); + var newLoc = Blockly.utils.Coordinate.sum(this.startXY_, delta); + + this.draggingBubble_.moveDuringDrag(this.dragSurface_, newLoc); + + if (this.draggingBubble_.isDeletable()) { + this.deleteArea_ = this.workspace_.isDeleteArea(e); + this.updateCursorDuringBubbleDrag_(); + } +}; + +/** + * Shut the trash can and, if necessary, delete the dragging bubble. + * Should be called at the end of a bubble drag. + * @return {boolean} Whether the bubble was deleted. + * @private + */ +Blockly.BubbleDragger.prototype.maybeDeleteBubble_ = function() { + var trashcan = this.workspace_.trashcan; + + if (this.wouldDeleteBubble_) { + if (trashcan) { + setTimeout(trashcan.closeLid.bind(trashcan), 100); + } + // Fire a move event, so we know where to go back to for an undo. + this.fireMoveEvent_(); + this.draggingBubble_.dispose(false, true); + } else if (trashcan) { + // Make sure the trash can lid is closed. + trashcan.closeLid(); + } + return this.wouldDeleteBubble_; +}; + +/** + * Update the cursor (and possibly the trash can lid) to reflect whether the + * dragging bubble would be deleted if released immediately. + * @private + */ +Blockly.BubbleDragger.prototype.updateCursorDuringBubbleDrag_ = function() { + this.wouldDeleteBubble_ = this.deleteArea_ != Blockly.DELETE_AREA_NONE; + var trashcan = this.workspace_.trashcan; + if (this.wouldDeleteBubble_) { + this.draggingBubble_.setDeleteStyle(true); + if (this.deleteArea_ == Blockly.DELETE_AREA_TRASH && trashcan) { + trashcan.setLidOpen(true); + } + } else { + this.draggingBubble_.setDeleteStyle(false); + if (trashcan) { + trashcan.setLidOpen(false); + } + } +}; + +/** + * 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 + */ +Blockly.BubbleDragger.prototype.endBubbleDrag = function( + e, currentDragDeltaXY) { + // Make sure internal state is fresh. + this.dragBubble(e, currentDragDeltaXY); + + var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); + var newLoc = Blockly.utils.Coordinate.sum(this.startXY_, delta); + + // Move the bubble to its final location. + this.draggingBubble_.moveTo(newLoc.x, newLoc.y); + var deleted = this.maybeDeleteBubble_(); + + if (!deleted) { + // Put everything back onto the bubble canvas. + if (this.dragSurface_) { + this.dragSurface_.clearAndHide(this.workspace_.getBubbleCanvas()); + } + + this.draggingBubble_.setDragging && this.draggingBubble_.setDragging(false); + this.fireMoveEvent_(); + } + this.workspace_.setResizesEnabled(true); + + var toolbox = this.workspace_.getToolbox(); + if (toolbox && typeof toolbox.removeStyle == 'function') { + var style = this.draggingBubble_.isDeletable() ? 'blocklyToolboxDelete' : + 'blocklyToolboxGrab'; + toolbox.removeStyle(style); + } + Blockly.Events.setGroup(false); +}; + +/** + * Fire a move event at the end of a bubble drag. + * @private + */ +Blockly.BubbleDragger.prototype.fireMoveEvent_ = function() { + if (this.draggingBubble_.isComment) { + var event = new Blockly.Events.CommentMove( + /** @type {!Blockly.WorkspaceCommentSvg} */ (this.draggingBubble_)); + event.setOldCoordinate(this.startXY_); + event.recordNew(); + Blockly.Events.fire(event); + } + // TODO (fenichel): move events for comments. + return; +}; + +/** + * Convert a coordinate object from pixels to workspace units, including a + * correction for mutator workspaces. + * This function does not consider differing origins. It simply scales the + * input's x and y values. + * @param {!Blockly.utils.Coordinate} pixelCoord A coordinate with x and y + * values in CSS pixel units. + * @return {!Blockly.utils.Coordinate} The input coordinate divided by the + * workspace scale. + * @private + */ +Blockly.BubbleDragger.prototype.pixelsToWorkspaceUnits_ = function(pixelCoord) { + var result = new Blockly.utils.Coordinate( + pixelCoord.x / this.workspace_.scale, + pixelCoord.y / this.workspace_.scale); + if (this.workspace_.isMutator) { + // If we're in a mutator, its scale is always 1, purely because of some + // oddities in our rendering optimizations. The actual scale is the same as + // the scale on the parent workspace. + // Fix that for dragging. + var mainScale = this.workspace_.options.parentWorkspace.scale; + result.scale(1 / mainScale); + } + return result; +}; + +/** + * Move the bubble onto the drag surface at the beginning of a drag. Move the + * drag surface to preserve the apparent location of the bubble. + * @private + */ +Blockly.BubbleDragger.prototype.moveToDragSurface_ = function() { + this.draggingBubble_.moveTo(0, 0); + this.dragSurface_.translateSurface(this.startXY_.x, this.startXY_.y); + // Execute the move on the top-level SVG component. + this.dragSurface_.setBlocksAndShow(this.draggingBubble_.getSvgRoot()); +}; diff --git a/static/js/dist/core/comment.js b/static/js/dist/core/comment.js new file mode 100644 index 0000000..33c4bd9 --- /dev/null +++ b/static/js/dist/core/comment.js @@ -0,0 +1,403 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object representing a code comment. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Comment'); + +goog.require('Blockly.Bubble'); +goog.require('Blockly.Css'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Events.BubbleOpen'); +goog.require('Blockly.Icon'); +goog.require('Blockly.utils.deprecation'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.Warning'); + + +/** + * Class for a comment. + * @param {!Blockly.Block} block The block associated with this comment. + * @extends {Blockly.Icon} + * @constructor + */ +Blockly.Comment = function(block) { + Blockly.Comment.superClass_.constructor.call(this, block); + + /** + * The model for this comment. + * @type {!Blockly.Block.CommentModel} + * @private + */ + this.model_ = block.commentModel; + // If someone creates the comment directly instead of calling + // block.setCommentText we want to make sure the text is non-null; + this.model_.text = this.model_.text || ''; + + /** + * The model's text value at the start of an edit. + * Used to tell if an event should be fired at the end of an edit. + * @type {?string} + * @private + */ + this.cachedText_ = ''; + + /** + * Mouse up event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseUpWrapper_ = null; + + /** + * Wheel event data. + * @type {?Blockly.EventData} + * @private + */ + this.onWheelWrapper_ = null; + + /** + * Change event data. + * @type {?Blockly.EventData} + * @private + */ + this.onChangeWrapper_ = null; + + /** + * Input event data. + * @type {?Blockly.EventData} + * @private + */ + this.onInputWrapper_ = null; + + this.createIcon(); +}; +Blockly.utils.object.inherits(Blockly.Comment, Blockly.Icon); + +/** + * Draw the comment icon. + * @param {!Element} group The icon group. + * @protected + */ +Blockly.Comment.prototype.drawIcon_ = function(group) { + // Circle. + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.CIRCLE, + {'class': 'blocklyIconShape', 'r': '8', 'cx': '8', 'cy': '8'}, + group); + // Can't use a real '?' text character since different browsers and operating + // systems render it differently. + // Body of question mark. + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.PATH, + { + 'class': 'blocklyIconSymbol', + 'd': 'm6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.405' + + '0.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25' + + '-1.201,0.998 -1.201,1.528 -1.204,2.19z'}, + group); + // Dot of question mark. + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, + { + 'class': 'blocklyIconSymbol', + 'x': '6.8', + 'y': '10.78', + 'height': '2', + 'width': '2' + }, + group); +}; + +/** + * Create the editor for the comment's bubble. + * @return {!SVGElement} The top-level node of the editor. + * @private + */ +Blockly.Comment.prototype.createEditor_ = function() { + /* Create the editor. Here's the markup that will be generated in + * editable mode: + + + + + + * For non-editable mode see Warning.textToDom_. + */ + + this.foreignObject_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.FOREIGNOBJECT, + {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, + null); + + var body = document.createElementNS(Blockly.utils.dom.HTML_NS, 'body'); + body.setAttribute('xmlns', Blockly.utils.dom.HTML_NS); + body.className = 'blocklyMinimalBody'; + + this.textarea_ = document.createElementNS( + Blockly.utils.dom.HTML_NS, 'textarea'); + var textarea = this.textarea_; + textarea.className = 'blocklyCommentTextarea'; + textarea.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); + textarea.value = this.model_.text; + this.resizeTextarea_(); + + body.appendChild(textarea); + this.foreignObject_.appendChild(body); + + // Ideally this would be hooked to the focus event for the comment. + // However doing so in Firefox swallows the cursor for unknown reasons. + // So this is hooked to mouseup instead. No big deal. + this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( + textarea, 'mouseup', this, this.startEdit_, true, true); + // Don't zoom with mousewheel. + this.onWheelWrapper_ = Blockly.bindEventWithChecks_( + textarea, 'wheel', this, function(e) { + e.stopPropagation(); + }); + this.onChangeWrapper_ = Blockly.bindEventWithChecks_( + textarea, 'change', this, function(_e) { + if (this.cachedText_ != this.model_.text) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + this.block_, 'comment', null, this.cachedText_, this.model_.text)); + } + }); + this.onInputWrapper_ = Blockly.bindEventWithChecks_( + textarea, 'input', this, function(_e) { + this.model_.text = textarea.value; + }); + + setTimeout(textarea.focus.bind(textarea), 0); + + return this.foreignObject_; +}; + +/** + * Add or remove editability of the comment. + * @override + */ +Blockly.Comment.prototype.updateEditable = function() { + Blockly.Comment.superClass_.updateEditable.call(this); + if (this.isVisible()) { + // Recreate the bubble with the correct UI. + this.disposeBubble_(); + this.createBubble_(); + } +}; + +/** + * Callback function triggered when the bubble has resized. + * Resize the text area accordingly. + * @private + */ +Blockly.Comment.prototype.onBubbleResize_ = function() { + if (!this.isVisible()) { + return; + } + this.model_.size = this.bubble_.getBubbleSize(); + this.resizeTextarea_(); +}; + +/** + * Resizes the text area to match the size defined on the model (which is + * the size of the bubble). + * @private + */ +Blockly.Comment.prototype.resizeTextarea_ = function() { + var size = this.model_.size; + var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; + var widthMinusBorder = size.width - doubleBorderWidth; + var heightMinusBorder = size.height - doubleBorderWidth; + this.foreignObject_.setAttribute('width', widthMinusBorder); + this.foreignObject_.setAttribute('height', heightMinusBorder); + this.textarea_.style.width = (widthMinusBorder - 4) + 'px'; + this.textarea_.style.height = (heightMinusBorder - 4) + 'px'; +}; + +/** + * Show or hide the comment bubble. + * @param {boolean} visible True if the bubble should be visible. + */ +Blockly.Comment.prototype.setVisible = function(visible) { + if (visible == this.isVisible()) { + return; + } + Blockly.Events.fire( + new Blockly.Events.BubbleOpen(this.block_, visible, 'comment')); + this.model_.pinned = visible; + if (visible) { + this.createBubble_(); + } else { + this.disposeBubble_(); + } +}; + +/** + * Show the bubble. Handles deciding if it should be editable or not. + * @private + */ +Blockly.Comment.prototype.createBubble_ = function() { + if (!this.block_.isEditable() || Blockly.utils.userAgent.IE) { + // MSIE does not support foreignobject; textareas are impossible. + // https://docs.microsoft.com/en-us/openspecs/ie_standards/ms-svg/56e6e04c-7c8c-44dd-8100-bd745ee42034 + // Always treat comments in IE as uneditable. + this.createNonEditableBubble_(); + } else { + this.createEditableBubble_(); + } +}; + +/** + * Show an editable bubble. + * @private + */ +Blockly.Comment.prototype.createEditableBubble_ = function() { + this.bubble_ = new Blockly.Bubble( + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + this.createEditor_(), this.block_.pathObject.svgPath, + /** @type {!Blockly.utils.Coordinate} */ (this.iconXY_), + this.model_.size.width, this.model_.size.height); + // Expose this comment's block's ID on its top-level SVG group. + this.bubble_.setSvgId(this.block_.id); + this.bubble_.registerResizeEvent(this.onBubbleResize_.bind(this)); + this.applyColour(); +}; + +/** + * Show a non-editable bubble. + * @private + * @suppress {checkTypes} Suppress `this` type mismatch. + */ +Blockly.Comment.prototype.createNonEditableBubble_ = function() { + // TODO (#2917): It would be great if the comment could support line breaks. + this.paragraphElement_ = Blockly.Bubble.textToDom(this.block_.getCommentText()); + this.bubble_ = Blockly.Bubble.createNonEditableBubble( + this.paragraphElement_, /** @type {!Blockly.BlockSvg} */ (this.block_), + /** @type {!Blockly.utils.Coordinate} */ (this.iconXY_)); + this.applyColour(); +}; + +/** + * Dispose of the bubble. + * @private + * @suppress {checkTypes} Suppress `this` type mismatch. + */ +Blockly.Comment.prototype.disposeBubble_ = function() { + if (this.onMouseUpWrapper_) { + Blockly.unbindEvent_(this.onMouseUpWrapper_); + this.onMouseUpWrapper_ = null; + } + if (this.onWheelWrapper_) { + Blockly.unbindEvent_(this.onWheelWrapper_); + this.onWheelWrapper_ = null; + } + if (this.onChangeWrapper_) { + Blockly.unbindEvent_(this.onChangeWrapper_); + this.onChangeWrapper_ = null; + } + if (this.onInputWrapper_) { + Blockly.unbindEvent_(this.onInputWrapper_); + this.onInputWrapper_ = null; + } + this.bubble_.dispose(); + this.bubble_ = null; + this.textarea_ = null; + this.foreignObject_ = null; + this.paragraphElement_ = null; +}; + +/** + * Callback fired when an edit starts. + * + * Bring the comment to the top of the stack when clicked on. Also cache the + * current text so it can be used to fire a change event. + * @param {!Event} _e Mouse up event. + * @private + */ +Blockly.Comment.prototype.startEdit_ = function(_e) { + if (this.bubble_.promote()) { + // Since the act of moving this node within the DOM causes a loss of focus, + // we need to reapply the focus. + this.textarea_.focus(); + } + + this.cachedText_ = this.model_.text; +}; + +/** + * Get the dimensions of this comment's bubble. + * @return {Blockly.utils.Size} Object with width and height properties. + */ +Blockly.Comment.prototype.getBubbleSize = function() { + return this.model_.size; +}; + +/** + * Size this comment's bubble. + * @param {number} width Width of the bubble. + * @param {number} height Height of the bubble. + */ +Blockly.Comment.prototype.setBubbleSize = function(width, height) { + if (this.bubble_) { + this.bubble_.setBubbleSize(width, height); + } else { + this.model_.size.width = width; + this.model_.size.height = height; + } +}; + +/** + * Update the comment's view to match the model. + * @package + */ +Blockly.Comment.prototype.updateText = function() { + if (this.textarea_) { + this.textarea_.value = this.model_.text; + } else if (this.paragraphElement_) { + // Non-Editable mode. + // TODO (#2917): If 2917 gets added this will probably need to be updated. + this.paragraphElement_.firstChild.textContent = this.model_.text; + } +}; + +/** + * 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); + */ +Blockly.Comment.prototype.dispose = function() { + this.block_.comment = null; + Blockly.Icon.prototype.dispose.call(this); +}; + +/** + * CSS for block comment. See css.js for use. + */ +Blockly.Css.register([ + /* eslint-disable indent */ + '.blocklyCommentTextarea {', + 'background-color: #fef49c;', + 'border: 0;', + 'outline: 0;', + 'margin: 0;', + 'padding: 3px;', + 'resize: none;', + 'display: block;', + 'text-overflow: hidden;', + '}' + /* eslint-enable indent */ +]); diff --git a/static/js/dist/core/connection.js b/static/js/dist/core/connection.js new file mode 100644 index 0000000..c50c50c --- /dev/null +++ b/static/js/dist/core/connection.js @@ -0,0 +1,683 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Components for creating connections between blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Connection'); + +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockMove'); +goog.require('Blockly.utils.deprecation'); +goog.require('Blockly.Xml'); + +goog.requireType('Blockly.IASTNodeLocationWithBlock'); +goog.requireType('Blockly.IConnectionChecker'); + + +/** + * Class for a connection between blocks. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @constructor + * @implements {Blockly.IASTNodeLocationWithBlock} + */ +Blockly.Connection = function(source, type) { + /** + * @type {!Blockly.Block} + * @protected + */ + this.sourceBlock_ = source; + /** @type {number} */ + this.type = type; +}; + +/** + * Constants for checking whether two connections are compatible. + */ +Blockly.Connection.CAN_CONNECT = 0; +Blockly.Connection.REASON_SELF_CONNECTION = 1; +Blockly.Connection.REASON_WRONG_TYPE = 2; +Blockly.Connection.REASON_TARGET_NULL = 3; +Blockly.Connection.REASON_CHECKS_FAILED = 4; +Blockly.Connection.REASON_DIFFERENT_WORKSPACES = 5; +Blockly.Connection.REASON_SHADOW_PARENT = 6; +Blockly.Connection.REASON_DRAG_CHECKS_FAILED = 7; + +/** + * Connection this connection connects to. Null if not connected. + * @type {Blockly.Connection} + */ +Blockly.Connection.prototype.targetConnection = null; + +/** + * Has this connection been disposed of? + * @type {boolean} + * @package + */ +Blockly.Connection.prototype.disposed = false; + +/** + * List of compatible value types. Null if all types are compatible. + * @type {Array} + * @private + */ +Blockly.Connection.prototype.check_ = null; + +/** + * DOM representation of a shadow block, or null if none. + * @type {Element} + * @private + */ +Blockly.Connection.prototype.shadowDom_ = null; + +/** + * Horizontal location of this connection. + * @type {number} + * @package + */ +Blockly.Connection.prototype.x = 0; + +/** + * Vertical location of this connection. + * @type {number} + * @package + */ +Blockly.Connection.prototype.y = 0; + +/** + * Connect two connections together. This is the connection on the superior + * block. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @protected + */ +Blockly.Connection.prototype.connect_ = function(childConnection) { + var parentConnection = this; + var parentBlock = parentConnection.getSourceBlock(); + var childBlock = childConnection.getSourceBlock(); + // Disconnect any existing parent on the child connection. + if (childConnection.isConnected()) { + childConnection.disconnect(); + } + if (parentConnection.isConnected()) { + // Other connection is already connected to something. + // Disconnect it and reattach it or bump it as needed. + var orphanBlock = parentConnection.targetBlock(); + var shadowDom = parentConnection.getShadowDom(); + // Temporarily set the shadow DOM to null so it does not respawn. + parentConnection.shadowDom_ = null; + // Displaced shadow blocks dissolve rather than reattaching or bumping. + if (orphanBlock.isShadow()) { + // Save the shadow block so that field values are preserved. + // This cast assumes that a block can not be both a shadow block and an insertion marker. + shadowDom = /** @type {!Element} */ (Blockly.Xml.blockToDom(orphanBlock)); + orphanBlock.dispose(false); + orphanBlock = null; + } else if (parentConnection.type == Blockly.INPUT_VALUE) { + // Value connections. + // If female block is already connected, disconnect and bump the male. + if (!orphanBlock.outputConnection) { + throw Error('Orphan block does not have an output connection.'); + } + // Attempt to reattach the orphan at the end of the newly inserted + // block. Since this block may be a row, walk down to the end + // or to the first (and only) shadow block. + var connection = Blockly.Connection.lastConnectionInRow( + childBlock, orphanBlock); + if (connection) { + orphanBlock.outputConnection.connect(connection); + orphanBlock = null; + } + } else if (parentConnection.type == Blockly.NEXT_STATEMENT) { + // Statement connections. + // Statement blocks may be inserted into the middle of a stack. + // Split the stack. + if (!orphanBlock.previousConnection) { + throw Error('Orphan block does not have a previous connection.'); + } + // Attempt to reattach the orphan at the bottom of the newly inserted + // block. Since this block may be a stack, walk down to the end. + var newBlock = childBlock; + while (newBlock.nextConnection) { + var nextBlock = newBlock.getNextBlock(); + if (nextBlock && !nextBlock.isShadow()) { + newBlock = nextBlock; + } else { + var checker = orphanBlock.workspace.connectionChecker; + if (checker.canConnect( + orphanBlock.previousConnection, newBlock.nextConnection, false)) { + newBlock.nextConnection.connect(orphanBlock.previousConnection); + orphanBlock = null; + } + break; + } + } + } + if (orphanBlock) { + // Unable to reattach orphan. + parentConnection.disconnect(); + if (Blockly.Events.recordUndo) { + // Bump it off to the side after a moment. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + // Verify orphan hasn't been deleted or reconnected. + if (orphanBlock.workspace && !orphanBlock.getParent()) { + Blockly.Events.setGroup(group); + if (orphanBlock.outputConnection) { + orphanBlock.outputConnection.onFailedConnect(parentConnection); + } else if (orphanBlock.previousConnection) { + orphanBlock.previousConnection.onFailedConnect(parentConnection); + } + Blockly.Events.setGroup(false); + } + }, Blockly.BUMP_DELAY); + } + } + // Restore the shadow DOM. + parentConnection.shadowDom_ = shadowDom; + } + + var event; + if (Blockly.Events.isEnabled()) { + event = new Blockly.Events.BlockMove(childBlock); + } + // Establish the connections. + Blockly.Connection.connectReciprocally_(parentConnection, childConnection); + // Demote the inferior block so that one is a child of the superior one. + childBlock.setParent(parentBlock); + if (event) { + event.recordNew(); + Blockly.Events.fire(event); + } +}; + +/** + * Dispose of this connection and deal with connected blocks. + * @package + */ +Blockly.Connection.prototype.dispose = function() { + + // isConnected returns true for shadows and non-shadows. + if (this.isConnected()) { + // Destroy the attached shadow block & its children (if it exists). + this.setShadowDom(null); + + var targetBlock = this.targetBlock(); + if (targetBlock) { + // Disconnect the attached normal block. + targetBlock.unplug(); + } + } + + this.disposed = true; +}; + +/** + * Get the source block for this connection. + * @return {!Blockly.Block} The source block. + */ +Blockly.Connection.prototype.getSourceBlock = function() { + return this.sourceBlock_; +}; + +/** + * Does the connection belong to a superior block (higher in the source stack)? + * @return {boolean} True if connection faces down or right. + */ +Blockly.Connection.prototype.isSuperior = function() { + return this.type == Blockly.INPUT_VALUE || + this.type == Blockly.NEXT_STATEMENT; +}; + +/** + * Is the connection connected? + * @return {boolean} True if connection is connected to another connection. + */ +Blockly.Connection.prototype.isConnected = function() { + return !!this.targetConnection; +}; + +/** + * Checks whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} target Connection to check compatibility with. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ +Blockly.Connection.prototype.canConnectWithReason = function(target) { + Blockly.utils.deprecation.warn( + 'Connection.prototype.canConnectWithReason', + 'July 2020', + 'July 2021', + 'the workspace\'s connection checker'); + return this.getConnectionChecker().canConnectWithReason( + this, target, false); +}; + +/** + * 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 + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ +Blockly.Connection.prototype.checkConnection = function(target) { + Blockly.utils.deprecation.warn( + 'Connection.prototype.checkConnection', + 'July 2020', + 'July 2021', + 'the workspace\'s connection checker'); + var checker = this.getConnectionChecker(); + var reason = checker.canConnectWithReason(this, target, false); + if (reason != Blockly.Connection.CAN_CONNECT) { + throw new Error(checker.getErrorMessage(reason, this, target)); + } +}; + +/** + * Get the workspace's connection type checker object. + * @return {!Blockly.IConnectionChecker} The connection type checker for the + * source block's workspace. + * @package + */ +Blockly.Connection.prototype.getConnectionChecker = function() { + return this.sourceBlock_.workspace.connectionChecker; +}; + +/** + * 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ +Blockly.Connection.prototype.isConnectionAllowed = function(candidate) { + Blockly.utils.deprecation.warn( + 'Connection.prototype.isConnectionAllowed', + 'July 2020', + 'July 2021', + 'the workspace\'s connection checker'); + return this.getConnectionChecker().canConnect(this, candidate, true); +}; + +/** + * Behavior after a connection attempt fails. + * @param {!Blockly.Connection} _otherConnection Connection that this connection + * failed to connect to. + * @package + */ +Blockly.Connection.prototype.onFailedConnect = function(_otherConnection) { + // NOP +}; + +/** + * Connect this connection to another connection. + * @param {!Blockly.Connection} otherConnection Connection to connect to. + */ +Blockly.Connection.prototype.connect = function(otherConnection) { + if (this.targetConnection == otherConnection) { + // Already connected together. NOP. + return; + } + + var checker = this.getConnectionChecker(); + if (checker.canConnect(this, otherConnection, false)) { + var eventGroup = Blockly.Events.getGroup(); + if (!eventGroup) { + Blockly.Events.setGroup(true); + } + // Determine which block is superior (higher in the source stack). + if (this.isSuperior()) { + // Superior block. + this.connect_(otherConnection); + } else { + // Inferior block. + otherConnection.connect_(this); + } + if (!eventGroup) { + Blockly.Events.setGroup(false); + } + } +}; + +/** + * Update two connections to target each other. + * @param {Blockly.Connection} first The first connection to update. + * @param {Blockly.Connection} second The second connection to update. + * @private + */ +Blockly.Connection.connectReciprocally_ = function(first, second) { + if (!first || !second) { + throw Error('Cannot connect null connections.'); + } + first.targetConnection = second; + second.targetConnection = first; +}; + +/** + * Does the given block have one and only one connection point that will accept + * an orphaned block? + * @param {!Blockly.Block} block The superior block. + * @param {!Blockly.Block} orphanBlock The inferior block. + * @return {Blockly.Connection} The suitable connection point on 'block', + * or null. + * @private + */ +Blockly.Connection.singleConnection_ = function(block, orphanBlock) { + var connection = null; + var output = orphanBlock.outputConnection; + for (var i = 0; i < block.inputList.length; i++) { + var thisConnection = block.inputList[i].connection; + var typeChecker = output.getConnectionChecker(); + if (thisConnection && thisConnection.type == Blockly.INPUT_VALUE && + typeChecker.canConnect(output, thisConnection, false)) { + if (connection) { + return null; // More than one connection. + } + connection = thisConnection; + } + } + return connection; +}; + +/** + * Walks down a row a blocks, at each stage checking if there are any + * connections that will accept the orphaned block. If at any point there + * are zero or multiple eligible connections, returns null. Otherwise + * returns the only input on the last block in the chain. + * Terminates early for shadow blocks. + * @param {!Blockly.Block} startBlock The block on which to start the search. + * @param {!Blockly.Block} orphanBlock The block that is looking for a home. + * @return {Blockly.Connection} The suitable connection point on the chain + * of blocks, or null. + * @package + */ +Blockly.Connection.lastConnectionInRow = function(startBlock, orphanBlock) { + var newBlock = startBlock; + var connection; + while ((connection = Blockly.Connection.singleConnection_( + /** @type {!Blockly.Block} */ (newBlock), orphanBlock))) { + newBlock = connection.targetBlock(); + if (!newBlock || newBlock.isShadow()) { + return connection; + } + } + return null; +}; + +/** + * Disconnect this connection. + */ +Blockly.Connection.prototype.disconnect = function() { + var otherConnection = this.targetConnection; + if (!otherConnection) { + throw Error('Source connection not connected.'); + } + if (otherConnection.targetConnection != this) { + throw Error('Target connection not connected to source connection.'); + } + var parentBlock, childBlock, parentConnection; + if (this.isSuperior()) { + // Superior block. + parentBlock = this.sourceBlock_; + childBlock = otherConnection.getSourceBlock(); + parentConnection = this; + } else { + // Inferior block. + parentBlock = otherConnection.getSourceBlock(); + childBlock = this.sourceBlock_; + parentConnection = otherConnection; + } + + var eventGroup = Blockly.Events.getGroup(); + if (!eventGroup) { + Blockly.Events.setGroup(true); + } + this.disconnectInternal_(parentBlock, childBlock); + if (!childBlock.isShadow()) { + // If we were disconnecting a shadow, no need to spawn a new one. + parentConnection.respawnShadow_(); + } + if (!eventGroup) { + Blockly.Events.setGroup(false); + } +}; + +/** + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. + * @protected + */ +Blockly.Connection.prototype.disconnectInternal_ = function(parentBlock, + childBlock) { + var event; + if (Blockly.Events.isEnabled()) { + event = new Blockly.Events.BlockMove(childBlock); + } + var otherConnection = this.targetConnection; + otherConnection.targetConnection = null; + this.targetConnection = null; + childBlock.setParent(null); + if (event) { + event.recordNew(); + Blockly.Events.fire(event); + } +}; + +/** + * Respawn the shadow block if there was one connected to the this connection. + * @protected + */ +Blockly.Connection.prototype.respawnShadow_ = function() { + var parentBlock = this.getSourceBlock(); + var shadow = this.getShadowDom(); + if (parentBlock.workspace && shadow) { + var blockShadow = + Blockly.Xml.domToBlock(shadow, parentBlock.workspace); + if (blockShadow.outputConnection) { + this.connect(blockShadow.outputConnection); + } else if (blockShadow.previousConnection) { + this.connect(blockShadow.previousConnection); + } else { + throw Error('Child block does not have output or previous statement.'); + } + } +}; + +/** + * Returns the block that this connection connects to. + * @return {Blockly.Block} The connected block or null if none is connected. + */ +Blockly.Connection.prototype.targetBlock = function() { + if (this.isConnected()) { + return this.targetConnection.getSourceBlock(); + } + return null; +}; + +/** + * 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ +Blockly.Connection.prototype.checkType = function(otherConnection) { + Blockly.utils.deprecation.warn( + 'Connection.prototype.checkType', + 'October 2019', + 'January 2021', + 'the workspace\'s connection checker'); + return this.getConnectionChecker().canConnect(this, otherConnection, + false); +}; + +/** + * 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. + * @private + * @deprecated October 2019. Will be deleted January 2021. Use the workspace's + * connectionChecker instead. + * @suppress {unusedPrivateMembers} + */ +Blockly.Connection.prototype.checkType_ = function(otherConnection) { + Blockly.utils.deprecation.warn( + 'Connection.prototype.checkType_', + 'October 2019', + 'January 2021', + 'the workspace\'s connection checker'); + return this.checkType(otherConnection); +}; + +/** + * Function to be called when this connection's compatible types have changed. + * @protected + */ +Blockly.Connection.prototype.onCheckChanged_ = function() { + // The new value type may not be compatible with the existing connection. + if (this.isConnected() && (!this.targetConnection || + !this.getConnectionChecker().canConnect( + this, this.targetConnection, false))) { + var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; + child.unplug(); + } +}; + +/** + * 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). + */ +Blockly.Connection.prototype.setCheck = function(check) { + if (check) { + // Ensure that check is in an array. + if (!Array.isArray(check)) { + check = [check]; + } + this.check_ = check; + this.onCheckChanged_(); + } else { + this.check_ = null; + } + return this; +}; + +/** + * Get a connection's compatibility. + * @return {Array} List of compatible value types. + * Null if all types are compatible. + * @public + */ +Blockly.Connection.prototype.getCheck = function() { + return this.check_; +}; + +/** + * Changes the connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + */ +Blockly.Connection.prototype.setShadowDom = function(shadow) { + this.shadowDom_ = shadow; + var target = this.targetBlock(); + if (!target) { + this.respawnShadow_(); + } else if (target.isShadow()) { + // The disconnect from dispose will automatically generate the new shadow. + target.dispose(false); + this.respawnShadow_(); + } +}; + +/** + * Returns the xml representation of the connection's shadow block. + * @return {Element} Shadow DOM representation of a block or null. + */ +Blockly.Connection.prototype.getShadowDom = function() { + return this.shadowDom_; +}; + +/** + * Find all nearby compatible connections to this connection. + * Type checking does not apply, since this function is used for bumping. + * + * 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 + */ +Blockly.Connection.prototype.neighbours = function(_maxLimit) { + return []; +}; + +/** + * Get the parent input of a connection. + * @return {Blockly.Input} The input that the connection belongs to or null if + * no parent exists. + * @package + */ +Blockly.Connection.prototype.getParentInput = function() { + var parentInput = null; + var block = this.sourceBlock_; + var inputs = block.inputList; + for (var idx = 0; idx < block.inputList.length; idx++) { + if (inputs[idx].connection === this) { + parentInput = inputs[idx]; + break; + } + } + return parentInput; +}; + +/** + * 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. + */ +Blockly.Connection.prototype.toString = function() { + var msg; + var block = this.sourceBlock_; + if (!block) { + return 'Orphan Connection'; + } else if (block.outputConnection == this) { + msg = 'Output Connection of '; + } else if (block.previousConnection == this) { + msg = 'Previous Connection of '; + } else if (block.nextConnection == this) { + msg = 'Next Connection of '; + } else { + var parentInput = null; + for (var i = 0, input; (input = block.inputList[i]); i++) { + if (input.connection == this) { + parentInput = input; + break; + } + } + if (parentInput) { + msg = 'Input "' + parentInput.name + '" connection on '; + } else { + console.warn('Connection not actually connected to sourceBlock_'); + return 'Orphan Connection'; + } + } + return msg + block.toDevString(); +}; diff --git a/static/js/dist/core/connection_checker.js b/static/js/dist/core/connection_checker.js new file mode 100644 index 0000000..a5d06fe --- /dev/null +++ b/static/js/dist/core/connection_checker.js @@ -0,0 +1,286 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview An object that encapsulates logic for checking whether a potential + * connection is safe and valid. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.ConnectionChecker'); + +goog.require('Blockly.constants'); +goog.require('Blockly.registry'); + +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.IConnectionChecker'); + + +/** + * Class for connection type checking logic. + * @implements {Blockly.IConnectionChecker} + * @constructor + */ +Blockly.ConnectionChecker = function() { +}; + +/** + * Check whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {boolean} Whether the connection is legal. + * @public + */ +Blockly.ConnectionChecker.prototype.canConnect = function(a, b, + isDragging, opt_distance) { + return this.canConnectWithReason(a, b, isDragging, opt_distance) == + Blockly.Connection.CAN_CONNECT; +}; + +/** + * Checks whether the current connection can connect with the target + * connection, and return an error code if there are problems. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @public + */ +Blockly.ConnectionChecker.prototype.canConnectWithReason = function( + a, b, isDragging, opt_distance) { + var safety = this.doSafetyChecks(a, b); + if (safety != Blockly.Connection.CAN_CONNECT) { + return safety; + } + + // If the safety checks passed, both connections are non-null. + var connOne = /** @type {!Blockly.Connection} **/ (a); + var connTwo = /** @type {!Blockly.Connection} **/ (b); + if (!this.doTypeChecks(connOne, connTwo)) { + return Blockly.Connection.REASON_CHECKS_FAILED; + } + + if (isDragging && + !this.doDragChecks( + /** @type {!Blockly.RenderedConnection} **/ (a), + /** @type {!Blockly.RenderedConnection} **/ (b), + opt_distance || 0)) { + return Blockly.Connection.REASON_DRAG_CHECKS_FAILED; + } + + return Blockly.Connection.CAN_CONNECT; +}; + +/** + * Helper method that translates a connection error code into a string. + * @param {number} errorCode The error code. + * @param {Blockly.Connection} a One of the two connections being checked. + * @param {Blockly.Connection} b The second of the two connections being + * checked. + * @return {string} A developer-readable error string. + * @public + */ +Blockly.ConnectionChecker.prototype.getErrorMessage = function(errorCode, + a, b) { + switch (errorCode) { + case Blockly.Connection.REASON_SELF_CONNECTION: + return 'Attempted to connect a block to itself.'; + case Blockly.Connection.REASON_DIFFERENT_WORKSPACES: + // Usually this means one block has been deleted. + return 'Blocks not on same workspace.'; + case Blockly.Connection.REASON_WRONG_TYPE: + return 'Attempt to connect incompatible types.'; + case Blockly.Connection.REASON_TARGET_NULL: + return 'Target connection is null.'; + case Blockly.Connection.REASON_CHECKS_FAILED: + var connOne = /** @type {!Blockly.Connection} **/ (a); + var connTwo = /** @type {!Blockly.Connection} **/ (b); + var msg = 'Connection checks failed. '; + msg += connOne + ' expected ' + connOne.getCheck() + ', found ' + connTwo.getCheck(); + return msg; + case Blockly.Connection.REASON_SHADOW_PARENT: + return 'Connecting non-shadow to shadow block.'; + case Blockly.Connection.REASON_DRAG_CHECKS_FAILED: + return 'Drag checks failed.'; + default: + return 'Unknown connection failure: this should never happen!'; + } +}; + +/** + * Check that connecting the given connections is safe, meaning that it would + * not break any of Blockly's basic assumptions (e.g. no self connections). + * @param {Blockly.Connection} a The first of the connections to check. + * @param {Blockly.Connection} b The second of the connections to check. + * @return {number} An enum with the reason this connection is safe or unsafe. + * @public + */ +Blockly.ConnectionChecker.prototype.doSafetyChecks = function(a, b) { + if (!a || !b) { + return Blockly.Connection.REASON_TARGET_NULL; + } + if (a.isSuperior()) { + var blockA = a.getSourceBlock(); + var blockB = b.getSourceBlock(); + } else { + var blockB = a.getSourceBlock(); + var blockA = b.getSourceBlock(); + } + if (blockA == blockB) { + return Blockly.Connection.REASON_SELF_CONNECTION; + } else if (b.type != Blockly.OPPOSITE_TYPE[a.type]) { + return Blockly.Connection.REASON_WRONG_TYPE; + } else if (blockA.workspace !== blockB.workspace) { + return Blockly.Connection.REASON_DIFFERENT_WORKSPACES; + } else if (blockA.isShadow() && !blockB.isShadow()) { + return Blockly.Connection.REASON_SHADOW_PARENT; + } + return Blockly.Connection.CAN_CONNECT; +}; + +/** + * Check whether this connection is compatible with another connection with + * respect to the value type system. E.g. square_root("Hello") is not + * compatible. + * @param {!Blockly.Connection} a Connection to compare. + * @param {!Blockly.Connection} b Connection to compare against. + * @return {boolean} True if the connections share a type. + * @public + */ +Blockly.ConnectionChecker.prototype.doTypeChecks = function(a, b) { + var checkArrayOne = a.getCheck(); + var checkArrayTwo = b.getCheck(); + + if (!checkArrayOne || !checkArrayTwo) { + // One or both sides are promiscuous enough that anything will fit. + return true; + } + // Find any intersection in the check lists. + for (var i = 0; i < checkArrayOne.length; i++) { + if (checkArrayTwo.indexOf(checkArrayOne[i]) != -1) { + return true; + } + } + // No intersection. + return false; +}; + +/** + * Check whether this connection can be made by dragging. + * @param {!Blockly.RenderedConnection} a Connection to compare. + * @param {!Blockly.RenderedConnection} b Connection to compare against. + * @param {number} distance The maximum allowable distance between connections. + * @return {boolean} True if the connection is allowed during a drag. + * @public + */ +Blockly.ConnectionChecker.prototype.doDragChecks = function(a, b, distance) { + if (a.distanceFrom(b) > distance) { + return false; + } + + // Don't consider insertion markers. + if (b.getSourceBlock().isInsertionMarker()) { + return false; + } + + switch (b.type) { + case Blockly.PREVIOUS_STATEMENT: + return this.canConnectToPrevious_(a, b); + case Blockly.OUTPUT_VALUE: { + // Don't offer to connect an already connected left (male) value plug to + // an available right (female) value plug. + if ((b.isConnected() && + !b.targetBlock().isInsertionMarker()) || + a.isConnected()) { + return false; + } + break; + } + case Blockly.INPUT_VALUE: { + // Offering to connect the left (male) of a value block to an already + // connected value pair is ok, we'll splice it in. + // However, don't offer to splice into an immovable block. + if (b.isConnected() && + !b.targetBlock().isMovable() && + !b.targetBlock().isShadow()) { + return false; + } + break; + } + case Blockly.NEXT_STATEMENT: { + // Don't let a block with no next connection bump other blocks out of the + // stack. But covering up a shadow block or stack of shadow blocks is + // fine. Similarly, replacing a terminal statement with another terminal + // statement is allowed. + if (b.isConnected() && + !a.getSourceBlock().nextConnection && + !b.targetBlock().isShadow() && + b.targetBlock().nextConnection) { + return false; + } + break; + } + default: + // Unexpected connection type. + return false; + } + + // Don't let blocks try to connect to themselves or ones they nest. + if (Blockly.draggingConnections.indexOf(b) != -1) { + return false; + } + + return true; +}; + +/** + * Helper function for drag checking. + * @param {!Blockly.Connection} a The connection to check, which must be a + * statement input or next connection. + * @param {!Blockly.Connection} b A nearby connection to check, which + * must be a previous connection. + * @return {boolean} True if the connection is allowed, false otherwise. + * @protected + */ +Blockly.ConnectionChecker.prototype.canConnectToPrevious_ = function(a, b) { + if (a.targetConnection) { + // This connection is already occupied. + // A next connection will never disconnect itself mid-drag. + return false; + } + + // Don't let blocks try to connect to themselves or ones they nest. + if (Blockly.draggingConnections.indexOf(b) != -1) { + return false; + } + + if (!b.targetConnection) { + return true; + } + + var targetBlock = b.targetBlock(); + // If it is connected to a real block, game over. + if (!targetBlock.isInsertionMarker()) { + return false; + } + // If it's connected to an insertion marker but that insertion marker + // is the first block in a stack, it's still fine. If that insertion + // marker is in the middle of a stack, it won't work. + return !targetBlock.getPreviousBlock(); +}; + +Blockly.registry.register(Blockly.registry.Type.CONNECTION_CHECKER, + Blockly.registry.DEFAULT, Blockly.ConnectionChecker); diff --git a/static/js/dist/core/connection_db.js b/static/js/dist/core/connection_db.js new file mode 100644 index 0000000..a5218d4 --- /dev/null +++ b/static/js/dist/core/connection_db.js @@ -0,0 +1,296 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A database of all the rendered connections that could + * possibly be connected to (i.e. not collapsed, etc). + * Sorted by y coordinate. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.ConnectionDB'); + +goog.require('Blockly.constants'); +goog.require('Blockly.RenderedConnection'); + +goog.requireType('Blockly.IConnectionChecker'); + + +/** + * 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. + * @param {!Blockly.IConnectionChecker} checker The workspace's + * connection type checker, used to decide if connections are valid during a + * drag. + * @constructor + */ +Blockly.ConnectionDB = function(checker) { + /** + * Array of connections sorted by y position in workspace units. + * @type {!Array.} + * @private + */ + this.connections_ = []; + /** + * The workspace's connection type checker, used to decide if connections are + * valid during a drag. + * @type {!Blockly.IConnectionChecker} + * @private + */ + this.connectionChecker_ = checker; +}; + +/** + * 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 + */ +Blockly.ConnectionDB.prototype.addConnection = function(connection, yPos) { + var index = this.calculateIndexForYPos_(yPos); + this.connections_.splice(index, 0, connection); +}; + +/** + * Finds the index of the given connection. + * + * Starts by doing a binary search to find the approximate location, then + * linearly searches nearby for the exact connection. + * @param {!Blockly.RenderedConnection} conn The connection to find. + * @param {number} yPos The y position used to find the index of the connection. + * @return {number} The index of the connection, or -1 if the connection was + * not found. + * @private + */ +Blockly.ConnectionDB.prototype.findIndexOfConnection_ = function(conn, yPos) { + if (!this.connections_.length) { + return -1; + } + + var bestGuess = this.calculateIndexForYPos_(yPos); + if (bestGuess >= this.connections_.length) { + // Not in list + return -1; + } + + yPos = conn.y; + // Walk forward and back on the y axis looking for the connection. + var pointerMin = bestGuess; + var pointerMax = bestGuess; + while (pointerMin >= 0 && this.connections_[pointerMin].y == yPos) { + if (this.connections_[pointerMin] == conn) { + return pointerMin; + } + pointerMin--; + } + + while (pointerMax < this.connections_.length && + this.connections_[pointerMax].y == yPos) { + if (this.connections_[pointerMax] == conn) { + return pointerMax; + } + pointerMax++; + } + return -1; +}; + +/** + * Finds the correct index for the given y position. + * @param {number} yPos The y position used to decide where to + * insert the connection. + * @return {number} The candidate index. + * @private + */ +Blockly.ConnectionDB.prototype.calculateIndexForYPos_ = function(yPos) { + if (!this.connections_.length) { + return 0; + } + var pointerMin = 0; + var pointerMax = this.connections_.length; + while (pointerMin < pointerMax) { + var pointerMid = Math.floor((pointerMin + pointerMax) / 2); + if (this.connections_[pointerMid].y < yPos) { + pointerMin = pointerMid + 1; + } else if (this.connections_[pointerMid].y > yPos) { + pointerMax = pointerMid; + } else { + pointerMin = pointerMid; + break; + } + } + return pointerMin; +}; + +/** + * 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. + */ +Blockly.ConnectionDB.prototype.removeConnection = function(connection, yPos) { + var index = this.findIndexOfConnection_(connection, yPos); + if (index == -1) { + throw Error('Unable to find connection in connectionDB.'); + } + this.connections_.splice(index, 1); +}; + +/** + * 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. + */ +Blockly.ConnectionDB.prototype.getNeighbours = function(connection, maxRadius) { + var db = this.connections_; + var currentX = connection.x; + var currentY = connection.y; + + // Binary search to find the closest y location. + var pointerMin = 0; + var pointerMax = db.length - 2; + var pointerMid = pointerMax; + while (pointerMin < pointerMid) { + if (db[pointerMid].y < currentY) { + pointerMin = pointerMid; + } else { + pointerMax = pointerMid; + } + pointerMid = Math.floor((pointerMin + pointerMax) / 2); + } + + var neighbours = []; + /** + * Computes if the current connection is within the allowed radius of another + * connection. + * This function is a closure and has access to outside variables. + * @param {number} yIndex The other connection's index in the database. + * @return {boolean} True if the current connection's vertical distance from + * the other connection is less than the allowed radius. + */ + function checkConnection_(yIndex) { + var dx = currentX - db[yIndex].x; + var dy = currentY - db[yIndex].y; + var r = Math.sqrt(dx * dx + dy * dy); + if (r <= maxRadius) { + neighbours.push(db[yIndex]); + } + return dy < maxRadius; + } + + // Walk forward and back on the y axis looking for the closest x,y point. + pointerMin = pointerMid; + pointerMax = pointerMid; + if (db.length) { + while (pointerMin >= 0 && checkConnection_(pointerMin)) { + pointerMin--; + } + do { + pointerMax++; + } while (pointerMax < db.length && checkConnection_(pointerMax)); + } + + return neighbours; +}; + +/** + * Is the candidate connection close to the reference connection. + * Extremely fast; only looks at Y distance. + * @param {number} index Index in database of candidate connection. + * @param {number} baseY Reference connection's Y value. + * @param {number} maxRadius The maximum radius to another connection. + * @return {boolean} True if connection is in range. + * @private + */ +Blockly.ConnectionDB.prototype.isInYRange_ = function(index, baseY, maxRadius) { + return (Math.abs(this.connections_[index].y - baseY) <= maxRadius); +}; + +/** + * 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. + */ +Blockly.ConnectionDB.prototype.searchForClosest = function(conn, maxRadius, + dxy) { + if (!this.connections_.length) { + // Don't bother. + return {connection: null, radius: maxRadius}; + } + + // Stash the values of x and y from before the drag. + var baseY = conn.y; + var baseX = conn.x; + + conn.x = baseX + dxy.x; + conn.y = baseY + dxy.y; + + // calculateIndexForYPos_ finds an index for insertion, which is always + // after any block with the same y index. We want to search both forward + // and back, so search on both sides of the index. + var closestIndex = this.calculateIndexForYPos_(conn.y); + + var bestConnection = null; + var bestRadius = maxRadius; + var temp; + + // Walk forward and back on the y axis looking for the closest x,y point. + var pointerMin = closestIndex - 1; + while (pointerMin >= 0 && this.isInYRange_(pointerMin, conn.y, maxRadius)) { + temp = this.connections_[pointerMin]; + if (this.connectionChecker_.canConnect(conn, temp, true, bestRadius)) { + bestConnection = temp; + bestRadius = temp.distanceFrom(conn); + } + pointerMin--; + } + + var pointerMax = closestIndex; + while (pointerMax < this.connections_.length && + this.isInYRange_(pointerMax, conn.y, maxRadius)) { + temp = this.connections_[pointerMax]; + if (this.connectionChecker_.canConnect(conn, temp, true, bestRadius)) { + bestConnection = temp; + bestRadius = temp.distanceFrom(conn); + } + pointerMax++; + } + + // Reset the values of x and y. + conn.x = baseX; + conn.y = baseY; + + // If there were no valid connections, bestConnection will be null. + return {connection: bestConnection, radius: bestRadius}; +}; + +/** + * Initialize a set of connection DBs for a workspace. + * @param {!Blockly.IConnectionChecker} checker The workspace's + * connection checker, used to decide if connections are valid during a drag. + * @return {!Array.} Array of databases. + */ +Blockly.ConnectionDB.init = function(checker) { + // Create four databases, one for each connection type. + var dbList = []; + dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(checker); + dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(checker); + dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(checker); + dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(checker); + return dbList; +}; diff --git a/static/js/dist/core/constants.js b/static/js/dist/core/constants.js new file mode 100644 index 0000000..8914bd1 --- /dev/null +++ b/static/js/dist/core/constants.js @@ -0,0 +1,277 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly constants. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.constants'); + +/** + * The multiplier for scroll wheel deltas using the line delta mode. + * @type {number} + */ +Blockly.LINE_MODE_MULTIPLIER = 40; + +/** + * The multiplier for scroll wheel deltas using the page delta mode. + * @type {number} + */ +Blockly.PAGE_MODE_MULTIPLIER = 125; + +/** + * Number of pixels the mouse must move before a drag starts. + */ +Blockly.DRAG_RADIUS = 5; + +/** + * 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. + */ +Blockly.FLYOUT_DRAG_RADIUS = 10; + +/** + * Maximum misalignment between connections for them to snap together. + */ +Blockly.SNAP_RADIUS = 28; + +/** + * Maximum misalignment between connections for them to snap together, + * when a connection is already highlighted. + */ +Blockly.CONNECTING_SNAP_RADIUS = Blockly.SNAP_RADIUS; + +/** + * How much to prefer staying connected to the current connection over moving to + * a new connection. The current previewed connection is considered to be this + * much closer to the matching connection on the block than it actually is. + */ +Blockly.CURRENT_CONNECTION_PREFERENCE = 8; + +/** + * Delay in ms between trigger and bumping unconnected block out of alignment. + */ +Blockly.BUMP_DELAY = 250; + +/** + * Maximum randomness in workspace units for bumping a block. + */ +Blockly.BUMP_RANDOMNESS = 10; + +/** + * Number of characters to truncate a collapsed block to. + */ +Blockly.COLLAPSE_CHARS = 30; + +/** + * Length in ms for a touch to become a long press. + */ +Blockly.LONGPRESS = 750; + +/** + * Prevent a sound from playing if another sound preceded it within this many + * milliseconds. + */ +Blockly.SOUND_LIMIT = 100; + +/** + * When dragging a block out of a stack, split the stack in two (true), or drag + * out the block healing the stack (false). + */ +Blockly.DRAG_STACK = true; + +/** + * The richness of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ +Blockly.HSV_SATURATION = 0.45; + +/** + * The intensity of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ +Blockly.HSV_VALUE = 0.65; + +/** + * Sprited icons and images. + */ +Blockly.SPRITE = { + width: 96, + height: 124, + url: 'sprites.png' +}; + +// Constants below this point are not intended to be changed. + +/** + * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. + * @const + */ +Blockly.INPUT_VALUE = 1; + +/** + * ENUM for a left-facing value output. E.g. 'random fraction'. + * @const + */ +Blockly.OUTPUT_VALUE = 2; + +/** + * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. + * @const + */ +Blockly.NEXT_STATEMENT = 3; + +/** + * ENUM for an up-facing block stack. E.g. 'break out of loop'. + * @const + */ +Blockly.PREVIOUS_STATEMENT = 4; + +/** + * ENUM for an dummy input. Used to add field(s) with no input. + * @const + */ +Blockly.DUMMY_INPUT = 5; + +/** + * ENUM for left alignment. + * @const + */ +Blockly.ALIGN_LEFT = -1; + +/** + * ENUM for centre alignment. + * @const + */ +Blockly.ALIGN_CENTRE = 0; + +/** + * ENUM for right alignment. + * @const + */ +Blockly.ALIGN_RIGHT = 1; + +/** + * ENUM for no drag operation. + * @const + */ +Blockly.DRAG_NONE = 0; + +/** + * ENUM for inside the sticky DRAG_RADIUS. + * @const + */ +Blockly.DRAG_STICKY = 1; + +/** + * ENUM for inside the non-sticky DRAG_RADIUS, for differentiating between + * clicks and drags. + * @const + */ +Blockly.DRAG_BEGIN = 1; + +/** + * ENUM for freely draggable (outside the DRAG_RADIUS, if one applies). + * @const + */ +Blockly.DRAG_FREE = 2; + +/** + * Lookup table for determining the opposite type of a connection. + * @const + */ +Blockly.OPPOSITE_TYPE = []; +Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; +Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; + + +/** + * ENUM for toolbox and flyout at top of screen. + * @const + */ +Blockly.TOOLBOX_AT_TOP = 0; + +/** + * ENUM for toolbox and flyout at bottom of screen. + * @const + */ +Blockly.TOOLBOX_AT_BOTTOM = 1; + +/** + * ENUM for toolbox and flyout at left of screen. + * @const + */ +Blockly.TOOLBOX_AT_LEFT = 2; + +/** + * ENUM for toolbox and flyout at right of screen. + * @const + */ +Blockly.TOOLBOX_AT_RIGHT = 3; + +/** + * ENUM representing that an event is not in any delete areas. + * Null for backwards compatibility reasons. + * @const + */ +Blockly.DELETE_AREA_NONE = null; + +/** + * ENUM representing that an event is in the delete area of the trash can. + * @const + */ +Blockly.DELETE_AREA_TRASH = 1; + +/** + * ENUM representing that an event is in the delete area of the toolbox or + * flyout. + * @const + */ +Blockly.DELETE_AREA_TOOLBOX = 2; + +/** + * 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} + */ +Blockly.VARIABLE_CATEGORY_NAME = 'VARIABLE'; +/** + * 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} + */ +Blockly.VARIABLE_DYNAMIC_CATEGORY_NAME = 'VARIABLE_DYNAMIC'; + +/** + * 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} + */ +Blockly.PROCEDURE_CATEGORY_NAME = 'PROCEDURE'; + +/** + * 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} + */ +Blockly.RENAME_VARIABLE_ID = 'RENAME_VARIABLE_ID'; + +/** + * 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} + */ +Blockly.DELETE_VARIABLE_ID = 'DELETE_VARIABLE_ID'; diff --git a/static/js/dist/core/contextmenu.js b/static/js/dist/core/contextmenu.js new file mode 100644 index 0000000..9d7b6e0 --- /dev/null +++ b/static/js/dist/core/contextmenu.js @@ -0,0 +1,308 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Functionality for the right-click context menus. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.ContextMenu + * @namespace + */ +goog.provide('Blockly.ContextMenu'); + +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockCreate'); +goog.require('Blockly.Menu'); +goog.require('Blockly.MenuItem'); +goog.require('Blockly.Msg'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Rect'); +goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.Xml'); + + +/** + * Which block is the context menu attached to? + * @type {Blockly.Block} + */ +Blockly.ContextMenu.currentBlock = null; + +/** + * Menu object. + * @type {Blockly.Menu} + * @private + */ +Blockly.ContextMenu.menu_ = null; + +/** + * 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. + */ +Blockly.ContextMenu.show = function(e, options, rtl) { + Blockly.WidgetDiv.show(Blockly.ContextMenu, rtl, Blockly.ContextMenu.dispose); + if (!options.length) { + Blockly.ContextMenu.hide(); + return; + } + var menu = Blockly.ContextMenu.populate_(options, rtl); + Blockly.ContextMenu.menu_ = menu; + + Blockly.ContextMenu.position_(menu, e, rtl); + // 1ms delay is required for focusing on context menus because some other + // mouse event is still waiting in the queue and clears focus. + setTimeout(function() {menu.focus();}, 1); + Blockly.ContextMenu.currentBlock = null; // May be set by Blockly.Block. +}; + +/** + * Create the context menu object and populate it with the given options. + * @param {!Array.} options Array of menu options. + * @param {boolean} rtl True if RTL, false if LTR. + * @return {!Blockly.Menu} The menu that will be shown on right click. + * @private + */ +Blockly.ContextMenu.populate_ = function(options, rtl) { + /* Here's what one option object looks like: + {text: 'Make It So', + enabled: true, + callback: Blockly.MakeItSo} + */ + var menu = new Blockly.Menu(); + menu.setRole(Blockly.utils.aria.Role.MENU); + for (var i = 0, option; (option = options[i]); i++) { + var menuItem = new Blockly.MenuItem(option.text); + menuItem.setRightToLeft(rtl); + menuItem.setRole(Blockly.utils.aria.Role.MENUITEM); + menu.addChild(menuItem); + menuItem.setEnabled(option.enabled); + if (option.enabled) { + var actionHandler = function(_menuItem) { + var option = this; + Blockly.ContextMenu.hide(); + option.callback(option.scope); + }; + menuItem.onAction(actionHandler, option); + } + } + return menu; +}; + +/** + * Add the menu to the page and position it correctly. + * @param {!Blockly.Menu} menu The menu to add and position. + * @param {!Event} e Mouse event for the right click that is making the context + * menu appear. + * @param {boolean} rtl True if RTL, false if LTR. + * @private + */ +Blockly.ContextMenu.position_ = function(menu, e, rtl) { + // Record windowSize and scrollOffset before adding menu. + var viewportBBox = Blockly.utils.getViewportBBox(); + // This one is just a point, but we'll pretend that it's a rect so we can use + // some helper functions. + var anchorBBox = new Blockly.utils.Rect( + e.clientY + viewportBBox.top, + e.clientY + viewportBBox.top, + e.clientX + viewportBBox.left, + e.clientX + viewportBBox.left + ); + + Blockly.ContextMenu.createWidget_(menu); + var menuSize = menu.getSize(); + + if (rtl) { + anchorBBox.left += menuSize.width; + anchorBBox.right += menuSize.width; + viewportBBox.left += menuSize.width; + viewportBBox.right += menuSize.width; + } + + Blockly.WidgetDiv.positionWithAnchor(viewportBBox, anchorBBox, menuSize, rtl); + // Calling menuDom.focus() has to wait until after the menu has been placed + // correctly. Otherwise it will cause a page scroll to get the misplaced menu + // in view. See issue #1329. + menu.focus(); +}; + +/** + * Create and render the menu widget inside Blockly's widget div. + * @param {!Blockly.Menu} menu The menu to add to the widget div. + * @private + */ +Blockly.ContextMenu.createWidget_ = function(menu) { + var div = Blockly.WidgetDiv.DIV; + menu.render(div); + var menuDom = menu.getElement(); + Blockly.utils.dom.addClass( + /** @type {!Element} */ (menuDom), 'blocklyContextMenu'); + // Prevent system context menu when right-clicking a Blockly context menu. + Blockly.bindEventWithChecks_(/** @type {!EventTarget} */ (menuDom), + 'contextmenu', null, Blockly.utils.noEvent); + // Focus only after the initial render to avoid issue #1329. + menu.focus(); +}; + +/** + * Hide the context menu. + */ +Blockly.ContextMenu.hide = function() { + Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu); + Blockly.ContextMenu.currentBlock = null; +}; + +/** + * Dispose of the menu. + */ +Blockly.ContextMenu.dispose = function() { + if (Blockly.ContextMenu.menu_) { + Blockly.ContextMenu.menu_.dispose(); + Blockly.ContextMenu.menu_ = null; + } +}; + +/** + * 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. + */ +Blockly.ContextMenu.callbackFactory = function(block, xml) { + return function() { + Blockly.Events.disable(); + try { + var newBlock = Blockly.Xml.domToBlock(xml, block.workspace); + // Move the new block next to the old block. + var xy = block.getRelativeToSurfaceXY(); + if (block.RTL) { + xy.x -= Blockly.SNAP_RADIUS; + } else { + xy.x += Blockly.SNAP_RADIUS; + } + xy.y += Blockly.SNAP_RADIUS * 2; + newBlock.moveBy(xy.x, xy.y); + } finally { + Blockly.Events.enable(); + } + if (Blockly.Events.isEnabled() && !newBlock.isShadow()) { + Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); + } + newBlock.select(); + }; +}; + +// Helper functions for creating context menu options. + +/** + * 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 + */ +Blockly.ContextMenu.commentDeleteOption = function(comment) { + var deleteOption = { + text: Blockly.Msg['REMOVE_COMMENT'], + enabled: true, + callback: function() { + Blockly.Events.setGroup(true); + comment.dispose(true, true); + Blockly.Events.setGroup(false); + } + }; + return deleteOption; +}; + +/** + * 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 + */ +Blockly.ContextMenu.commentDuplicateOption = function(comment) { + var duplicateOption = { + text: Blockly.Msg['DUPLICATE_COMMENT'], + enabled: true, + callback: function() { + Blockly.duplicate(comment); + } + }; + return duplicateOption; +}; + +/** + * 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. + */ +Blockly.ContextMenu.workspaceCommentOption = function(ws, e) { + if (!Blockly.WorkspaceCommentSvg) { + throw Error('Missing require for Blockly.WorkspaceCommentSvg'); + } + // Helper function to create and position a comment correctly based on the + // location of the mouse event. + var addWsComment = function() { + var comment = new Blockly.WorkspaceCommentSvg( + ws, Blockly.Msg['WORKSPACE_COMMENT_DEFAULT_TEXT'], + Blockly.WorkspaceCommentSvg.DEFAULT_SIZE, + Blockly.WorkspaceCommentSvg.DEFAULT_SIZE); + + var injectionDiv = ws.getInjectionDiv(); + // Bounding rect coordinates are in client coordinates, meaning that they + // are in pixels relative to the upper left corner of the visible browser + // window. These coordinates change when you scroll the browser window. + var boundingRect = injectionDiv.getBoundingClientRect(); + + // The client coordinates offset by the injection div's upper left corner. + var clientOffsetPixels = new Blockly.utils.Coordinate( + e.clientX - boundingRect.left, e.clientY - boundingRect.top); + + // The offset in pixels between the main workspace's origin and the upper + // left corner of the injection div. + var mainOffsetPixels = ws.getOriginOffsetInPixels(); + + // The position of the new comment in pixels relative to the origin of the + // main workspace. + var finalOffset = Blockly.utils.Coordinate.difference(clientOffsetPixels, + mainOffsetPixels); + // The position of the new comment in main workspace coordinates. + finalOffset.scale(1 / ws.scale); + + var commentX = finalOffset.x; + var commentY = finalOffset.y; + comment.moveBy(commentX, commentY); + if (ws.rendered) { + comment.initSvg(); + comment.render(); + comment.select(); + } + }; + + var wsCommentOption = { + // Foreign objects don't work in IE. Don't let the user create comments + // that they won't be able to edit. + enabled: !Blockly.utils.userAgent.IE + }; + wsCommentOption.text = Blockly.Msg['ADD_COMMENT']; + wsCommentOption.callback = function() { + addWsComment(); + }; + return wsCommentOption; +}; diff --git a/static/js/dist/core/contextmenu_items.js b/static/js/dist/core/contextmenu_items.js new file mode 100644 index 0000000..a33126d --- /dev/null +++ b/static/js/dist/core/contextmenu_items.js @@ -0,0 +1,536 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Registers default context menu items. + * @author maribethb@google.com (Maribeth Bottorff) + */ +'use strict'; + +/** + * @name Blockly.ContextMenuItems + * @namespace + */ +goog.provide('Blockly.ContextMenuItems'); + +goog.require('Blockly.constants'); + +goog.requireType('Blockly.BlockSvg'); + +/** Option to undo previous action. */ +Blockly.ContextMenuItems.registerUndo = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var undoOption = { + displayText: function() { + return Blockly.Msg['UNDO']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.workspace.getUndoStack().length > 0) { + return 'enabled'; + } + return 'disabled'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + scope.workspace.undo(false); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.WORKSPACE, + id: 'undoWorkspace', + weight: 1, + }; + Blockly.ContextMenuRegistry.registry.register(undoOption); +}; + +/** Option to redo previous action. */ +Blockly.ContextMenuItems.registerRedo = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var redoOption = { + displayText: function() { return Blockly.Msg['REDO']; }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.workspace.getRedoStack().length > 0) { + return 'enabled'; + } + return 'disabled'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + scope.workspace.undo(true); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.WORKSPACE, + id: 'redoWorkspace', + weight: 2, + }; + Blockly.ContextMenuRegistry.registry.register(redoOption); +}; + +/** Option to clean up blocks. */ +Blockly.ContextMenuItems.registerCleanup = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var cleanOption = { + displayText: function() { + return Blockly.Msg['CLEAN_UP']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.workspace.isMovable()) { + if (scope.workspace.getTopBlocks(false).length > 1) { + return 'enabled'; + } + return 'disabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + scope.workspace.cleanUp(); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.WORKSPACE, + id: 'cleanWorkspace', + weight: 3, + }; + Blockly.ContextMenuRegistry.registry.register(cleanOption); +}; + +/** + * Creates a callback to collapse or expand top blocks. + * @param {boolean} shouldCollapse Whether a block should collapse. + * @param {!Array} topBlocks Top blocks in the workspace. + * @private + */ +Blockly.ContextMenuItems.toggleOption_ = function(shouldCollapse, topBlocks) { + var DELAY = 10; + var ms = 0; + for (var i = 0; i < topBlocks.length; i++) { + var block = topBlocks[i]; + while (block) { + setTimeout(block.setCollapsed.bind(block, shouldCollapse), ms); + block = block.getNextBlock(); + ms += DELAY; + } + } +}; + +/** Option to collapse all blocks. */ +Blockly.ContextMenuItems.registerCollapse = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var collapseOption = { + displayText: function() { + return Blockly.Msg['COLLAPSE_ALL']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.workspace.options.collapse) { + var topBlocks = scope.workspace.getTopBlocks(false); + for (var i = 0; i < topBlocks.length; i++) { + var block = topBlocks[i]; + while (block) { + if (!block.isCollapsed()) { + return 'enabled'; + } + block = block.getNextBlock(); + } + } + return 'disabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + Blockly.ContextMenuItems.toggleOption_(true, scope.workspace.getTopBlocks(true)); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.WORKSPACE, + id: 'collapseWorkspace', + weight: 4, + }; + Blockly.ContextMenuRegistry.registry.register(collapseOption); +}; + +/** Option to expand all blocks. */ +Blockly.ContextMenuItems.registerExpand = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var expandOption = { + displayText: function() { + return Blockly.Msg['EXPAND_ALL']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.workspace.options.collapse) { + var topBlocks = scope.workspace.getTopBlocks(false); + for (var i = 0; i < topBlocks.length; i++) { + var block = topBlocks[i]; + while (block) { + if (block.isCollapsed()) { + return 'enabled'; + } + block = block.getNextBlock(); + } + } + return 'disabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + Blockly.ContextMenuItems.toggleOption_(false, scope.workspace.getTopBlocks(true)); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.WORKSPACE, + id: 'expandWorkspace', + weight: 5, + }; + Blockly.ContextMenuRegistry.registry.register(expandOption); +}; + +/** + * Adds a block and its children to a list of deletable blocks. + * @param {!Blockly.BlockSvg} block to delete. + * @param {!Array.} deleteList list of blocks that can be deleted. This will be + * modifed in place with the given block and its descendants. + * @private + */ +Blockly.ContextMenuItems.addDeletableBlocks_ = function(block, deleteList) { + if (block.isDeletable()) { + Array.prototype.push.apply(deleteList, block.getDescendants(false)); + } else { + var children = /** @type !Array. */ (block.getChildren(false)); + for (var i = 0; i < children.length; i++) { + Blockly.ContextMenuItems.addDeletableBlocks_(children[i], deleteList); + } + } +}; + +/** + * Constructs a list of blocks that can be deleted in the given workspace. + * @param {!Blockly.WorkspaceSvg} workspace to delete all blocks from. + * @return {!Array.} list of blocks to delete. + * @private + */ +Blockly.ContextMenuItems.getDeletableBlocks_ = function(workspace) { + var deleteList = []; + var topBlocks = workspace.getTopBlocks(true); + for (var i = 0; i < topBlocks.length; i++) { + Blockly.ContextMenuItems.addDeletableBlocks_(topBlocks[i], deleteList); + } + return deleteList; +}; + +/** Deletes the given blocks. Used to delete all blocks in the workspace. + * @param {!Array.} deleteList list of blocks to delete. + * @param {string} eventGroup event group id with which all delete events should be associated. + * @private + */ +Blockly.ContextMenuItems.deleteNext_ = function(deleteList, eventGroup) { + var DELAY = 10; + Blockly.Events.setGroup(eventGroup); + var block = deleteList.shift(); + if (block) { + if (block.workspace) { + block.dispose(false, true); + setTimeout(Blockly.ContextMenuItems.deleteNext_, DELAY, deleteList, eventGroup); + } else { + Blockly.ContextMenuItems.deleteNext_(deleteList, eventGroup); + } + } + Blockly.Events.setGroup(false); +}; + +/** Option to delete all blocks. */ +Blockly.ContextMenuItems.registerDeleteAll = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var deleteOption = { + displayText: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (!scope.workspace) { + return; + } + var deletableBlocksLength = + Blockly.ContextMenuItems.getDeletableBlocks_(scope.workspace).length; + if (deletableBlocksLength == 1) { + return Blockly.Msg['DELETE_BLOCK']; + } else { + return Blockly.Msg['DELETE_X_BLOCKS'].replace('%1', String(deletableBlocksLength)); + } + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (!scope.workspace) { + return; + } + var deletableBlocksLength = + Blockly.ContextMenuItems.getDeletableBlocks_(scope.workspace).length; + return deletableBlocksLength > 0 ? 'enabled' : 'disabled'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (!scope.workspace) { + return; + } + scope.workspace.cancelCurrentGesture(); + var deletableBlocks = Blockly.ContextMenuItems.getDeletableBlocks_(scope.workspace); + var eventGroup = Blockly.utils.genUid(); + if (deletableBlocks.length < 2) { + Blockly.ContextMenuItems.deleteNext_(deletableBlocks, eventGroup); + } else { + Blockly.confirm( + Blockly.Msg['DELETE_ALL_BLOCKS'].replace('%1', deletableBlocks.length), + function(ok) { + if (ok) { + Blockly.ContextMenuItems.deleteNext_(deletableBlocks, eventGroup); + } + }); + } + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.WORKSPACE, + id: 'workspaceDelete', + weight: 6, + }; + Blockly.ContextMenuRegistry.registry.register(deleteOption); +}; + +/** + * Registers all workspace-scoped context menu items. + * @private + */ +Blockly.ContextMenuItems.registerWorkspaceOptions_ = function() { + Blockly.ContextMenuItems.registerUndo(); + Blockly.ContextMenuItems.registerRedo(); + Blockly.ContextMenuItems.registerCleanup(); + Blockly.ContextMenuItems.registerCollapse(); + Blockly.ContextMenuItems.registerExpand(); + Blockly.ContextMenuItems.registerDeleteAll(); +}; + +/** Option to duplicate a block. */ +Blockly.ContextMenuItems.registerDuplicate = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var duplicateOption = { + displayText: function() { + return Blockly.Msg['DUPLICATE_BLOCK']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + if (!block.isInFlyout && block.isDeletable() && block.isMovable()) { + if (block.isDuplicatable()) { + return 'enabled'; + } + return 'disabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.block) { + Blockly.duplicate(scope.block); + } + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockDuplicate', + weight: 1, + }; + Blockly.ContextMenuRegistry.registry.register(duplicateOption); +}; + +/** Option to add or remove block-level comment. */ +Blockly.ContextMenuItems.registerComment = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var commentOption = { + displayText: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.block.getCommentIcon()) { + // If there's already a comment, option is to remove. + return Blockly.Msg['REMOVE_COMMENT']; + } + // If there's no comment yet, option is to add. + return Blockly.Msg['ADD_COMMENT']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + // IE doesn't support necessary features for comment editing. + if (!Blockly.utils.userAgent.IE && !block.isInFlyout && block.workspace.options.comments && + !block.isCollapsed() && block.isEditable()) { + return 'enabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + if (block.getCommentIcon()) { + block.setCommentText(null); + } else { + block.setCommentText(''); + } + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockComment', + weight: 2, + }; + Blockly.ContextMenuRegistry.registry.register(commentOption); +}; + +/** Option to inline variables. */ +Blockly.ContextMenuItems.registerInline = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var inlineOption = { + displayText: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + return (scope.block.getInputsInline()) ? + Blockly.Msg['EXTERNAL_INPUTS'] : Blockly.Msg['INLINE_INPUTS']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + if (!block.isInFlyout && block.isMovable() && !block.isCollapsed()) { + for (var i = 1; i < block.inputList.length; i++) { + // Only display this option if there are two value or dummy inputs next to each other. + if (block.inputList[i - 1].type != Blockly.NEXT_STATEMENT && + block.inputList[i].type != Blockly.NEXT_STATEMENT) { + return 'enabled'; + } + } + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + scope.block.setInputsInline(!scope.block.getInputsInline()); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockInline', + weight: 3, + }; + Blockly.ContextMenuRegistry.registry.register(inlineOption); +}; + +/** Option to collapse or expand a block. */ +Blockly.ContextMenuItems.registerCollapseExpandBlock = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var collapseExpandOption = { + displayText: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (scope.block.isCollapsed()) { + return Blockly.Msg['EXPAND_BLOCK']; + } + return Blockly.Msg['COLLAPSE_BLOCK']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + if (!block.isInFlyout && block.isMovable()) { + return 'enabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + scope.block.setCollapsed(!scope.block.isCollapsed()); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockCollapseExpand', + weight: 4, + }; + Blockly.ContextMenuRegistry.registry.register(collapseExpandOption); +}; + +/** Option to disable or enable a block. */ +Blockly.ContextMenuItems.registerDisable = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var disableOption = { + displayText: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + return (scope.block.isEnabled()) ? + Blockly.Msg['DISABLE_BLOCK'] : Blockly.Msg['ENABLE_BLOCK']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + if (!block.isInFlyout && block.workspace.options.disable && block.isEditable()) { + if (block.getInheritedDisabled()) { + return 'disabled'; + } + return 'enabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + var group = Blockly.Events.getGroup(); + if (!group) { + Blockly.Events.setGroup(true); + } + block.setEnabled(!block.isEnabled()); + if (!group) { + Blockly.Events.setGroup(false); + } + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockDisable', + weight: 5, + }; + Blockly.ContextMenuRegistry.registry.register(disableOption); +}; + +/** Option to delete a block. */ +Blockly.ContextMenuItems.registerDelete = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var deleteOption = { + displayText: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + // Count the number of blocks that are nested in this block. + var descendantCount = block.getDescendants(false).length; + var nextBlock = block.getNextBlock(); + if (nextBlock) { + // Blocks in the current stack would survive this block's deletion. + descendantCount -= nextBlock.getDescendants(false).length; + } + return (descendantCount == 1) ? Blockly.Msg['DELETE_BLOCK'] : + Blockly.Msg['DELETE_X_BLOCKS'].replace('%1', String(descendantCount)); + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + if (!scope.block.isInFlyout && scope.block.isDeletable()) { + return 'enabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + Blockly.Events.setGroup(true); + scope.block.dispose(true, true); + Blockly.Events.setGroup(false); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockDelete', + weight: 6, + }; + Blockly.ContextMenuRegistry.registry.register(deleteOption); +}; + +/** Option to open help for a block. */ +Blockly.ContextMenuItems.registerHelp = function() { + /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ + var helpOption = { + displayText: function() { + return Blockly.Msg['HELP']; + }, + preconditionFn: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + var block = scope.block; + var url = (typeof block.helpUrl == 'function') ? + block.helpUrl() : block.helpUrl; + if (url) { + return 'enabled'; + } + return 'hidden'; + }, + callback: function(/** @type {!Blockly.ContextMenuRegistry.Scope} */ scope) { + scope.block.showHelp(); + }, + scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, + id: 'blockHelp', + weight: 7, + }; + Blockly.ContextMenuRegistry.registry.register(helpOption); +}; + +/** + * Registers all block-scoped context menu items. + * @private + */ +Blockly.ContextMenuItems.registerBlockOptions_ = function() { + Blockly.ContextMenuItems.registerDuplicate(); + Blockly.ContextMenuItems.registerComment(); + Blockly.ContextMenuItems.registerInline(); + Blockly.ContextMenuItems.registerCollapseExpandBlock(); + Blockly.ContextMenuItems.registerDisable(); + Blockly.ContextMenuItems.registerDelete(); + Blockly.ContextMenuItems.registerHelp(); +}; + +/** + * Registers all default context menu items. This should be called once per instance of + * ContextMenuRegistry. + * @package + */ +Blockly.ContextMenuItems.registerDefaultOptions = function() { + Blockly.ContextMenuItems.registerWorkspaceOptions_(); + Blockly.ContextMenuItems.registerBlockOptions_(); +}; + diff --git a/static/js/dist/core/contextmenu_registry.js b/static/js/dist/core/contextmenu_registry.js new file mode 100644 index 0000000..13a3164 --- /dev/null +++ b/static/js/dist/core/contextmenu_registry.js @@ -0,0 +1,165 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Registry for context menu option items. + * @author maribethb@google.com (Maribeth Bottorff) + */ +'use strict'; + +/** + * @name Blockly.ContextMenuRegistry + * @namespace + */ +goog.provide('Blockly.ContextMenuRegistry'); + +goog.require('Blockly.ContextMenuItems'); + +/** + * Class for the registry of context menu items. This is intended to be a singleton. You should + * not create a new instance, and only access this class from Blockly.ContextMenuRegistry.registry. + * @constructor + */ +Blockly.ContextMenuRegistry = function() { + + // Singleton instance should be registered once. + Blockly.ContextMenuRegistry.registry = this; + + /** + * Registry of all registered RegistryItems, keyed by id. + * @type {!Object} + * @private + */ + this.registry_ = {}; + Blockly.ContextMenuItems.registerDefaultOptions(); +}; + +/** + * Where this menu item should be rendered. If the menu item should be rendered in multiple + * scopes, e.g. on both a block and a workspace, it should be registered for each scope. + * @enum {string} + */ +Blockly.ContextMenuRegistry.ScopeType = { + BLOCK: 'block', + WORKSPACE: 'workspace', +}; + +/** + * The actual workspace/block where the menu is being rendered. This is passed to callback and + * displayText functions that depend on this information. + * @typedef {{ + * block: (Blockly.BlockSvg|undefined), + * workspace: (Blockly.WorkspaceSvg|undefined) + * }} + */ +Blockly.ContextMenuRegistry.Scope; + +/** + * A menu item as entered in the registry. + * @typedef {{ + * callback: function(!Blockly.ContextMenuRegistry.Scope), + * scopeType: !Blockly.ContextMenuRegistry.ScopeType, + * displayText: ((function(!Blockly.ContextMenuRegistry.Scope):string)|string), + * preconditionFn: function(!Blockly.ContextMenuRegistry.Scope):string, + * weight: number, + * id: string + * }} +*/ +Blockly.ContextMenuRegistry.RegistryItem; + +/** + * A menu item as presented to contextmenu.js. + * @typedef {{ + * text: string, + * enabled: boolean, + * callback: function(!Blockly.ContextMenuRegistry.Scope), + * scope: !Blockly.ContextMenuRegistry.Scope, + * weight: number + * }} + */ +Blockly.ContextMenuRegistry.ContextMenuOption; + +/** + * Singleton instance of this class. All interactions with this class should be done on this object. + * @type {?Blockly.ContextMenuRegistry} + */ +Blockly.ContextMenuRegistry.registry = null; + +/** + * Registers a RegistryItem. + * @param {!Blockly.ContextMenuRegistry.RegistryItem} item Context menu item to register. + * @throws {Error} if an item with the given id already exists. + */ +Blockly.ContextMenuRegistry.prototype.register = function(item) { + if (this.registry_[item.id]) { + throw Error('Menu item with id "' + item.id + '" is already registered.'); + } + this.registry_[item.id] = item; +}; + +/** + * Unregisters a RegistryItem with the given id. + * @param {string} id The id of the RegistryItem to remove. + * @throws {Error} if an item with the given id does not exist. + */ +Blockly.ContextMenuRegistry.prototype.unregister = function(id) { + if (this.registry_[id]) { + delete this.registry_[id]; + } else { + throw new Error('Menu item with id "' + id + '" not found.'); + } +}; + +/** + * @param {string} id The id of the RegistryItem to get. + * @returns {?Blockly.ContextMenuRegistry.RegistryItem} RegistryItem or null if not found + */ +Blockly.ContextMenuRegistry.prototype.getItem = function(id) { + if (this.registry_[id]) { + return this.registry_[id]; + } + return null; +}; + +/** + * Gets the valid context menu options for the given scope type (e.g. block or workspace) and scope. + * Blocks are only shown if the preconditionFn shows they should not be hidden. + * @param {!Blockly.ContextMenuRegistry.ScopeType} scopeType Type of scope where menu should be + * shown (e.g. on a block or on a workspace) + * @param {!Blockly.ContextMenuRegistry.Scope} scope Current scope of context menu + * (i.e., the exact workspace or block being clicked on) + * @returns {!Array.} the list of ContextMenuOptions + */ +Blockly.ContextMenuRegistry.prototype.getContextMenuOptions = function(scopeType, scope) { + var menuOptions = []; + var registry = this.registry_; + Object.keys(registry).forEach(function(id) { + var item = registry[id]; + if (scopeType == item.scopeType) { + var precondition = item.preconditionFn(scope); + if (precondition != 'hidden') { + var displayText = typeof item.displayText == 'function' ? + item.displayText(scope) : item.displayText; + /** @type {!Blockly.ContextMenuRegistry.ContextMenuOption} */ + var menuOption = { + text: displayText, + enabled: (precondition == 'enabled'), + callback: item.callback, + scope: scope, + weight: item.weight, + }; + menuOptions.push(menuOption); + } + } + }); + menuOptions.sort(function(a, b) { + return a.weight - b.weight; + }); + return menuOptions; +}; + +// Creates and assigns the singleton instance. +new Blockly.ContextMenuRegistry(); diff --git a/static/js/dist/core/css.js b/static/js/dist/core/css.js new file mode 100644 index 0000000..c359af5 --- /dev/null +++ b/static/js/dist/core/css.js @@ -0,0 +1,552 @@ +/** + * @license + * Copyright 2013 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Inject Blockly's CSS synchronously. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.Css + * @namespace + */ +goog.provide('Blockly.Css'); + + +/** + * Has CSS already been injected? + * @type {boolean} + * @private + */ +Blockly.Css.injected_ = false; + +/** + * 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. + */ +Blockly.Css.register = function(cssArray) { + if (Blockly.Css.injected_) { + throw Error('CSS already injected'); + } + // Concatenate cssArray onto Blockly.Css.CONTENT. + Array.prototype.push.apply(Blockly.Css.CONTENT, cssArray); + cssArray.length = 0; // Garbage collect provided CSS content. +}; + +/** + * 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. + */ +Blockly.Css.inject = function(hasCss, pathToMedia) { + // Only inject the CSS once. + if (Blockly.Css.injected_) { + return; + } + Blockly.Css.injected_ = true; + var text = Blockly.Css.CONTENT.join('\n'); + Blockly.Css.CONTENT.length = 0; // Garbage collect CSS content. + if (!hasCss) { + return; + } + // Strip off any trailing slash (either Unix or Windows). + var mediaPath = pathToMedia.replace(/[\\/]$/, ''); + text = text.replace(/<<>>/g, mediaPath); + + // Inject CSS tag at start of head. + var cssNode = document.createElement('style'); + cssNode.id = 'blockly-common-style'; + var cssTextNode = document.createTextNode(text); + cssNode.appendChild(cssTextNode); + document.head.insertBefore(cssNode, document.head.firstChild); +}; + +/** + * Array making up the CSS content for Blockly. + */ +Blockly.Css.CONTENT = [ + /* eslint-disable indent */ + '.blocklySvg {', + 'background-color: #fff;', + 'outline: none;', + 'overflow: hidden;', /* IE overflows by default. */ + 'position: absolute;', + 'display: block;', + '}', + + '.blocklyWidgetDiv {', + 'display: none;', + 'position: absolute;', + 'z-index: 99999;', /* big value for bootstrap3 compatibility */ + '}', + + '.injectionDiv {', + 'height: 100%;', + 'position: relative;', + 'overflow: hidden;', /* So blocks in drag surface disappear at edges */ + 'touch-action: none;', + '}', + + '.blocklyNonSelectable {', + 'user-select: none;', + '-ms-user-select: none;', + '-webkit-user-select: none;', + '}', + + '.blocklyWsDragSurface {', + 'display: none;', + 'position: absolute;', + 'top: 0;', + 'left: 0;', + '}', + /* Added as a separate rule with multiple classes to make it more specific + than a bootstrap rule that selects svg:root. See issue #1275 for context. + */ + '.blocklyWsDragSurface.blocklyOverflowVisible {', + 'overflow: visible;', + '}', + + '.blocklyBlockDragSurface {', + 'display: none;', + 'position: absolute;', + 'top: 0;', + 'left: 0;', + 'right: 0;', + 'bottom: 0;', + 'overflow: visible !important;', + 'z-index: 50;', /* Display below toolbox, but above everything else. */ + '}', + + '.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: 9pt sans-serif;', + 'opacity: .9;', + 'padding: 2px;', + 'position: absolute;', + 'z-index: 100000;', /* big value for bootstrap3 compatibility */ + '}', + + '.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: 0 0 3px 1px rgba(0,0,0,.3);', + '}', + + '.blocklyDropDownDiv.blocklyFocused {', + 'box-shadow: 0 0 6px 1px rgba(0,0,0,.3);', + '}', + + '.blocklyDropDownContent {', + 'max-height: 300px;', // @todo: spec for maximum height. + 'overflow: auto;', + 'overflow-x: hidden;', + 'position: relative;', + '}', + + '.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 {', + /* backup for browsers (e.g. IE11) that don't support grab */ + 'cursor: url("<<>>/handopen.cur"), auto;', + 'cursor: grab;', + 'cursor: -webkit-grab;', + '}', + + '.blocklyDragging {', + /* backup for browsers (e.g. IE11) that don't support grabbing */ + 'cursor: url("<<>>/handclosed.cur"), auto;', + 'cursor: grabbing;', + 'cursor: -webkit-grabbing;', + '}', + /* Changes cursor on mouse down. Not effective in Firefox because of + https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */ + '.blocklyDraggable:active {', + /* backup for browsers (e.g. IE11) that don't support grabbing */ + 'cursor: url("<<>>/handclosed.cur"), auto;', + 'cursor: grabbing;', + 'cursor: -webkit-grabbing;', + '}', + /* Change the cursor on the whole drag surface in case the mouse gets + ahead of block during a drag. This way the cursor is still a closed hand. + */ + '.blocklyBlockDragSurface .blocklyDraggable {', + /* backup for browsers (e.g. IE11) that don't support grabbing */ + '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;', + '}', + + '.blocklyFlyout {', + 'position: absolute;', + 'z-index: 20;', + '}', + + '.blocklyText text {', + 'cursor: default;', + '}', + + /* + Don't allow users to select text. It gets annoying when trying to + drag a block and selected text moves instead. + */ + '.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;', + '}', + + /* Edge and IE introduce a close icon when the input value is longer than a + certain length. This affects our sizing calculations of the text input. + Hiding the close icon to avoid that. */ + '.blocklyHtmlInput::-ms-clear {', + 'display: none;', + '}', + + '.blocklyMainBackground {', + 'stroke-width: 1;', + 'stroke: #c6c6c6;', /* Equates to #ddd due to border being off-pixel. */ + '}', + + '.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;', + '}', + + /* Darken flyout scrollbars due to being on a grey background. */ + /* By contrast, workspace scrollbars are on a white background. */ + '.blocklyFlyout .blocklyScrollbarHandle {', + 'fill: #bbb;', + '}', + + '.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,', + '.blocklyFlyout .blocklyScrollbarHandle:hover {', + 'fill: #aaa;', + '}', + + '.blocklyInvalidInput {', + 'background: #faa;', + '}', + + '.blocklyVerticalMarker {', + 'stroke-width: 3px;', + 'fill: rgba(255,255,255,.5);', + 'pointer-events: none;', + '}', + + '.blocklyComputeCanvas {', + 'position: absolute;', + 'width: 0;', + 'height: 0;', + '}', + + '.blocklyNoPointerEvents {', + 'pointer-events: none;', + '}', + + '.blocklyContextMenu {', + 'border-radius: 4px;', + 'max-height: 100%;', + '}', + + '.blocklyDropdownMenu {', + 'border-radius: 2px;', + 'padding: 0 !important;', + '}', + + '.blocklyDropdownMenu .blocklyMenuItem {', + /* 28px on the left for icon or checkbox. */ + 'padding-left: 28px;', + '}', + + /* BiDi override for the resting state. */ + '.blocklyDropdownMenu .blocklyMenuItemRtl {', + /* Flip left/right padding for BiDi. */ + 'padding-left: 5px;', + 'padding-right: 28px;', + '}', + + '.blocklyWidgetDiv .blocklyMenu {', + 'background: #fff;', + 'border: 1px solid transparent;', + 'box-shadow: 0 0 3px 1px rgba(0,0,0,.3);', + '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;', /* Arbitrary, but some apps depend on it... */ + '}', + + '.blocklyWidgetDiv .blocklyMenu.blocklyFocused {', + 'box-shadow: 0 0 6px 1px rgba(0,0,0,.3);', + '}', + + '.blocklyDropDownDiv .blocklyMenu {', + 'background: inherit;', /* Compatibility with gapi, reset from goog-menu */ + 'border: inherit;', /* Compatibility with gapi, reset from goog-menu */ + 'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', + 'outline: none;', + 'position: relative;', /* Compatibility with gapi, reset from goog-menu */ + 'z-index: 20000;', /* Arbitrary, but some apps depend on it... */ + '}', + + /* State: resting. */ + '.blocklyMenuItem {', + 'border: none;', + 'color: #000;', + 'cursor: pointer;', + 'list-style: none;', + 'margin: 0;', + /* 7em on the right for shortcut. */ + 'min-width: 7em;', + 'padding: 6px 15px;', + 'white-space: nowrap;', + '}', + + /* State: disabled. */ + '.blocklyMenuItemDisabled {', + 'color: #ccc;', + 'cursor: inherit;', + '}', + + /* State: hover. */ + '.blocklyMenuItemHighlight {', + 'background-color: rgba(0,0,0,.1);', + '}', + + /* State: selected/checked. */ + '.blocklyMenuItemCheckbox {', + 'height: 16px;', + 'position: absolute;', + 'width: 16px;', + '}', + + '.blocklyMenuItemSelected .blocklyMenuItemCheckbox {', + 'background: url(<<>>/sprites.png) no-repeat -48px -16px;', + 'float: left;', + 'margin-left: -24px;', + 'position: static;', /* Scroll with the menu. */ + '}', + + '.blocklyMenuItemRtl .blocklyMenuItemCheckbox {', + 'float: right;', + 'margin-right: -24px;', + '}', + /* eslint-enable indent */ +]; diff --git a/static/js/dist/core/dropdowndiv.js b/static/js/dist/core/dropdowndiv.js new file mode 100644 index 0000000..770af67 --- /dev/null +++ b/static/js/dist/core/dropdowndiv.js @@ -0,0 +1,776 @@ +/** + * @license + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A div that floats on top of the workspace, for drop-down menus. + * The drop-down can be kept inside the workspace, animate in/out, etc. + * @author tmickel@mit.edu (Tim Mickel) + */ + +'use strict'; + +goog.provide('Blockly.DropDownDiv'); + +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.math'); +goog.require('Blockly.utils.style'); + +goog.requireType('Blockly.utils.Rect'); +goog.requireType('Blockly.utils.Size'); + + +/** + * Class for drop-down div. + * @constructor + * @package + */ +Blockly.DropDownDiv = function() { +}; + +/** + * Drop-downs will appear within the bounds of this element if possible. + * Set in Blockly.DropDownDiv.setBoundsElement. + * @type {Element} + * @private + */ +Blockly.DropDownDiv.boundsElement_ = null; + +/** + * The object currently using the drop-down. + * @type {Object} + * @private + */ +Blockly.DropDownDiv.owner_ = null; + +/** + * Whether the dropdown was positioned to a field or the source block. + * @type {?boolean} + * @private + */ +Blockly.DropDownDiv.positionToField_ = null; + +/** + * Arrow size in px. Should match the value in CSS + * (need to position pre-render). + * @type {number} + * @const + */ +Blockly.DropDownDiv.ARROW_SIZE = 16; + +/** + * Drop-down border size in px. Should match the value in CSS (need to position + * the arrow). + * @type {number} + * @const + */ +Blockly.DropDownDiv.BORDER_SIZE = 1; + +/** + * Amount the arrow must be kept away from the edges of the main drop-down div, + * in px. + * @type {number} + * @const + */ +Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING = 12; + +/** + * Amount drop-downs should be padded away from the source, in px. + * @type {number} + * @const + */ +Blockly.DropDownDiv.PADDING_Y = 16; + +/** + * Length of animations in seconds. + * @type {number} + * @const + */ +Blockly.DropDownDiv.ANIMATION_TIME = 0.25; + +/** + * Timer for animation out, to be cleared if we need to immediately hide + * without disrupting new shows. + * @type {?number} + * @private + */ +Blockly.DropDownDiv.animateOutTimer_ = null; + +/** + * Callback for when the drop-down is hidden. + * @type {?Function} + * @private + */ +Blockly.DropDownDiv.onHide_ = null; + +/** + * A class name representing the current owner's workspace renderer. + * @type {string} + * @private + */ +Blockly.DropDownDiv.rendererClassName_ = ''; + +/** + * A class name representing the current owner's workspace theme. + * @type {string} + * @private + */ +Blockly.DropDownDiv.themeClassName_ = ''; + +/** + * Dropdown bounds info object used to encapsulate sizing information about a + * bounding element (bounding box and width/height). + * @typedef {{ + * top:number, + * left:number, + * bottom:number, + * right:number, + * width:number, + * height:number + * }} + */ +Blockly.DropDownDiv.BoundsInfo; + +/** + * Dropdown position metrics. + * @typedef {{ + * initialX:number, + * initialY:number, + * finalX:number, + * finalY:number, + * arrowX:?number, + * arrowY:?number, + * arrowAtTop:?boolean, + * arrowVisible:boolean + * }} + */ +Blockly.DropDownDiv.PositionMetrics; + +/** + * Create and insert the DOM element for this div. + * @package + */ +Blockly.DropDownDiv.createDom = function() { + if (Blockly.DropDownDiv.DIV_) { + return; // Already created. + } + var div = document.createElement('div'); + div.className = 'blocklyDropDownDiv'; + var container = Blockly.parentContainer || document.body; + container.appendChild(div); + /** + * The div element. + * @type {!Element} + * @private + */ + Blockly.DropDownDiv.DIV_ = div; + + var content = document.createElement('div'); + content.className = 'blocklyDropDownContent'; + div.appendChild(content); + /** + * The content element. + * @type {!Element} + * @private + */ + Blockly.DropDownDiv.content_ = content; + + var arrow = document.createElement('div'); + arrow.className = 'blocklyDropDownArrow'; + div.appendChild(arrow); + /** + * The arrow element. + * @type {!Element} + * @private + */ + Blockly.DropDownDiv.arrow_ = arrow; + + Blockly.DropDownDiv.DIV_.style.opacity = 0; + + // Transition animation for transform: translate() and opacity. + Blockly.DropDownDiv.DIV_.style.transition = 'transform ' + + Blockly.DropDownDiv.ANIMATION_TIME + 's, ' + + 'opacity ' + Blockly.DropDownDiv.ANIMATION_TIME + 's'; + + // Handle focusin/out events to add a visual indicator when + // a child is focused or blurred. + div.addEventListener('focusin', function() { + Blockly.utils.dom.addClass(div, 'blocklyFocused'); + }); + div.addEventListener('focusout', function() { + Blockly.utils.dom.removeClass(div, 'blocklyFocused'); + }); +}; + +/** + * 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. + */ +Blockly.DropDownDiv.setBoundsElement = function(boundsElement) { + Blockly.DropDownDiv.boundsElement_ = boundsElement; +}; + +/** + * Provide the div for inserting content into the drop-down. + * @return {!Element} Div to populate with content. + */ +Blockly.DropDownDiv.getContentDiv = function() { + return Blockly.DropDownDiv.content_; +}; + +/** + * Clear the content of the drop-down. + */ +Blockly.DropDownDiv.clearContent = function() { + Blockly.DropDownDiv.content_.textContent = ''; + Blockly.DropDownDiv.content_.style.width = ''; +}; + +/** + * 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. + */ +Blockly.DropDownDiv.setColour = function(backgroundColour, borderColour) { + Blockly.DropDownDiv.DIV_.style.backgroundColor = backgroundColour; + Blockly.DropDownDiv.DIV_.style.borderColor = borderColour; +}; + +/** + * 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.BlockSvg} 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. + */ +Blockly.DropDownDiv.showPositionedByBlock = function(field, block, + opt_onHide, opt_secondaryYOffset) { + return Blockly.DropDownDiv.showPositionedByRect_( + Blockly.DropDownDiv.getScaledBboxOfBlock_(block), + field, opt_onHide, opt_secondaryYOffset); +}; + +/** + * 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. + */ +Blockly.DropDownDiv.showPositionedByField = function(field, + opt_onHide, opt_secondaryYOffset) { + Blockly.DropDownDiv.positionToField_ = true; + return Blockly.DropDownDiv.showPositionedByRect_( + Blockly.DropDownDiv.getScaledBboxOfField_(field), + field, opt_onHide, opt_secondaryYOffset); +}; + +/** + * Get the scaled bounding box of a block. + * @param {!Blockly.BlockSvg} block The block. + * @return {!Blockly.utils.Rect} The scaled bounding box of the block. + * @private + */ +Blockly.DropDownDiv.getScaledBboxOfBlock_ = function(block) { + var blockSvg = block.getSvgRoot(); + var bBox = blockSvg.getBBox(); + var scale = block.workspace.scale; + var scaledHeight = bBox.height * scale; + var scaledWidth = bBox.width * scale; + var xy = Blockly.utils.style.getPageOffset(blockSvg); + return new Blockly.utils.Rect( + xy.y, xy.y + scaledHeight, xy.x, xy.x + scaledWidth); +}; + +/** + * Get the scaled bounding box of a field. + * @param {!Blockly.Field} field The field. + * @return {!Blockly.utils.Rect} The scaled bounding box of the field. + * @private + */ +Blockly.DropDownDiv.getScaledBboxOfField_ = function(field) { + var bBox = field.getScaledBBox(); + return new Blockly.utils.Rect( + bBox.top, bBox.bottom, bBox.left, bBox.right); +}; + +/** + * Helper method to show and place the drop-down with positioning determined + * by a scaled bounding box. The primary position will be below the rect, + * and the secondary position above the rect. Drop-down will be constrained to + * the block's workspace. + * @param {!Blockly.utils.Rect} bBox The scaled bounding box. + * @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. + * @private + */ +Blockly.DropDownDiv.showPositionedByRect_ = function(bBox, field, + opt_onHide, opt_secondaryYOffset) { + // If we can fit it, render below the block. + var primaryX = bBox.left + (bBox.right - bBox.left) / 2; + var primaryY = bBox.bottom; + // If we can't fit it, render above the entire parent block. + var secondaryX = primaryX; + var secondaryY = bBox.top; + if (opt_secondaryYOffset) { + secondaryY += opt_secondaryYOffset; + } + var sourceBlock = /** @type {!Blockly.BlockSvg} */ (field.getSourceBlock()); + // Set bounds to main workspace; show the drop-down. + var workspace = sourceBlock.workspace; + while (workspace.options.parentWorkspace) { + workspace = /** @type {!Blockly.WorkspaceSvg} */ ( + workspace.options.parentWorkspace); + } + Blockly.DropDownDiv.setBoundsElement( + /** @type {Element} */ (workspace.getParentSvg().parentNode)); + return Blockly.DropDownDiv.show( + field, sourceBlock.RTL, + primaryX, primaryY, secondaryX, secondaryY, opt_onHide); +}; + +/** + * 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 + */ +Blockly.DropDownDiv.show = function(owner, rtl, primaryX, primaryY, + secondaryX, secondaryY, opt_onHide) { + Blockly.DropDownDiv.owner_ = owner; + Blockly.DropDownDiv.onHide_ = opt_onHide || null; + // Set direction. + var div = Blockly.DropDownDiv.DIV_; + div.style.direction = rtl ? 'rtl' : 'ltr'; + + var mainWorkspace = + /** @type {!Blockly.WorkspaceSvg} */ (Blockly.getMainWorkspace()); + Blockly.DropDownDiv.rendererClassName_ = + mainWorkspace.getRenderer().getClassName(); + Blockly.DropDownDiv.themeClassName_ = mainWorkspace.getTheme().getClassName(); + Blockly.utils.dom.addClass(div, Blockly.DropDownDiv.rendererClassName_); + Blockly.utils.dom.addClass(div, Blockly.DropDownDiv.themeClassName_); + + // When we change `translate` multiple times in close succession, + // Chrome may choose to wait and apply them all at once. + // Since we want the translation to initial X, Y to be immediate, + // and the translation to final X, Y to be animated, + // we saw problems where both would be applied after animation was turned on, + // making the dropdown appear to fly in from (0, 0). + // Using both `left`, `top` for the initial translation and then `translate` + // for the animated transition to final X, Y is a workaround. + + return Blockly.DropDownDiv.positionInternal_( + primaryX, primaryY, secondaryX, secondaryY); +}; + +/** + * Get sizing info about the bounding element. + * @return {!Blockly.DropDownDiv.BoundsInfo} An object containing size + * information about the bounding element (bounding box and width/height). + * @private + */ +Blockly.DropDownDiv.getBoundsInfo_ = function() { + var boundPosition = Blockly.utils.style.getPageOffset( + /** @type {!Element} */ (Blockly.DropDownDiv.boundsElement_)); + var boundSize = Blockly.utils.style.getSize( + /** @type {!Element} */ (Blockly.DropDownDiv.boundsElement_)); + + return { + left: boundPosition.x, + right: boundPosition.x + boundSize.width, + top: boundPosition.y, + bottom: boundPosition.y + boundSize.height, + width: boundSize.width, + height: boundSize.height + }; +}; + +/** + * Helper to position the drop-down and the arrow, maintaining bounds. + * See explanation of origin points in Blockly.DropDownDiv.show. + * @param {number} primaryX Desired origin point x, in absolute px. + * @param {number} primaryY Desired origin point y, in absolute px. + * @param {number} secondaryX Secondary/alternative origin point x, + * in absolute px. + * @param {number} secondaryY Secondary/alternative origin point y, + * in absolute px. + * @return {!Blockly.DropDownDiv.PositionMetrics} Various final metrics, + * including rendered positions for drop-down and arrow. + * @private + */ +Blockly.DropDownDiv.getPositionMetrics_ = function(primaryX, primaryY, + secondaryX, secondaryY) { + var boundsInfo = Blockly.DropDownDiv.getBoundsInfo_(); + var divSize = Blockly.utils.style.getSize( + /** @type {!Element} */ (Blockly.DropDownDiv.DIV_)); + + // Can we fit in-bounds below the target? + if (primaryY + divSize.height < boundsInfo.bottom) { + return Blockly.DropDownDiv.getPositionBelowMetrics_( + primaryX, primaryY, boundsInfo, divSize); + } + // Can we fit in-bounds above the target? + if (secondaryY - divSize.height > boundsInfo.top) { + return Blockly.DropDownDiv.getPositionAboveMetrics_( + secondaryX, secondaryY, boundsInfo, divSize); + } + // Can we fit outside the workspace bounds (but inside the window) below? + if (primaryY + divSize.height < document.documentElement.clientHeight) { + return Blockly.DropDownDiv.getPositionBelowMetrics_( + primaryX, primaryY, boundsInfo, divSize); + } + // Can we fit outside the workspace bounds (but inside the window) above? + if (secondaryY - divSize.height > document.documentElement.clientTop) { + return Blockly.DropDownDiv.getPositionAboveMetrics_( + secondaryX, secondaryY, boundsInfo, divSize); + } + + // Last resort, render at top of page. + return Blockly.DropDownDiv.getPositionTopOfPageMetrics_( + primaryX, boundsInfo, divSize); +}; + +/** + * Get the metrics for positioning the div below the source. + * @param {number} primaryX Desired origin point x, in absolute px. + * @param {number} primaryY Desired origin point y, in absolute px. + * @param {!Blockly.DropDownDiv.BoundsInfo} boundsInfo An object containing size + * information about the bounding element (bounding box and width/height). + * @param {!Blockly.utils.Size} divSize An object containing information about + * the size of the DropDownDiv (width & height). + * @return {!Blockly.DropDownDiv.PositionMetrics} Various final metrics, + * including rendered positions for drop-down and arrow. + * @private + */ +Blockly.DropDownDiv.getPositionBelowMetrics_ = function( + primaryX, primaryY, boundsInfo, divSize) { + + var xCoords = Blockly.DropDownDiv.getPositionX( + primaryX, boundsInfo.left, boundsInfo.right, divSize.width); + + var arrowY = -(Blockly.DropDownDiv.ARROW_SIZE / 2 + + Blockly.DropDownDiv.BORDER_SIZE); + var finalY = primaryY + Blockly.DropDownDiv.PADDING_Y; + + return { + initialX: xCoords.divX, + initialY : primaryY, + finalX: xCoords.divX, // X position remains constant during animation. + finalY: finalY, + arrowX: xCoords.arrowX, + arrowY: arrowY, + arrowAtTop: true, + arrowVisible: true + }; +}; + +/** + * Get the metrics for positioning the div above the source. + * @param {number} secondaryX Secondary/alternative origin point x, + * in absolute px. + * @param {number} secondaryY Secondary/alternative origin point y, + * in absolute px. + * @param {!Blockly.DropDownDiv.BoundsInfo} boundsInfo An object containing size + * information about the bounding element (bounding box and width/height). + * @param {!Blockly.utils.Size} divSize An object containing information about + * the size of the DropDownDiv (width & height). + * @return {!Blockly.DropDownDiv.PositionMetrics} Various final metrics, + * including rendered positions for drop-down and arrow. + * @private + */ +Blockly.DropDownDiv.getPositionAboveMetrics_ = function( + secondaryX, secondaryY, boundsInfo, divSize) { + + var xCoords = Blockly.DropDownDiv.getPositionX( + secondaryX, boundsInfo.left, boundsInfo.right, divSize.width); + + var arrowY = divSize.height - (Blockly.DropDownDiv.BORDER_SIZE * 2) - + (Blockly.DropDownDiv.ARROW_SIZE / 2); + var finalY = secondaryY - divSize.height - Blockly.DropDownDiv.PADDING_Y; + var initialY = secondaryY - divSize.height; // No padding on Y + + return { + initialX: xCoords.divX, + initialY : initialY, + finalX: xCoords.divX, // X position remains constant during animation. + finalY: finalY, + arrowX: xCoords.arrowX, + arrowY: arrowY, + arrowAtTop: false, + arrowVisible: true + }; +}; + +/** + * Get the metrics for positioning the div at the top of the page. + * @param {number} sourceX Desired origin point x, in absolute px. + * @param {!Blockly.DropDownDiv.BoundsInfo} boundsInfo An object containing size + * information about the bounding element (bounding box and width/height). + * @param {!Blockly.utils.Size} divSize An object containing information about + * the size of the DropDownDiv (width & height). + * @return {!Blockly.DropDownDiv.PositionMetrics} Various final metrics, + * including rendered positions for drop-down and arrow. + * @private + */ +Blockly.DropDownDiv.getPositionTopOfPageMetrics_ = function( + sourceX, boundsInfo, divSize) { + + var xCoords = Blockly.DropDownDiv.getPositionX( + sourceX, boundsInfo.left, boundsInfo.right, divSize.width); + + // No need to provide arrow-specific information because it won't be visible. + return { + initialX: xCoords.divX, + initialY : 0, + finalX: xCoords.divX, // X position remains constant during animation. + finalY: 0, // Y position remains constant during animation. + arrowAtTop: null, + arrowX: null, + arrowY: null, + arrowVisible: false + }; +}; + +/** + * 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 + */ +Blockly.DropDownDiv.getPositionX = function( + sourceX, boundsLeft, boundsRight, divWidth) { + var arrowX, divX; + arrowX = divX = sourceX; + + // Offset the topLeft coord so that the dropdowndiv is centered. + divX -= divWidth / 2; + // Fit the dropdowndiv within the bounds of the workspace. + divX = Blockly.utils.math.clamp(boundsLeft, divX, boundsRight - divWidth); + + // Offset the arrow coord so that the arrow is centered. + arrowX -= Blockly.DropDownDiv.ARROW_SIZE / 2; + // Convert the arrow position to be relative to the top left of the div. + var relativeArrowX = arrowX - divX; + var horizPadding = Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING; + // Clamp the arrow position so that it stays attached to the dropdowndiv. + relativeArrowX = Blockly.utils.math.clamp( + horizPadding, + relativeArrowX, + divWidth - horizPadding - Blockly.DropDownDiv.ARROW_SIZE); + + return { + arrowX: relativeArrowX, + divX: divX + }; +}; + +/** + * Is the container visible? + * @return {boolean} True if visible. + */ +Blockly.DropDownDiv.isVisible = function() { + return !!Blockly.DropDownDiv.owner_; +}; + +/** + * 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. + */ +Blockly.DropDownDiv.hideIfOwner = function(owner, opt_withoutAnimation) { + if (Blockly.DropDownDiv.owner_ === owner) { + if (opt_withoutAnimation) { + Blockly.DropDownDiv.hideWithoutAnimation(); + } else { + Blockly.DropDownDiv.hide(); + } + return true; + } + return false; +}; + +/** + * Hide the menu, triggering animation. + */ +Blockly.DropDownDiv.hide = function() { + // Start the animation by setting the translation and fading out. + var div = Blockly.DropDownDiv.DIV_; + // Reset to (initialX, initialY) - i.e., no translation. + div.style.transform = 'translate(0, 0)'; + div.style.opacity = 0; + // Finish animation - reset all values to default. + Blockly.DropDownDiv.animateOutTimer_ = + setTimeout(function() { + Blockly.DropDownDiv.hideWithoutAnimation(); + }, Blockly.DropDownDiv.ANIMATION_TIME * 1000); + if (Blockly.DropDownDiv.onHide_) { + Blockly.DropDownDiv.onHide_(); + Blockly.DropDownDiv.onHide_ = null; + } +}; + +/** + * Hide the menu, without animation. + */ +Blockly.DropDownDiv.hideWithoutAnimation = function() { + if (!Blockly.DropDownDiv.isVisible()) { + return; + } + if (Blockly.DropDownDiv.animateOutTimer_) { + clearTimeout(Blockly.DropDownDiv.animateOutTimer_); + } + + // Reset style properties in case this gets called directly + // instead of hide() - see discussion on #2551. + var div = Blockly.DropDownDiv.DIV_; + div.style.transform = ''; + div.style.left = ''; + div.style.top = ''; + div.style.opacity = 0; + div.style.display = 'none'; + div.style.backgroundColor = ''; + div.style.borderColor = ''; + + if (Blockly.DropDownDiv.onHide_) { + Blockly.DropDownDiv.onHide_(); + Blockly.DropDownDiv.onHide_ = null; + } + Blockly.DropDownDiv.clearContent(); + Blockly.DropDownDiv.owner_ = null; + + if (Blockly.DropDownDiv.rendererClassName_) { + Blockly.utils.dom.removeClass(div, Blockly.DropDownDiv.rendererClassName_); + Blockly.DropDownDiv.rendererClassName_ = ''; + } + if (Blockly.DropDownDiv.themeClassName_) { + Blockly.utils.dom.removeClass(div, Blockly.DropDownDiv.themeClassName_); + Blockly.DropDownDiv.themeClassName_ = ''; + } + (/** @type {!Blockly.WorkspaceSvg} */ ( + Blockly.getMainWorkspace())).markFocused(); +}; + +/** + * Set the dropdown div's position. + * @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. + * @return {boolean} True if the menu rendered at the primary origin point. + * @private + */ +Blockly.DropDownDiv.positionInternal_ = function( + primaryX, primaryY, secondaryX, secondaryY) { + var metrics = Blockly.DropDownDiv.getPositionMetrics_(primaryX, primaryY, + secondaryX, secondaryY); + + // Update arrow CSS. + if (metrics.arrowVisible) { + Blockly.DropDownDiv.arrow_.style.display = ''; + Blockly.DropDownDiv.arrow_.style.transform = 'translate(' + + metrics.arrowX + 'px,' + metrics.arrowY + 'px) rotate(45deg)'; + Blockly.DropDownDiv.arrow_.setAttribute('class', metrics.arrowAtTop ? + 'blocklyDropDownArrow blocklyArrowTop' : + 'blocklyDropDownArrow blocklyArrowBottom'); + } else { + Blockly.DropDownDiv.arrow_.style.display = 'none'; + } + + var initialX = Math.floor(metrics.initialX); + var initialY = Math.floor(metrics.initialY); + var finalX = Math.floor(metrics.finalX); + var finalY = Math.floor(metrics.finalY); + + var div = Blockly.DropDownDiv.DIV_; + // First apply initial translation. + div.style.left = initialX + 'px'; + div.style.top = initialY + 'px'; + + // Show the div. + div.style.display = 'block'; + div.style.opacity = 1; + // Add final translate, animated through `transition`. + // Coordinates are relative to (initialX, initialY), + // where the drop-down is absolutely positioned. + var dx = finalX - initialX; + var dy = finalY - initialY; + div.style.transform = 'translate(' + dx + 'px,' + dy + 'px)'; + + return !!metrics.arrowAtTop; +}; + +/** + * Repositions the dropdownDiv on window resize. If it doesn't know how to + * calculate the new position, it will just hide it instead. + * @package + */ +Blockly.DropDownDiv.repositionForWindowResize = function() { + // This condition mainly catches the dropdown div when it is being used as a + // dropdown. It is important not to close it in this case because on Android, + // when a field is focused, the soft keyboard opens triggering a window resize + // event and we want the dropdown div to stick around so users can type into + // it. + if (Blockly.DropDownDiv.owner_) { + var field = /** @type {!Blockly.Field} */ (Blockly.DropDownDiv.owner_); + var block = /** @type {!Blockly.BlockSvg} */ (field.getSourceBlock()); + var bBox = Blockly.DropDownDiv.positionToField_ ? + Blockly.DropDownDiv.getScaledBboxOfField_(field) : + Blockly.DropDownDiv.getScaledBboxOfBlock_(block); + // If we can fit it, render below the block. + var primaryX = bBox.left + (bBox.right - bBox.left) / 2; + var primaryY = bBox.bottom; + // If we can't fit it, render above the entire parent block. + var secondaryX = primaryX; + var secondaryY = bBox.top; + Blockly.DropDownDiv.positionInternal_( + primaryX, primaryY, secondaryX, secondaryY); + } else { + Blockly.DropDownDiv.hide(); + } +}; diff --git a/static/js/dist/core/events/block_events.js b/static/js/dist/core/events/block_events.js new file mode 100644 index 0000000..5f81cf2 --- /dev/null +++ b/static/js/dist/core/events/block_events.js @@ -0,0 +1,570 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Classes for all types of block events. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Events.BlockBase'); +goog.provide('Blockly.Events.BlockChange'); +goog.provide('Blockly.Events.BlockCreate'); +goog.provide('Blockly.Events.BlockDelete'); +goog.provide('Blockly.Events.BlockMove'); +goog.provide('Blockly.Events.Change'); // Deprecated. +goog.provide('Blockly.Events.Create'); // Deprecated. +goog.provide('Blockly.Events.Delete'); // Deprecated. +goog.provide('Blockly.Events.Move'); // Deprecated. + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Abstract'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.xml'); +// TODO: Fix recursive dependency. +// goog.require('Blockly.Xml'); + + +/** + * Abstract class for a block event. + * @param {!Blockly.Block=} opt_block The block this event corresponds to. + * Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.BlockBase = function(opt_block) { + Blockly.Events.BlockBase.superClass_.constructor.call(this); + this.isBlank = typeof opt_block == 'undefined'; + + /** + * The block id for the block this event pertains to + * @type {string} + */ + this.blockId = this.isBlank ? '' : opt_block.id; + + /** + * The workspace identifier for this event. + * @type {string} + */ + this.workspaceId = this.isBlank ? '' : opt_block.workspace.id; +}; +Blockly.utils.object.inherits(Blockly.Events.BlockBase, + Blockly.Events.Abstract); + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.BlockBase.prototype.toJson = function() { + var json = Blockly.Events.BlockBase.superClass_.toJson.call(this); + json['blockId'] = this.blockId; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.BlockBase.prototype.fromJson = function(json) { + Blockly.Events.BlockBase.superClass_.fromJson.call(this, json); + this.blockId = json['blockId']; +}; + +/** + * Class for a block change event. + * @param {!Blockly.Block=} opt_block The changed block. Undefined for a blank + * event. + * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc. + * @param {?string=} opt_name Name of input or field affected, or null. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.Change = function(opt_block, opt_element, opt_name, opt_oldValue, + opt_newValue) { + Blockly.Events.Change.superClass_.constructor.call(this, opt_block); + if (!opt_block) { + return; // Blank event to be populated by fromJson. + } + this.element = typeof opt_element == 'undefined' ? '' : opt_element; + this.name = typeof opt_name == 'undefined' ? '' : opt_name; + this.oldValue = typeof opt_oldValue == 'undefined' ? '' : opt_oldValue; + this.newValue = typeof opt_newValue == 'undefined' ? '' : opt_newValue; +}; +Blockly.utils.object.inherits(Blockly.Events.Change, Blockly.Events.BlockBase); + +/** + * Class for a block change event. + * @param {!Blockly.Block=} opt_block The changed block. Undefined for a blank + * event. + * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc. + * @param {?string=} opt_name Name of input or field affected, or null. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.BlockChange = Blockly.Events.Change; + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Change.prototype.type = Blockly.Events.CHANGE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Change.prototype.toJson = function() { + var json = Blockly.Events.Change.superClass_.toJson.call(this); + json['element'] = this.element; + if (this.name) { + json['name'] = this.name; + } + json['oldValue'] = this.oldValue; + json['newValue'] = this.newValue; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Change.prototype.fromJson = function(json) { + Blockly.Events.Change.superClass_.fromJson.call(this, json); + this.element = json['element']; + this.name = json['name']; + this.oldValue = json['oldValue']; + this.newValue = json['newValue']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ +Blockly.Events.Change.prototype.isNull = function() { + return this.oldValue == this.newValue; +}; + +/** + * Run a change event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Change.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + var block = workspace.getBlockById(this.blockId); + if (!block) { + console.warn("Can't change non-existent block: " + this.blockId); + return; + } + if (block.mutator) { + // Close the mutator (if open) since we don't want to update it. + block.mutator.setVisible(false); + } + var value = forward ? this.newValue : this.oldValue; + switch (this.element) { + case 'field': + var field = block.getField(this.name); + if (field) { + field.setValue(value); + } else { + console.warn("Can't set non-existent field: " + this.name); + } + break; + case 'comment': + block.setCommentText(/** @type {string} */ (value) || null); + break; + case 'collapsed': + block.setCollapsed(!!value); + break; + case 'disabled': + block.setEnabled(!value); + break; + case 'inline': + block.setInputsInline(!!value); + break; + case 'mutation': + var oldMutation = ''; + if (block.mutationToDom) { + var oldMutationDom = block.mutationToDom(); + oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + } + if (block.domToMutation) { + var dom = Blockly.Xml.textToDom(/** @type {string} */ (value) || ''); + block.domToMutation(dom); + } + Blockly.Events.fire(new Blockly.Events.Change( + block, 'mutation', null, oldMutation, value)); + break; + default: + console.warn('Unknown change type: ' + this.element); + } +}; + +/** + * Class for a block creation event. + * @param {!Blockly.Block=} opt_block The created block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.Create = function(opt_block) { + Blockly.Events.Create.superClass_.constructor.call(this, opt_block); + if (!opt_block) { + return; // Blank event to be populated by fromJson. + } + if (opt_block.isShadow()) { + // Moving shadow blocks is handled via disconnection. + this.recordUndo = false; + } + + if (opt_block.workspace.rendered) { + this.xml = Blockly.Xml.blockToDomWithXY(opt_block); + } else { + this.xml = Blockly.Xml.blockToDom(opt_block); + } + this.ids = Blockly.Events.getDescendantIds(opt_block); +}; +Blockly.utils.object.inherits(Blockly.Events.Create, Blockly.Events.BlockBase); + +/** + * Class for a block creation event. + * @param {!Blockly.Block=} block The created block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.BlockCreate = Blockly.Events.Create; + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Create.prototype.type = Blockly.Events.CREATE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Create.prototype.toJson = function() { + var json = Blockly.Events.Create.superClass_.toJson.call(this); + json['xml'] = Blockly.Xml.domToText(this.xml); + json['ids'] = this.ids; + if (!this.recordUndo) { + json['recordUndo'] = this.recordUndo; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Create.prototype.fromJson = function(json) { + Blockly.Events.Create.superClass_.fromJson.call(this, json); + this.xml = Blockly.Xml.textToDom(json['xml']); + this.ids = json['ids']; + if (json['recordUndo'] !== undefined) { + this.recordUndo = json['recordUndo']; + } +}; + +/** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Create.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + if (forward) { + var xml = Blockly.utils.xml.createElement('xml'); + xml.appendChild(this.xml); + Blockly.Xml.domToWorkspace(xml, workspace); + } else { + for (var i = 0, id; (id = this.ids[i]); i++) { + var block = workspace.getBlockById(id); + if (block) { + block.dispose(false); + } else if (id == this.blockId) { + // Only complain about root-level block. + console.warn("Can't uncreate non-existent block: " + id); + } + } + } +}; + +/** + * Class for a block deletion event. + * @param {!Blockly.Block=} opt_block The deleted block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.Delete = function(opt_block) { + Blockly.Events.Delete.superClass_.constructor.call(this, opt_block); + if (!opt_block) { + return; // Blank event to be populated by fromJson. + } + if (opt_block.getParent()) { + throw Error('Connected blocks cannot be deleted.'); + } + if (opt_block.isShadow()) { + // Respawning shadow blocks is handled via disconnection. + this.recordUndo = false; + } + + if (opt_block.workspace.rendered) { + this.oldXml = Blockly.Xml.blockToDomWithXY(opt_block); + } else { + this.oldXml = Blockly.Xml.blockToDom(opt_block); + } + this.ids = Blockly.Events.getDescendantIds(opt_block); +}; +Blockly.utils.object.inherits(Blockly.Events.Delete, Blockly.Events.BlockBase); + +/** + * Class for a block deletion event. + * @param {Blockly.Block} block The deleted block. Null for a blank event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.BlockDelete = Blockly.Events.Delete; + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Delete.prototype.type = Blockly.Events.DELETE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Delete.prototype.toJson = function() { + var json = Blockly.Events.Delete.superClass_.toJson.call(this); + json['oldXml'] = Blockly.Xml.domToText(this.oldXml); + json['ids'] = this.ids; + if (!this.recordUndo) { + json['recordUndo'] = this.recordUndo; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Delete.prototype.fromJson = function(json) { + Blockly.Events.Delete.superClass_.fromJson.call(this, json); + this.oldXml = Blockly.Xml.textToDom(json['oldXml']); + this.ids = json['ids']; + if (json['recordUndo'] !== undefined) { + this.recordUndo = json['recordUndo']; + } +}; + +/** + * Run a deletion event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Delete.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + if (forward) { + for (var i = 0, id; (id = this.ids[i]); i++) { + var block = workspace.getBlockById(id); + if (block) { + block.dispose(false); + } else if (id == this.blockId) { + // Only complain about root-level block. + console.warn("Can't delete non-existent block: " + id); + } + } + } else { + var xml = Blockly.utils.xml.createElement('xml'); + xml.appendChild(this.oldXml); + Blockly.Xml.domToWorkspace(xml, workspace); + } +}; + +/** + * Class for a block move event. Created before the move. + * @param {!Blockly.Block=} opt_block The moved block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ +Blockly.Events.Move = function(opt_block) { + Blockly.Events.Move.superClass_.constructor.call(this, opt_block); + if (!opt_block) { + return; // Blank event to be populated by fromJson. + } + if (opt_block.isShadow()) { + // Moving shadow blocks is handled via disconnection. + this.recordUndo = false; + } + + var location = this.currentLocation_(); + this.oldParentId = location.parentId; + this.oldInputName = location.inputName; + this.oldCoordinate = location.coordinate; +}; +Blockly.utils.object.inherits(Blockly.Events.Move, Blockly.Events.BlockBase); + +/** + * 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 + */ +Blockly.Events.BlockMove = Blockly.Events.Move; + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Move.prototype.type = Blockly.Events.MOVE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Move.prototype.toJson = function() { + var json = Blockly.Events.Move.superClass_.toJson.call(this); + if (this.newParentId) { + json['newParentId'] = this.newParentId; + } + if (this.newInputName) { + json['newInputName'] = this.newInputName; + } + if (this.newCoordinate) { + json['newCoordinate'] = Math.round(this.newCoordinate.x) + ',' + + Math.round(this.newCoordinate.y); + } + if (!this.recordUndo) { + json['recordUndo'] = this.recordUndo; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Move.prototype.fromJson = function(json) { + Blockly.Events.Move.superClass_.fromJson.call(this, json); + this.newParentId = json['newParentId']; + this.newInputName = json['newInputName']; + if (json['newCoordinate']) { + var xy = json['newCoordinate'].split(','); + this.newCoordinate = + new Blockly.utils.Coordinate(Number(xy[0]), Number(xy[1])); + } + if (json['recordUndo'] !== undefined) { + this.recordUndo = json['recordUndo']; + } +}; + +/** + * Record the block's new location. Called after the move. + */ +Blockly.Events.Move.prototype.recordNew = function() { + var location = this.currentLocation_(); + this.newParentId = location.parentId; + this.newInputName = location.inputName; + this.newCoordinate = location.coordinate; +}; + +/** + * Returns the parentId and input if the block is connected, + * or the XY location if disconnected. + * @return {!Object} Collection of location info. + * @private + */ +Blockly.Events.Move.prototype.currentLocation_ = function() { + var workspace = this.getEventWorkspace_(); + var block = workspace.getBlockById(this.blockId); + var location = {}; + var parent = block.getParent(); + if (parent) { + location.parentId = parent.id; + var input = parent.getInputWithBlock(block); + if (input) { + location.inputName = input.name; + } + } else { + location.coordinate = block.getRelativeToSurfaceXY(); + } + return location; +}; + +/** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ +Blockly.Events.Move.prototype.isNull = function() { + return this.oldParentId == this.newParentId && + this.oldInputName == this.newInputName && + Blockly.utils.Coordinate.equals(this.oldCoordinate, this.newCoordinate); +}; + +/** + * Run a move event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Move.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + var block = workspace.getBlockById(this.blockId); + if (!block) { + console.warn("Can't move non-existent block: " + this.blockId); + return; + } + var parentId = forward ? this.newParentId : this.oldParentId; + var inputName = forward ? this.newInputName : this.oldInputName; + var coordinate = forward ? this.newCoordinate : this.oldCoordinate; + var parentBlock = null; + if (parentId) { + parentBlock = workspace.getBlockById(parentId); + if (!parentBlock) { + console.warn("Can't connect to non-existent block: " + parentId); + return; + } + } + if (block.getParent()) { + block.unplug(); + } + if (coordinate) { + var xy = block.getRelativeToSurfaceXY(); + block.moveBy(coordinate.x - xy.x, coordinate.y - xy.y); + } else { + var blockConnection = block.outputConnection || block.previousConnection; + var parentConnection; + if (inputName) { + var input = parentBlock.getInput(inputName); + if (input) { + parentConnection = input.connection; + } + } else if (blockConnection.type == Blockly.PREVIOUS_STATEMENT) { + parentConnection = parentBlock.nextConnection; + } + if (parentConnection) { + blockConnection.connect(parentConnection); + } else { + console.warn("Can't connect to non-existent input: " + inputName); + } + } +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.CREATE, + Blockly.Events.Create); +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.DELETE, + Blockly.Events.Delete); +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.CHANGE, + Blockly.Events.Change); +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.MOVE, + Blockly.Events.Move); diff --git a/static/js/dist/core/events/events.js b/static/js/dist/core/events/events.js new file mode 100644 index 0000000..6ce5db3 --- /dev/null +++ b/static/js/dist/core/events/events.js @@ -0,0 +1,447 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of actions in Blockly's editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * Events fired as a result of actions in Blockly's editor. + * @namespace Blockly.Events + */ +goog.provide('Blockly.Events'); + +goog.require('Blockly.registry'); +goog.require('Blockly.utils'); + + +/** + * Group ID for new events. Grouped events are indivisible. + * @type {string} + * @private + */ +Blockly.Events.group_ = ''; + +/** + * Sets whether the next event should be added to the undo stack. + * @type {boolean} + */ +Blockly.Events.recordUndo = true; + +/** + * Allow change events to be created and fired. + * @type {number} + * @private + */ +Blockly.Events.disabled_ = 0; + +/** + * Name of event that creates a block. Will be deprecated for BLOCK_CREATE. + * @const + */ +Blockly.Events.CREATE = 'create'; + +/** + * Name of event that creates a block. + * @const + */ +Blockly.Events.BLOCK_CREATE = Blockly.Events.CREATE; + +/** + * Name of event that deletes a block. Will be deprecated for BLOCK_DELETE. + * @const + */ +Blockly.Events.DELETE = 'delete'; + +/** + * Name of event that deletes a block. + * @const + */ +Blockly.Events.BLOCK_DELETE = Blockly.Events.DELETE; + +/** + * Name of event that changes a block. Will be deprecated for BLOCK_CHANGE. + * @const + */ +Blockly.Events.CHANGE = 'change'; + +/** + * Name of event that changes a block. + * @const + */ +Blockly.Events.BLOCK_CHANGE = Blockly.Events.CHANGE; + +/** + * Name of event that moves a block. Will be deprecated for BLOCK_MOVE. + * @const + */ +Blockly.Events.MOVE = 'move'; + +/** + * Name of event that moves a block. + * @const + */ +Blockly.Events.BLOCK_MOVE = Blockly.Events.MOVE; + +/** + * Name of event that creates a variable. + * @const + */ +Blockly.Events.VAR_CREATE = 'var_create'; + +/** + * Name of event that deletes a variable. + * @const + */ +Blockly.Events.VAR_DELETE = 'var_delete'; + +/** + * Name of event that renames a variable. + * @const + */ +Blockly.Events.VAR_RENAME = 'var_rename'; + +/** + * Name of generic event that records a UI change. + * @const + */ +Blockly.Events.UI = 'ui'; + +/** + * Name of event that record a block drags a block. + * @const + */ +Blockly.Events.BLOCK_DRAG = 'drag'; + +/** + * Name of event that records a change in selected element. + * @const + */ +Blockly.Events.SELECTED = 'selected'; + +/** + * Name of event that records a click. + * @const + */ +Blockly.Events.CLICK = 'click'; + +/** + * Name of event that records a marker move. + * @const + */ +Blockly.Events.MARKER_MOVE = 'marker_move'; + +/** + * Name of event that records a bubble open. + * @const + */ +Blockly.Events.BUBBLE_OPEN = 'bubble_open'; + +/** + * Name of event that records a trashcan open. + * @const + */ +Blockly.Events.TRASHCAN_OPEN = 'trashcan_open'; + +/** + * Name of event that records a toolbox item select. + * @const + */ +Blockly.Events.TOOLBOX_ITEM_SELECT = 'toolbox_item_select'; + +/** + * Name of event that records a theme change. + * @const + */ +Blockly.Events.THEME_CHANGE = 'theme_change'; + +/** + * Name of event that records a viewport change. + * @const + */ +Blockly.Events.VIEWPORT_CHANGE = 'viewport_change'; + +/** + * Name of event that creates a comment. + * @const + */ +Blockly.Events.COMMENT_CREATE = 'comment_create'; + +/** + * Name of event that deletes a comment. + * @const + */ +Blockly.Events.COMMENT_DELETE = 'comment_delete'; + +/** + * Name of event that changes a comment. + * @const + */ +Blockly.Events.COMMENT_CHANGE = 'comment_change'; + +/** + * Name of event that moves a comment. + * @const + */ +Blockly.Events.COMMENT_MOVE = 'comment_move'; + +/** + * Name of event that records a workspace load. + */ +Blockly.Events.FINISHED_LOADING = 'finished_loading'; + +/** + * 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 + */ +Blockly.Events.BUMP_EVENTS = [ + Blockly.Events.BLOCK_CREATE, + Blockly.Events.BLOCK_MOVE, + Blockly.Events.COMMENT_CREATE, + Blockly.Events.COMMENT_MOVE +]; + +/** + * List of events queued for firing. + * @private + */ +Blockly.Events.FIRE_QUEUE_ = []; + +/** + * Create a custom event and fire it. + * @param {!Blockly.Events.Abstract} event Custom data for event. + */ +Blockly.Events.fire = function(event) { + if (!Blockly.Events.isEnabled()) { + return; + } + if (!Blockly.Events.FIRE_QUEUE_.length) { + // First event added; schedule a firing of the event queue. + setTimeout(Blockly.Events.fireNow_, 0); + } + Blockly.Events.FIRE_QUEUE_.push(event); +}; + +/** + * Fire all queued events. + * @private + */ +Blockly.Events.fireNow_ = function() { + var queue = Blockly.Events.filter(Blockly.Events.FIRE_QUEUE_, true); + Blockly.Events.FIRE_QUEUE_.length = 0; + for (var i = 0, event; (event = queue[i]); i++) { + if (!event.workspaceId) { + continue; + } + var workspace = Blockly.Workspace.getById(event.workspaceId); + if (workspace) { + workspace.fireChangeListener(event); + } + } +}; + +/** + * Filter the queued events and merge duplicates. + * @param {!Array.} queueIn Array of events. + * @param {boolean} forward True if forward (redo), false if backward (undo). + * @return {!Array.} Array of filtered events. + */ +Blockly.Events.filter = function(queueIn, forward) { + var queue = queueIn.slice(); // Shallow copy of queue. + if (!forward) { + // Undo is merged in reverse order. + queue.reverse(); + } + var mergedQueue = []; + var hash = Object.create(null); + // Merge duplicates. + for (var i = 0, event; (event = queue[i]); i++) { + if (!event.isNull()) { + // Treat all ui events as the same type in hash table. + var eventType = event.isUiEvent ? Blockly.Events.UI : event.type; + var key = [eventType, event.blockId, event.workspaceId].join(' '); + + var lastEntry = hash[key]; + var lastEvent = lastEntry ? lastEntry.event : null; + if (!lastEntry) { + // Each item in the hash table has the event and the index of that event + // in the input array. This lets us make sure we only merge adjacent + // move events. + hash[key] = { event: event, index: i}; + mergedQueue.push(event); + } else if (event.type == Blockly.Events.MOVE && + lastEntry.index == i - 1) { + // Merge move events. + lastEvent.newParentId = event.newParentId; + lastEvent.newInputName = event.newInputName; + lastEvent.newCoordinate = event.newCoordinate; + lastEntry.index = i; + } else if (event.type == Blockly.Events.CHANGE && + event.element == lastEvent.element && + event.name == lastEvent.name) { + // Merge change events. + lastEvent.newValue = event.newValue; + } else if (event.type == Blockly.Events.CLICK && + lastEvent.type == Blockly.Events.BUBBLE_OPEN) { + // Drop click events caused by opening/closing bubbles. + } else { + // Collision: newer events should merge into this event to maintain + // order. + hash[key] = {event: event, index: i}; + mergedQueue.push(event); + } + } + } + // Filter out any events that have become null due to merging. + queue = mergedQueue.filter(function(e) { return !e.isNull(); }); + if (!forward) { + // Restore undo order. + queue.reverse(); + } + // Move mutation events to the top of the queue. + // Intentionally skip first event. + for (var i = 1, event; (event = queue[i]); i++) { + if (event.type == Blockly.Events.CHANGE && + event.element == 'mutation') { + queue.unshift(queue.splice(i, 1)[0]); + } + } + return queue; +}; + +/** + * Modify pending undo events so that when they are fired they don't land + * in the undo stack. Called by Blockly.Workspace.clearUndo. + */ +Blockly.Events.clearPendingUndo = function() { + for (var i = 0, event; (event = Blockly.Events.FIRE_QUEUE_[i]); i++) { + event.recordUndo = false; + } +}; + +/** + * Stop sending events. Every call to this function MUST also call enable. + */ +Blockly.Events.disable = function() { + Blockly.Events.disabled_++; +}; + +/** + * Start sending events. Unless events were already disabled when the + * corresponding call to disable was made. + */ +Blockly.Events.enable = function() { + Blockly.Events.disabled_--; +}; + +/** + * Returns whether events may be fired or not. + * @return {boolean} True if enabled. + */ +Blockly.Events.isEnabled = function() { + return Blockly.Events.disabled_ == 0; +}; + +/** + * Current group. + * @return {string} ID string. + */ +Blockly.Events.getGroup = function() { + return Blockly.Events.group_; +}; + +/** + * Start or stop a group. + * @param {boolean|string} state True to start new group, false to end group. + * String to set group explicitly. + */ +Blockly.Events.setGroup = function(state) { + if (typeof state == 'boolean') { + Blockly.Events.group_ = state ? Blockly.utils.genUid() : ''; + } else { + Blockly.Events.group_ = state; + } +}; + +/** + * Compute a list of the IDs of the specified block and all its descendants. + * @param {!Blockly.Block} block The root block. + * @return {!Array.} List of block IDs. + * @package + */ +Blockly.Events.getDescendantIds = function(block) { + var ids = []; + var descendants = block.getDescendants(false); + for (var i = 0, descendant; (descendant = descendants[i]); i++) { + ids[i] = descendant.id; + } + return ids; +}; + +/** + * Decode the JSON into an event. + * @param {!Object} json JSON representation. + * @param {!Blockly.Workspace} workspace Target workspace for event. + * @return {!Blockly.Events.Abstract} The event represented by the JSON. + * @throws {Error} if an event type is not found in the registry. + */ +Blockly.Events.fromJson = function(json, workspace) { + var eventClass = Blockly.registry.getClass(Blockly.registry.Type.EVENT, + json.type); + if (!eventClass) { + throw Error('Unknown event type.'); + } + var event = new eventClass(); + event.fromJson(json); + event.workspaceId = workspace.id; + return event; +}; + +/** + * 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. + */ +Blockly.Events.disableOrphans = function(event) { + if (event.type == Blockly.Events.MOVE || + event.type == Blockly.Events.CREATE) { + if (!event.workspaceId) { + return; + } + var workspace = Blockly.Workspace.getById(event.workspaceId); + var block = workspace.getBlockById(event.blockId); + if (block) { + // Changing blocks as part of this event shouldn't be undoable. + var initialUndoFlag = Blockly.Events.recordUndo; + try { + Blockly.Events.recordUndo = false; + var parent = block.getParent(); + if (parent && parent.isEnabled()) { + var children = block.getDescendants(false); + for (var i = 0, child; (child = children[i]); i++) { + child.setEnabled(true); + } + } else if ((block.outputConnection || block.previousConnection) && + !workspace.isDragging()) { + do { + block.setEnabled(false); + block = block.getNextBlock(); + } while (block); + } + } finally { + Blockly.Events.recordUndo = initialUndoFlag; + } + } + } +}; diff --git a/static/js/dist/core/events/events_abstract.js b/static/js/dist/core/events/events_abstract.js new file mode 100644 index 0000000..f36fcc3 --- /dev/null +++ b/static/js/dist/core/events/events_abstract.js @@ -0,0 +1,112 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Abstract class for events fired as a result of actions in + * Blockly's editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Events.Abstract'); + +goog.require('Blockly.Events'); + + +/** + * Abstract class for an event. + * @constructor + */ +Blockly.Events.Abstract = function() { + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {?boolean} + */ + this.isBlank = null; + + /** + * The workspace identifier for this event. + * @type {string|undefined} + */ + this.workspaceId = 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} + */ + this.group = Blockly.Events.getGroup(); + + /** + * Sets whether the event should be added to the undo stack. + * @type {boolean} + */ + this.recordUndo = Blockly.Events.recordUndo; +}; + +/** + * Whether or not the event is a ui event. + * @type {boolean} + */ +Blockly.Events.Abstract.prototype.isUiEvent = false; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Abstract.prototype.toJson = function() { + var json = { + 'type': this.type + }; + if (this.group) { + json['group'] = this.group; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Abstract.prototype.fromJson = function(json) { + this.isBlank = false; + this.group = json['group']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if null, false if something changed. + */ +Blockly.Events.Abstract.prototype.isNull = function() { + return false; +}; + +/** + * Run an event. + * @param {boolean} _forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Abstract.prototype.run = function(_forward) { + // Defined by subclasses. +}; + +/** + * Get workspace the event belongs to. + * @return {!Blockly.Workspace} The workspace the event belongs to. + * @throws {Error} if workspace is null. + * @protected + */ +Blockly.Events.Abstract.prototype.getEventWorkspace_ = function() { + if (this.workspaceId) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + } + if (!workspace) { + throw Error('Workspace is null. Event must have been generated from real' + + ' Blockly events.'); + } + return workspace; +}; diff --git a/static/js/dist/core/events/events_block_drag.js b/static/js/dist/core/events/events_block_drag.js new file mode 100644 index 0000000..2b36c30 --- /dev/null +++ b/static/js/dist/core/events/events_block_drag.js @@ -0,0 +1,80 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a block drag. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.BlockDrag'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a block drag event. + * @param {!Blockly.Block=} opt_block The top block in the stack that is being + * dragged. Undefined for a blank event. + * @param {boolean=} opt_isStart Whether this is the start of a block drag. + * Undefined for a blank event. + * @param {!Array.=} opt_blocks The blocks affected by this + * drag. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.BlockDrag = function(opt_block, opt_isStart, opt_blocks) { + var workspaceId = opt_block ? opt_block.workspace.id : undefined; + Blockly.Events.BlockDrag.superClass_.constructor.call(this, workspaceId); + this.blockId = opt_block ? opt_block.id : null; + + /** + * Whether this is the start of a block drag. + * @type {boolean|undefined} + */ + this.isStart = opt_isStart; + + /** + * The blocks affected by this drag event. + * @type {!Array.|undefined} + */ + this.blocks = opt_blocks; +}; +Blockly.utils.object.inherits(Blockly.Events.BlockDrag, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.BlockDrag.prototype.type = Blockly.Events.BLOCK_DRAG; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.BlockDrag.prototype.toJson = function() { + var json = Blockly.Events.BlockDrag.superClass_.toJson.call(this); + json['isStart'] = this.isStart; + json['blockId'] = this.blockId; + json['blocks'] = this.blocks; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.BlockDrag.prototype.fromJson = function(json) { + Blockly.Events.BlockDrag.superClass_.fromJson.call(this, json); + this.isStart = json['isStart']; + this.blockId = json['blockId']; + this.blocks = json['blocks']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.BLOCK_DRAG, Blockly.Events.BlockDrag); diff --git a/static/js/dist/core/events/events_bubble_open.js b/static/js/dist/core/events/events_bubble_open.js new file mode 100644 index 0000000..fa6b99e --- /dev/null +++ b/static/js/dist/core/events/events_bubble_open.js @@ -0,0 +1,80 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of bubble open. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.BubbleOpen'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a bubble open event. + * @param {Blockly.BlockSvg} opt_block The associated block. Undefined for a + * blank event. + * @param {boolean=} opt_isOpen Whether the bubble is opening (false if + * closing). Undefined for a blank event. + * @param {string=} opt_bubbleType The type of bubble. One of 'mutator', 'comment' + * or 'warning'. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.BubbleOpen = function(opt_block, opt_isOpen, opt_bubbleType) { + var workspaceId = opt_block ? opt_block.workspace.id : undefined; + Blockly.Events.BubbleOpen.superClass_.constructor.call(this, workspaceId); + this.blockId = opt_block ? opt_block.id : null; + + /** + * Whether the bubble is opening (false if closing). + * @type {boolean|undefined} + */ + this.isOpen = opt_isOpen; + + /** + * The type of bubble. One of 'mutator', 'comment', or 'warning'. + * @type {string|undefined} + */ + this.bubbleType = opt_bubbleType; +}; +Blockly.utils.object.inherits(Blockly.Events.BubbleOpen, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.BubbleOpen.prototype.type = Blockly.Events.BUBBLE_OPEN; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.BubbleOpen.prototype.toJson = function() { + var json = Blockly.Events.BubbleOpen.superClass_.toJson.call(this); + json['isOpen'] = this.isOpen; + json['bubbleType'] = this.bubbleType; + json['blockId'] = this.blockId; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.BubbleOpen.prototype.fromJson = function(json) { + Blockly.Events.BubbleOpen.superClass_.fromJson.call(this, json); + this.isOpen = json['isOpen']; + this.bubbleType = json['bubbleType']; + this.blockId = json['blockId']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.BUBBLE_OPEN, Blockly.Events.BubbleOpen); diff --git a/static/js/dist/core/events/events_click.js b/static/js/dist/core/events/events_click.js new file mode 100644 index 0000000..3b4766b --- /dev/null +++ b/static/js/dist/core/events/events_click.js @@ -0,0 +1,75 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of UI click in Blockly's editor. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.Click'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a click event. + * @param {?Blockly.Block=} opt_block The affected block. Null for click events + * that do not have an associated block (i.e. workspace click). Undefined + * for a blank event. + * @param {?string=} opt_workspaceId The workspace identifier for this event. + * Not used if block is passed. Undefined for a blank event. + * @param {string=} opt_targetType The type of element targeted by this click + * event. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.Click = function(opt_block, opt_workspaceId, opt_targetType) { + var workspaceId = opt_block ? opt_block.workspace.id : opt_workspaceId; + Blockly.Events.Click.superClass_.constructor.call(this, workspaceId); + this.blockId = opt_block ? opt_block.id : null; + + /** + * The type of element targeted by this click event. + * @type {string|undefined} + */ + this.targetType = opt_targetType; +}; +Blockly.utils.object.inherits(Blockly.Events.Click, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Click.prototype.type = Blockly.Events.CLICK; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Click.prototype.toJson = function() { + var json = Blockly.Events.Click.superClass_.toJson.call(this); + json['targetType'] = this.targetType; + if (this.blockId) { + json['blockId'] = this.blockId; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Click.prototype.fromJson = function(json) { + Blockly.Events.Click.superClass_.fromJson.call(this, json); + this.targetType = json['targetType']; + this.blockId = json['blockId']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.CLICK, + Blockly.Events.Click); diff --git a/static/js/dist/core/events/events_marker_move.js b/static/js/dist/core/events/events_marker_move.js new file mode 100644 index 0000000..d18872c --- /dev/null +++ b/static/js/dist/core/events/events_marker_move.js @@ -0,0 +1,100 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of a marker move. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.MarkerMove'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a marker move event. + * @param {?Blockly.Block=} opt_block The affected block. Null if current node + * is of type workspace. Undefined for a blank event. + * @param {boolean=} isCursor Whether this is a cursor event. Undefined for a + * blank event. + * @param {?Blockly.ASTNode=} opt_oldNode The old node the marker used to be on. + * Undefined for a blank event. + * @param {!Blockly.ASTNode=} opt_newNode The new node the marker is now on. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.MarkerMove = function(opt_block, isCursor, opt_oldNode, + opt_newNode) { + var workspaceId = opt_block ? opt_block.workspace.id : undefined; + if (opt_newNode && opt_newNode.getType() == Blockly.ASTNode.types.WORKSPACE) { + workspaceId = + (/** @type {!Blockly.Workspace} */ (opt_newNode.getLocation())).id; + } + Blockly.Events.MarkerMove.superClass_.constructor.call(this, workspaceId); + + /** + * The workspace identifier for this event. + * @type {?string} + */ + this.blockId = opt_block ? opt_block.id : null; + + /** + * The old node the marker used to be on. + * @type {?Blockly.ASTNode|undefined} + */ + this.oldNode = opt_oldNode; + + /** + * The new node the marker is now on. + * @type {Blockly.ASTNode|undefined} + */ + this.newNode = opt_newNode; + + /** + * Whether this is a cursor event. + * @type {boolean|undefined} + */ + this.isCursor = isCursor; +}; +Blockly.utils.object.inherits(Blockly.Events.MarkerMove, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.MarkerMove.prototype.type = Blockly.Events.MARKER_MOVE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.MarkerMove.prototype.toJson = function() { + var json = Blockly.Events.MarkerMove.superClass_.toJson.call(this); + json['isCursor'] = this.isCursor; + json['blockId'] = this.blockId; + json['oldNode'] = this.oldNode; + json['newNode'] = this.newNode; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.MarkerMove.prototype.fromJson = function(json) { + Blockly.Events.MarkerMove.superClass_.fromJson.call(this, json); + this.isCursor = json['isCursor']; + this.blockId = json['blockId']; + this.oldNode = json['oldNode']; + this.newNode = json['newNode']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.MARKER_MOVE, Blockly.Events.MarkerMove); diff --git a/static/js/dist/core/events/events_selected.js b/static/js/dist/core/events/events_selected.js new file mode 100644 index 0000000..0898854 --- /dev/null +++ b/static/js/dist/core/events/events_selected.js @@ -0,0 +1,77 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of element select action. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.Selected'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a selected event. + * @param {?string=} opt_oldElementId The id of the previously selected + * element. Null if no element last selected. Undefined for a blank event. + * @param {?string=} opt_newElementId The id of the selected element. Null if no + * element currently selected (deselect). Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Null if no element previously selected. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.Selected = function(opt_oldElementId, opt_newElementId, + opt_workspaceId) { + Blockly.Events.Selected.superClass_.constructor.call(this, opt_workspaceId); + + /** + * The id of the last selected element. + * @type {?string|undefined} + */ + this.oldElementId = opt_oldElementId; + + /** + * The id of the selected element. + * @type {?string|undefined} + */ + this.newElementId = opt_newElementId; +}; +Blockly.utils.object.inherits(Blockly.Events.Selected, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Selected.prototype.type = Blockly.Events.SELECTED; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Selected.prototype.toJson = function() { + var json = Blockly.Events.Selected.superClass_.toJson.call(this); + json['oldElementId'] = this.oldElementId; + json['newElementId'] = this.newElementId; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Selected.prototype.fromJson = function(json) { + Blockly.Events.Selected.superClass_.fromJson.call(this, json); + this.oldElementId = json['oldElementId']; + this.newElementId = json['newElementId']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.SELECTED, + Blockly.Events.Selected); diff --git a/static/js/dist/core/events/events_theme_change.js b/static/js/dist/core/events/events_theme_change.js new file mode 100644 index 0000000..3934384 --- /dev/null +++ b/static/js/dist/core/events/events_theme_change.js @@ -0,0 +1,65 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of a theme update. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.ThemeChange'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a theme change event. + * @param {string=} opt_themeName The theme name. Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * event. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.ThemeChange = function(opt_themeName, opt_workspaceId) { + Blockly.Events.ThemeChange.superClass_.constructor.call(this, opt_workspaceId); + + /** + * The theme name. + * @type {string|undefined} + */ + this.themeName = opt_themeName; +}; +Blockly.utils.object.inherits(Blockly.Events.ThemeChange, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.ThemeChange.prototype.type = Blockly.Events.THEME_CHANGE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.ThemeChange.prototype.toJson = function() { + var json = Blockly.Events.ThemeChange.superClass_.toJson.call(this); + json['themeName'] = this.themeName; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.ThemeChange.prototype.fromJson = function(json) { + Blockly.Events.ThemeChange.superClass_.fromJson.call(this, json); + this.themeName = json['themeName']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.THEME_CHANGE, Blockly.Events.ThemeChange); diff --git a/static/js/dist/core/events/events_toolbox_item_select.js b/static/js/dist/core/events/events_toolbox_item_select.js new file mode 100644 index 0000000..9f72263 --- /dev/null +++ b/static/js/dist/core/events/events_toolbox_item_select.js @@ -0,0 +1,78 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of selecting an item on the toolbox. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.ToolboxItemSelect'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a toolbox item select event. + * @param {?string=} opt_oldItem The previously selected toolbox item. Undefined + * for a blank event. + * @param {?string=} opt_newItem The newly selected toolbox item. Undefined for + * a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.ToolboxItemSelect = function(opt_oldItem, opt_newItem, + opt_workspaceId) { + Blockly.Events.ToolboxItemSelect.superClass_.constructor.call( + this, opt_workspaceId); + + /** + * The previously selected toolbox item. + * @type {?string|undefined} + */ + this.oldItem = opt_oldItem; + + /** + * The newly selected toolbox item. + * @type {?string|undefined} + */ + this.newItem = opt_newItem; +}; +Blockly.utils.object.inherits(Blockly.Events.ToolboxItemSelect, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.ToolboxItemSelect.prototype.type = Blockly.Events.TOOLBOX_ITEM_SELECT; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.ToolboxItemSelect.prototype.toJson = function() { + var json = Blockly.Events.ToolboxItemSelect.superClass_.toJson.call(this); + json['oldItem'] = this.oldItem; + json['newItem'] = this.newItem; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.ToolboxItemSelect.prototype.fromJson = function(json) { + Blockly.Events.ToolboxItemSelect.superClass_.fromJson.call(this, json); + this.oldItem = json['oldItem']; + this.newItem = json['newItem']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.TOOLBOX_ITEM_SELECT, Blockly.Events.ToolboxItemSelect); diff --git a/static/js/dist/core/events/events_trashcan_open.js b/static/js/dist/core/events/events_trashcan_open.js new file mode 100644 index 0000000..7567de0 --- /dev/null +++ b/static/js/dist/core/events/events_trashcan_open.js @@ -0,0 +1,66 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of trashcan flyout open and close. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.TrashcanOpen'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a trashcan open event. + * @param {boolean=} opt_isOpen Whether the trashcan flyout is opening (false if + * opening). Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.TrashcanOpen = function(opt_isOpen, opt_workspaceId) { + Blockly.Events.TrashcanOpen.superClass_.constructor.call(this, opt_workspaceId); + + /** + * Whether the trashcan flyout is opening (false if closing). + * @type {boolean|undefined} + */ + this.isOpen = opt_isOpen; +}; +Blockly.utils.object.inherits(Blockly.Events.TrashcanOpen, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.TrashcanOpen.prototype.type = Blockly.Events.TRASHCAN_OPEN; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.TrashcanOpen.prototype.toJson = function() { + var json = Blockly.Events.TrashcanOpen.superClass_.toJson.call(this); + json['isOpen'] = this.isOpen; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.TrashcanOpen.prototype.fromJson = function(json) { + Blockly.Events.TrashcanOpen.superClass_.fromJson.call(this, json); + this.isOpen = json['isOpen']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.TRASHCAN_OPEN, Blockly.Events.TrashcanOpen); diff --git a/static/js/dist/core/events/events_viewport.js b/static/js/dist/core/events/events_viewport.js new file mode 100644 index 0000000..744ec2d --- /dev/null +++ b/static/js/dist/core/events/events_viewport.js @@ -0,0 +1,90 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of a viewport change. + * @author kozbial@google.com (Monica Kozbial) + */ +'use strict'; + +goog.provide('Blockly.Events.ViewportChange'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.UiBase'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Class for a viewport change event. + * @param {number=} opt_top Top-edge of the visible portion of the workspace, + * relative to the workspace origin. Undefined for a blank event. + * @param {number=} opt_left Left-edge of the visible portion of the workspace, + * relative to the workspace origin. Undefined for a blank event. + * @param {number=} opt_scale The scale of the workspace. Undefined for a blank + * event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ +Blockly.Events.ViewportChange = function(opt_top, opt_left, opt_scale, + opt_workspaceId) { + Blockly.Events.ViewportChange.superClass_.constructor.call(this, opt_workspaceId); + + /** + * Top-edge of the visible portion of the workspace, relative to the workspace + * origin. + * @type {number|undefined} + */ + this.viewTop = opt_top; + + /** + * Left-edge of the visible portion of the workspace, relative to the + * workspace origin. + * @type {number|undefined} + */ + this.viewLeft = opt_left; + + /** + * The scale of the workspace. + * @type {number|undefined} + */ + this.scale = opt_scale; +}; +Blockly.utils.object.inherits(Blockly.Events.ViewportChange, + Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.ViewportChange.prototype.type = Blockly.Events.VIEWPORT_CHANGE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.ViewportChange.prototype.toJson = function() { + var json = Blockly.Events.ViewportChange.superClass_.toJson.call(this); + json['viewTop'] = this.viewTop; + json['viewLeft'] = this.viewLeft; + json['scale'] = this.scale; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.ViewportChange.prototype.fromJson = function(json) { + Blockly.Events.ViewportChange.superClass_.fromJson.call(this, json); + this.viewTop = json['viewTop']; + this.viewLeft = json['viewLeft']; + this.scale = json['scale']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.VIEWPORT_CHANGE, Blockly.Events.ViewportChange); diff --git a/static/js/dist/core/events/ui_events.js b/static/js/dist/core/events/ui_events.js new file mode 100644 index 0000000..f426795 --- /dev/null +++ b/static/js/dist/core/events/ui_events.js @@ -0,0 +1,116 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Events fired as a result of UI actions in Blockly's editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Events.Ui'); +goog.provide('Blockly.Events.UiBase'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Abstract'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + +/** + * Base 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 {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.UiBase = function(opt_workspaceId) { + Blockly.Events.UiBase.superClass_.constructor.call(this); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {boolean} + */ + this.isBlank = typeof opt_workspaceId == 'undefined'; + + /** + * The workspace identifier for this event. + * @type {string} + */ + this.workspaceId = opt_workspaceId ? opt_workspaceId : ''; + + // UI events do not undo or redo. + this.recordUndo = false; +}; +Blockly.utils.object.inherits(Blockly.Events.UiBase, Blockly.Events.Abstract); + +/** + * Whether or not the event is a UI event. + * @type {boolean} + */ +Blockly.Events.UiBase.prototype.isUiEvent = true; + +/** + * Class for a UI event. + * @param {?Blockly.Block=} opt_block The affected block. Null for UI events + * that do not have an associated block. Undefined for a blank event. + * @param {string=} opt_element One of 'selected', 'comment', 'mutatorOpen', + * etc. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.UiBase} + * @deprecated December 2020. Instead use a more specific UI event. + * @constructor + */ +Blockly.Events.Ui = function(opt_block, opt_element, opt_oldValue, + opt_newValue) { + var workspaceId = opt_block ? opt_block.workspace.id : undefined; + Blockly.Events.Ui.superClass_.constructor.call(this, workspaceId); + + this.blockId = opt_block ? opt_block.id : null; + this.element = typeof opt_element == 'undefined' ? '' : opt_element; + this.oldValue = typeof opt_oldValue == 'undefined' ? '' : opt_oldValue; + this.newValue = typeof opt_newValue == 'undefined' ? '' : opt_newValue; +}; +Blockly.utils.object.inherits(Blockly.Events.Ui, Blockly.Events.UiBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Ui.prototype.type = Blockly.Events.UI; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Ui.prototype.toJson = function() { + var json = Blockly.Events.Ui.superClass_.toJson.call(this); + json['element'] = this.element; + if (this.newValue !== undefined) { + json['newValue'] = this.newValue; + } + if (this.blockId) { + json['blockId'] = this.blockId; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Ui.prototype.fromJson = function(json) { + Blockly.Events.Ui.superClass_.fromJson.call(this, json); + this.element = json['element']; + this.newValue = json['newValue']; + this.blockId = json['blockId']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, Blockly.Events.UI, + Blockly.Events.Ui); diff --git a/static/js/dist/core/events/variable_events.js b/static/js/dist/core/events/variable_events.js new file mode 100644 index 0000000..c908ff2 --- /dev/null +++ b/static/js/dist/core/events/variable_events.js @@ -0,0 +1,248 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Classes for all types of variable events. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Events.VarBase'); +goog.provide('Blockly.Events.VarCreate'); +goog.provide('Blockly.Events.VarDelete'); +goog.provide('Blockly.Events.VarRename'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Abstract'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + + +/** + * Abstract class for a variable event. + * @param {!Blockly.VariableModel=} opt_variable The variable this event + * corresponds to. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.VarBase = function(opt_variable) { + Blockly.Events.VarBase.superClass_.constructor.call(this); + this.isBlank = typeof opt_variable == 'undefined'; + + /** + * The variable id for the variable this event pertains to. + * @type {string} + */ + this.varId = this.isBlank ? '' : opt_variable.getId(); + + /** + * The workspace identifier for this event. + * @type {string} + */ + this.workspaceId = this.isBlank ? '' : opt_variable.workspace.id; +}; +Blockly.utils.object.inherits(Blockly.Events.VarBase, Blockly.Events.Abstract); + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.VarBase.prototype.toJson = function() { + var json = Blockly.Events.VarBase.superClass_.toJson.call(this); + json['varId'] = this.varId; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.VarBase.prototype.fromJson = function(json) { + Blockly.Events.VarBase.superClass_.toJson.call(this); + this.varId = json['varId']; +}; + +/** + * Class for a variable creation event. + * @param {!Blockly.VariableModel=} opt_variable The created variable. Undefined + * for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ +Blockly.Events.VarCreate = function(opt_variable) { + Blockly.Events.VarCreate.superClass_.constructor.call(this, opt_variable); + if (!opt_variable) { + return; // Blank event to be populated by fromJson. + } + + this.varType = opt_variable.type; + this.varName = opt_variable.name; +}; +Blockly.utils.object.inherits(Blockly.Events.VarCreate, Blockly.Events.VarBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.VarCreate.prototype.type = Blockly.Events.VAR_CREATE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.VarCreate.prototype.toJson = function() { + var json = Blockly.Events.VarCreate.superClass_.toJson.call(this); + json['varType'] = this.varType; + json['varName'] = this.varName; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.VarCreate.prototype.fromJson = function(json) { + Blockly.Events.VarCreate.superClass_.fromJson.call(this, json); + this.varType = json['varType']; + this.varName = json['varName']; +}; + +/** + * Run a variable creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.VarCreate.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + if (forward) { + workspace.createVariable(this.varName, this.varType, this.varId); + } else { + workspace.deleteVariableById(this.varId); + } +}; + +/** + * Class for a variable deletion event. + * @param {!Blockly.VariableModel=} opt_variable The deleted variable. Undefined + * for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ +Blockly.Events.VarDelete = function(opt_variable) { + Blockly.Events.VarDelete.superClass_.constructor.call(this, opt_variable); + if (!opt_variable) { + return; // Blank event to be populated by fromJson. + } + + this.varType = opt_variable.type; + this.varName = opt_variable.name; +}; +Blockly.utils.object.inherits(Blockly.Events.VarDelete, Blockly.Events.VarBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.VarDelete.prototype.type = Blockly.Events.VAR_DELETE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.VarDelete.prototype.toJson = function() { + var json = Blockly.Events.VarDelete.superClass_.toJson.call(this); + json['varType'] = this.varType; + json['varName'] = this.varName; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.VarDelete.prototype.fromJson = function(json) { + Blockly.Events.VarDelete.superClass_.fromJson.call(this, json); + this.varType = json['varType']; + this.varName = json['varName']; +}; + +/** + * Run a variable deletion event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.VarDelete.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + if (forward) { + workspace.deleteVariableById(this.varId); + } else { + workspace.createVariable(this.varName, this.varType, this.varId); + } +}; + +/** + * Class for a variable rename event. + * @param {!Blockly.VariableModel=} opt_variable The renamed variable. Undefined + * for a blank event. + * @param {string=} newName The new name the variable will be changed to. + * @extends {Blockly.Events.VarBase} + * @constructor + */ +Blockly.Events.VarRename = function(opt_variable, newName) { + Blockly.Events.VarRename.superClass_.constructor.call(this, opt_variable); + if (!opt_variable) { + return; // Blank event to be populated by fromJson. + } + + this.oldName = opt_variable.name; + this.newName = typeof newName == 'undefined' ? '' : newName; +}; +Blockly.utils.object.inherits(Blockly.Events.VarRename, Blockly.Events.VarBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.VarRename.prototype.type = Blockly.Events.VAR_RENAME; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.VarRename.prototype.toJson = function() { + var json = Blockly.Events.VarRename.superClass_.toJson.call(this); + json['oldName'] = this.oldName; + json['newName'] = this.newName; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.VarRename.prototype.fromJson = function(json) { + Blockly.Events.VarRename.superClass_.fromJson.call(this, json); + this.oldName = json['oldName']; + this.newName = json['newName']; +}; + +/** + * Run a variable rename event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.VarRename.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + if (forward) { + workspace.renameVariableById(this.varId, this.newName); + } else { + workspace.renameVariableById(this.varId, this.oldName); + } +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.VAR_CREATE, Blockly.Events.VarCreate); +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.VAR_DELETE, Blockly.Events.VarDelete); +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.VAR_RENAME, Blockly.Events.VarRename); diff --git a/static/js/dist/core/events/workspace_events.js b/static/js/dist/core/events/workspace_events.js new file mode 100644 index 0000000..3bbb27d --- /dev/null +++ b/static/js/dist/core/events/workspace_events.js @@ -0,0 +1,93 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Class for a finished loading workspace event. + * @author BeksOmega + */ +'use strict'; + +goog.provide('Blockly.Events.FinishedLoading'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Abstract'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + + +/** + * 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=} opt_workspace The workspace that has finished + * loading. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.FinishedLoading = function(opt_workspace) { + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {boolean} + */ + this.isBlank = typeof opt_workspace == 'undefined'; + + /** + * The workspace identifier for this event. + * @type {string} + */ + this.workspaceId = opt_workspace ? opt_workspace.id : ''; + + /** + * 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} + */ + this.group = Blockly.Events.getGroup(); + + // Workspace events do not undo or redo. + this.recordUndo = false; +}; +Blockly.utils.object.inherits(Blockly.Events.FinishedLoading, + Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.FinishedLoading.prototype.type = Blockly.Events.FINISHED_LOADING; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.FinishedLoading.prototype.toJson = function() { + var json = { + 'type': this.type, + }; + if (this.group) { + json['group'] = this.group; + } + if (this.workspaceId) { + json['workspaceId'] = this.workspaceId; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.FinishedLoading.prototype.fromJson = function(json) { + this.isBlank = false; + this.workspaceId = json['workspaceId']; + this.group = json['group']; +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.FINISHED_LOADING, Blockly.Events.FinishedLoading); diff --git a/static/js/dist/core/events/ws_comment_events.js b/static/js/dist/core/events/ws_comment_events.js new file mode 100644 index 0000000..82369fd --- /dev/null +++ b/static/js/dist/core/events/ws_comment_events.js @@ -0,0 +1,417 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Classes for all comment events. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Events.CommentBase'); +goog.provide('Blockly.Events.CommentChange'); +goog.provide('Blockly.Events.CommentCreate'); +goog.provide('Blockly.Events.CommentDelete'); +goog.provide('Blockly.Events.CommentMove'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Abstract'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.xml'); +// TODO: Fix recursive dependency. +// goog.require('Blockly.Xml'); + + +/** + * Abstract class for a comment event. + * @param {!Blockly.WorkspaceComment=} opt_comment The comment this event + * corresponds to. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.CommentBase = function(opt_comment) { + + /** + * Whether or not an event is blank. + * @type {boolean} + */ + this.isBlank = typeof opt_comment == 'undefined'; + + /** + * The ID of the comment this event pertains to. + * @type {string} + */ + this.commentId = this.isBlank ? '' : opt_comment.id; + + /** + * The workspace identifier for this event. + * @type {string} + */ + this.workspaceId = this.isBlank ? '' : opt_comment.workspace.id; + + /** + * 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} + */ + this.group = Blockly.Events.getGroup(); + + /** + * Sets whether the event should be added to the undo stack. + * @type {boolean} + */ + this.recordUndo = Blockly.Events.recordUndo; +}; +Blockly.utils.object.inherits(Blockly.Events.CommentBase, + Blockly.Events.Abstract); + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.CommentBase.prototype.toJson = function() { + var json = Blockly.Events.CommentBase.superClass_.toJson.call(this); + if (this.commentId) { + json['commentId'] = this.commentId; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.CommentBase.prototype.fromJson = function(json) { + Blockly.Events.CommentBase.superClass_.fromJson.call(this, json); + this.commentId = json['commentId']; +}; + +/** + * Class for a comment change event. + * @param {!Blockly.WorkspaceComment=} opt_comment The comment that is being + * changed. Undefined for a blank event. + * @param {string=} opt_oldContents Previous contents of the comment. + * @param {string=} opt_newContents New contents of the comment. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ +Blockly.Events.CommentChange = function(opt_comment, opt_oldContents, + opt_newContents) { + Blockly.Events.CommentChange.superClass_.constructor.call(this, opt_comment); + if (!opt_comment) { + return; // Blank event to be populated by fromJson. + } + + this.oldContents_ = typeof opt_oldContents == 'undefined' ? '' : + opt_oldContents; + this.newContents_ = typeof opt_newContents == 'undefined' ? '' : + opt_newContents; +}; +Blockly.utils.object.inherits(Blockly.Events.CommentChange, + Blockly.Events.CommentBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.CommentChange.prototype.type = Blockly.Events.COMMENT_CHANGE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.CommentChange.prototype.toJson = function() { + var json = Blockly.Events.CommentChange.superClass_.toJson.call(this); + json['newContents'] = this.newContents_; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.CommentChange.prototype.fromJson = function(json) { + Blockly.Events.CommentChange.superClass_.fromJson.call(this, json); + this.newContents_ = json['newValue']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ +Blockly.Events.CommentChange.prototype.isNull = function() { + return this.oldContents_ == this.newContents_; +}; + +/** + * Run a change event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.CommentChange.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + var comment = workspace.getCommentById(this.commentId); + if (!comment) { + console.warn('Can\'t change non-existent comment: ' + this.commentId); + return; + } + var contents = forward ? this.newContents_ : this.oldContents_; + + comment.setContent(contents); +}; + +/** + * Class for a comment creation event. + * @param {!Blockly.WorkspaceComment=} opt_comment The created comment. + * Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ +Blockly.Events.CommentCreate = function(opt_comment) { + Blockly.Events.CommentCreate.superClass_.constructor.call(this, opt_comment); + if (!opt_comment) { + return; // Blank event to be populated by fromJson. + } + + this.xml = opt_comment.toXmlWithXY(); +}; +Blockly.utils.object.inherits(Blockly.Events.CommentCreate, + Blockly.Events.CommentBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.CommentCreate.prototype.type = Blockly.Events.COMMENT_CREATE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +// TODO (#1266): "Full" and "minimal" serialization. +Blockly.Events.CommentCreate.prototype.toJson = function() { + var json = Blockly.Events.CommentCreate.superClass_.toJson.call(this); + json['xml'] = Blockly.Xml.domToText(this.xml); + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.CommentCreate.prototype.fromJson = function(json) { + Blockly.Events.CommentCreate.superClass_.fromJson.call(this, json); + this.xml = Blockly.Xml.textToDom(json['xml']); +}; + +/** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.CommentCreate.prototype.run = function(forward) { + Blockly.Events.CommentCreateDeleteHelper(this, forward); +}; + +/** + * 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 + */ +Blockly.Events.CommentCreateDeleteHelper = function(event, create) { + var workspace = event.getEventWorkspace_(); + if (create) { + var xml = Blockly.utils.xml.createElement('xml'); + xml.appendChild(event.xml); + Blockly.Xml.domToWorkspace(xml, workspace); + } else { + var comment = workspace.getCommentById(event.commentId); + if (comment) { + comment.dispose(false, false); + } else { + // Only complain about root-level block. + console.warn("Can't uncreate non-existent comment: " + event.commentId); + } + } +}; +/** + * Class for a comment deletion event. + * @param {!Blockly.WorkspaceComment=} opt_comment The deleted comment. + * Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ +Blockly.Events.CommentDelete = function(opt_comment) { + Blockly.Events.CommentDelete.superClass_.constructor.call(this, opt_comment); + if (!opt_comment) { + return; // Blank event to be populated by fromJson. + } + + this.xml = opt_comment.toXmlWithXY(); +}; +Blockly.utils.object.inherits(Blockly.Events.CommentDelete, + Blockly.Events.CommentBase); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.CommentDelete.prototype.type = Blockly.Events.COMMENT_DELETE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +// TODO (#1266): "Full" and "minimal" serialization. +Blockly.Events.CommentDelete.prototype.toJson = function() { + var json = Blockly.Events.CommentDelete.superClass_.toJson.call(this); + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.CommentDelete.prototype.fromJson = function(json) { + Blockly.Events.CommentDelete.superClass_.fromJson.call(this, json); +}; + +/** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.CommentDelete.prototype.run = function(forward) { + Blockly.Events.CommentCreateDeleteHelper(this, !forward); +}; + +/** + * Class for a comment move event. Created before the move. + * @param {!Blockly.WorkspaceComment=} opt_comment The comment that is being + * moved. Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ +Blockly.Events.CommentMove = function(opt_comment) { + Blockly.Events.CommentMove.superClass_.constructor.call(this, opt_comment); + if (!opt_comment) { + return; // Blank event to be populated by fromJson. + } + + /** + * The comment that is being moved. Will be cleared after recording the new + * location. + * @type {Blockly.WorkspaceComment} + */ + this.comment_ = opt_comment; + + /** + * The location before the move, in workspace coordinates. + * @type {!Blockly.utils.Coordinate} + */ + this.oldCoordinate_ = opt_comment.getXY(); + + /** + * The location after the move, in workspace coordinates. + * @type {Blockly.utils.Coordinate} + */ + this.newCoordinate_ = null; +}; +Blockly.utils.object.inherits(Blockly.Events.CommentMove, + Blockly.Events.CommentBase); + +/** + * Record the comment's new location. Called after the move. Can only be + * called once. + */ +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; +}; + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.CommentMove.prototype.type = Blockly.Events.COMMENT_MOVE; + +/** + * 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. + */ +Blockly.Events.CommentMove.prototype.setOldCoordinate = function(xy) { + this.oldCoordinate_ = xy; +}; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +// TODO (#1266): "Full" and "minimal" serialization. +Blockly.Events.CommentMove.prototype.toJson = function() { + var json = Blockly.Events.CommentMove.superClass_.toJson.call(this); + if (this.newCoordinate_) { + json['newCoordinate'] = Math.round(this.newCoordinate_.x) + ',' + + Math.round(this.newCoordinate_.y); + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.CommentMove.prototype.fromJson = function(json) { + Blockly.Events.CommentMove.superClass_.fromJson.call(this, json); + + if (json['newCoordinate']) { + var xy = json['newCoordinate'].split(','); + this.newCoordinate_ = + new Blockly.utils.Coordinate(Number(xy[0]), Number(xy[1])); + } +}; + +/** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ +Blockly.Events.CommentMove.prototype.isNull = function() { + return Blockly.utils.Coordinate.equals(this.oldCoordinate_, + this.newCoordinate_); +}; + +/** + * Run a move event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.CommentMove.prototype.run = function(forward) { + var workspace = this.getEventWorkspace_(); + var comment = workspace.getCommentById(this.commentId); + if (!comment) { + console.warn('Can\'t move non-existent comment: ' + this.commentId); + return; + } + + var target = forward ? this.newCoordinate_ : this.oldCoordinate_; + // TODO: Check if the comment is being dragged, and give up if so. + var current = comment.getXY(); + comment.moveBy(target.x - current.x, target.y - current.y); +}; + +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.COMMENT_CREATE, Blockly.Events.CommentCreate); +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.COMMENT_CHANGE, Blockly.Events.CommentChange); +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.COMMENT_MOVE, Blockly.Events.CommentMove); +Blockly.registry.register(Blockly.registry.Type.EVENT, + Blockly.Events.COMMENT_DELETE, Blockly.Events.CommentDelete); diff --git a/static/js/dist/core/extensions.js b/static/js/dist/core/extensions.js new file mode 100644 index 0000000..df76c6f --- /dev/null +++ b/static/js/dist/core/extensions.js @@ -0,0 +1,450 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview 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. + * @author Anm@anm.me (Andrew n marshall) + */ +'use strict'; + +/** + * @name Blockly.Extensions + * @namespace + */ +goog.provide('Blockly.Extensions'); + +goog.require('Blockly.utils'); + + +/** + * The set of all registered extensions, keyed by extension name/id. + * @private + */ +Blockly.Extensions.ALL_ = {}; + +/** + * 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. + */ +Blockly.Extensions.register = function(name, initFn) { + if ((typeof name != 'string') || (name.trim() == '')) { + throw Error('Error: Invalid extension name "' + name + '"'); + } + if (Blockly.Extensions.ALL_[name]) { + throw Error('Error: Extension "' + name + '" is already registered.'); + } + if (typeof initFn != 'function') { + throw Error('Error: Extension "' + name + '" must be a function'); + } + Blockly.Extensions.ALL_[name] = initFn; +}; + +/** + * 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. + */ +Blockly.Extensions.registerMixin = function(name, mixinObj) { + if (!mixinObj || typeof mixinObj != 'object') { + throw Error('Error: Mixin "' + name + '" must be a object'); + } + Blockly.Extensions.register(name, function() { + this.mixin(mixinObj); + }); +}; + +/** + * 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. + */ +Blockly.Extensions.registerMutator = function(name, mixinObj, opt_helperFn, + opt_blockList) { + var errorPrefix = 'Error when registering mutator "' + name + '": '; + + // Sanity check the mixin object before registering it. + Blockly.Extensions.checkHasFunction_( + errorPrefix, mixinObj.domToMutation, 'domToMutation'); + Blockly.Extensions.checkHasFunction_( + errorPrefix, mixinObj.mutationToDom, 'mutationToDom'); + + var hasMutatorDialog = + Blockly.Extensions.checkMutatorDialog_(mixinObj, errorPrefix); + + if (opt_helperFn && (typeof opt_helperFn != 'function')) { + throw Error('Extension "' + name + '" is not a function'); + } + + // Sanity checks passed. + Blockly.Extensions.register(name, function() { + if (hasMutatorDialog) { + if (!Blockly.Mutator) { + throw Error(errorPrefix + 'Missing require for Blockly.Mutator'); + } + this.setMutator(new Blockly.Mutator(opt_blockList || [])); + } + // Mixin the object. + this.mixin(mixinObj); + + if (opt_helperFn) { + opt_helperFn.apply(this); + } + }); +}; + +/** + * Unregisters the extension registered with the given name. + * @param {string} name The name of the extension to unregister. + */ +Blockly.Extensions.unregister = function(name) { + if (Blockly.Extensions.ALL_[name]) { + delete Blockly.Extensions.ALL_[name]; + } else { + console.warn('No extension mapping for name "' + name + + '" found to unregister'); + } +}; + +/** + * 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. + */ +Blockly.Extensions.apply = function(name, block, isMutator) { + var extensionFn = Blockly.Extensions.ALL_[name]; + if (typeof extensionFn != 'function') { + throw Error('Error: Extension "' + name + '" not found.'); + } + if (isMutator) { + // Fail early if the block already has mutation properties. + Blockly.Extensions.checkNoMutatorProperties_(name, block); + } else { + // Record the old properties so we can make sure they don't change after + // applying the extension. + var mutatorProperties = Blockly.Extensions.getMutatorProperties_(block); + } + extensionFn.apply(block); + + if (isMutator) { + var errorPrefix = 'Error after applying mutator "' + name + '": '; + Blockly.Extensions.checkBlockHasMutatorProperties_(errorPrefix, block); + } else { + if (!Blockly.Extensions.mutatorPropertiesMatch_( + /** @type {!Array.} */ (mutatorProperties), block)) { + throw Error('Error when applying extension "' + name + '": ' + + 'mutation properties changed when applying a non-mutator extension.'); + } + } +}; + +/** + * Check that the given value is a function. + * @param {string} errorPrefix The string to prepend to any error message. + * @param {*} func Function to check. + * @param {string} propertyName Which property to check. + * @throws {Error} if the property does not exist or is not a function. + * @private + */ +Blockly.Extensions.checkHasFunction_ = function(errorPrefix, func, + propertyName) { + if (!func) { + throw Error(errorPrefix + + 'missing required property "' + propertyName + '"'); + } else if (typeof func != 'function') { + throw Error(errorPrefix + + '" required property "' + propertyName + '" must be a function'); + } +}; + +/** + * Check that the given block does not have any of the four mutator properties + * defined on it. This function should be called before applying a mutator + * extension to a block, to make sure we are not overwriting properties. + * @param {string} mutationName The name of the mutation to reference in error + * messages. + * @param {!Blockly.Block} block The block to check. + * @throws {Error} if any of the properties already exist on the block. + * @private + */ +Blockly.Extensions.checkNoMutatorProperties_ = function(mutationName, block) { + var properties = Blockly.Extensions.getMutatorProperties_(block); + if (properties.length) { + throw Error('Error: tried to apply mutation "' + mutationName + + '" to a block that already has mutator functions.' + + ' Block id: ' + block.id); + } +}; + +/** + * Check that the given object has both or neither of the functions required + * to have a mutator dialog. + * These functions are 'compose' and 'decompose'. If a block has one, it must + * have both. + * @param {!Object} object The object to check. + * @param {string} errorPrefix The string to prepend to any error message. + * @return {boolean} True if the object has both functions. False if it has + * neither function. + * @throws {Error} if the object has only one of the functions. + * @private + */ +Blockly.Extensions.checkMutatorDialog_ = function(object, errorPrefix) { + var hasCompose = object.compose !== undefined; + var hasDecompose = object.decompose !== undefined; + + if (hasCompose && hasDecompose) { + if (typeof object.compose != 'function') { + throw Error(errorPrefix + 'compose must be a function.'); + } else if (typeof object.decompose != 'function') { + throw Error(errorPrefix + 'decompose must be a function.'); + } + return true; + } else if (!hasCompose && !hasDecompose) { + return false; + } else { + throw Error(errorPrefix + + 'Must have both or neither of "compose" and "decompose"'); + } +}; + +/** + * Check that a block has required mutator properties. This should be called + * after applying a mutation extension. + * @param {string} errorPrefix The string to prepend to any error message. + * @param {!Blockly.Block} block The block to inspect. + * @private + */ +Blockly.Extensions.checkBlockHasMutatorProperties_ = function(errorPrefix, + block) { + if (typeof block.domToMutation != 'function') { + throw Error(errorPrefix + 'Applying a mutator didn\'t add "domToMutation"'); + } + if (typeof block.mutationToDom != 'function') { + throw Error(errorPrefix + 'Applying a mutator didn\'t add "mutationToDom"'); + } + + // A block with a mutator isn't required to have a mutation dialog, but + // it should still have both or neither of compose and decompose. + Blockly.Extensions.checkMutatorDialog_(block, errorPrefix); +}; + +/** + * Get a list of values of mutator properties on the given block. + * @param {!Blockly.Block} block The block to inspect. + * @return {!Array.} A list with all of the defined properties, which + * should be functions, but may be anything other than undefined. + * @private + */ +Blockly.Extensions.getMutatorProperties_ = function(block) { + var result = []; + // List each function explicitly by reference to allow for renaming + // during compilation. + if (block.domToMutation !== undefined) { + result.push(block.domToMutation); + } + if (block.mutationToDom !== undefined) { + result.push(block.mutationToDom); + } + if (block.compose !== undefined) { + result.push(block.compose); + } + if (block.decompose !== undefined) { + result.push(block.decompose); + } + return result; +}; + +/** + * Check that the current mutator properties match a list of old mutator + * properties. This should be called after applying a non-mutator extension, + * to verify that the extension didn't change properties it shouldn't. + * @param {!Array.} oldProperties The old values to compare to. + * @param {!Blockly.Block} block The block to inspect for new values. + * @return {boolean} True if the property lists match. + * @private + */ +Blockly.Extensions.mutatorPropertiesMatch_ = function(oldProperties, block) { + var newProperties = Blockly.Extensions.getMutatorProperties_(block); + if (newProperties.length != oldProperties.length) { + return false; + } + for (var i = 0; i < newProperties.length; i++) { + if (oldProperties[i] != newProperties[i]) { + return false; + } + } + return true; +}; + +/** + * 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. + */ +Blockly.Extensions.buildTooltipForDropdown = function(dropdownName, + lookupTable) { + // List of block types already validated, to minimize duplicate warnings. + var blockTypesChecked = []; + + // Check the tooltip string messages for invalid references. + // Wait for load, in case Blockly.Msg is not yet populated. + // runAfterPageLoad() does not run in a Node.js environment due to lack of + // document object, in which case skip the validation. + if (typeof document == 'object') { // Relies on document.readyState + Blockly.utils.runAfterPageLoad(function() { + for (var key in lookupTable) { + // Will print warnings if reference is missing. + Blockly.utils.checkMessageReferences(lookupTable[key]); + } + }); + } + + /** + * The actual extension. + * @this {Blockly.Block} + */ + var extensionFn = function() { + if (this.type && blockTypesChecked.indexOf(this.type) == -1) { + Blockly.Extensions.checkDropdownOptionsInTable_( + this, dropdownName, lookupTable); + blockTypesChecked.push(this.type); + } + + this.setTooltip(function() { + var value = String(this.getFieldValue(dropdownName)); + var tooltip = lookupTable[value]; + if (tooltip == null) { + if (blockTypesChecked.indexOf(this.type) == -1) { + // Warn for missing values on generated tooltips. + var warning = 'No tooltip mapping for value ' + value + + ' of field ' + dropdownName; + if (this.type != null) { + warning += (' of block type ' + this.type); + } + console.warn(warning + '.'); + } + } else { + tooltip = Blockly.utils.replaceMessageReferences(tooltip); + } + return tooltip; + }.bind(this)); + }; + return extensionFn; +}; + +/** + * Checks all options keys are present in the provided string lookup table. + * Emits console warnings when they are not. + * @param {!Blockly.Block} block The block containing the dropdown + * @param {string} dropdownName The name of the dropdown + * @param {!Object.} lookupTable The string lookup table + * @private + */ +Blockly.Extensions.checkDropdownOptionsInTable_ = function(block, dropdownName, + lookupTable) { + // Validate all dropdown options have values. + var dropdown = block.getField(dropdownName); + if (!dropdown.isOptionListDynamic()) { + var options = dropdown.getOptions(); + for (var i = 0; i < options.length; ++i) { + var optionKey = options[i][1]; // label, then value + if (lookupTable[optionKey] == null) { + console.warn('No tooltip mapping for value ' + optionKey + + ' of field ' + dropdownName + ' of block type ' + block.type); + } + } + } +}; + +/** + * 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. + */ +Blockly.Extensions.buildTooltipWithFieldText = function(msgTemplate, + fieldName) { + // Check the tooltip string messages for invalid references. + // Wait for load, in case Blockly.Msg is not yet populated. + // runAfterPageLoad() does not run in a Node.js environment due to lack of + // document object, in which case skip the validation. + if (typeof document == 'object') { // Relies on document.readyState + Blockly.utils.runAfterPageLoad(function() { + // Will print warnings if reference is missing. + Blockly.utils.checkMessageReferences(msgTemplate); + }); + } + + /** + * The actual extension. + * @this {Blockly.Block} + */ + var extensionFn = function() { + this.setTooltip(function() { + var field = this.getField(fieldName); + return Blockly.utils.replaceMessageReferences(msgTemplate) + .replace('%1', field ? field.getText() : ''); + }.bind(this)); + }; + return extensionFn; +}; + +/** + * Configures the tooltip to mimic the parent block when connected. Otherwise, + * uses the tooltip text at the time this extension is initialized. This takes + * advantage of the fact that all other values from JSON are initialized before + * extensions. + * @this {Blockly.Block} + * @private + */ +Blockly.Extensions.extensionParentTooltip_ = function() { + this.tooltipWhenNotConnected_ = this.tooltip; + this.setTooltip(function() { + var parent = this.getParent(); + return (parent && parent.getInputsInline() && parent.tooltip) || + this.tooltipWhenNotConnected_; + }.bind(this)); +}; +Blockly.Extensions.register('parent_tooltip_when_inline', + Blockly.Extensions.extensionParentTooltip_); diff --git a/static/js/dist/core/field.js b/static/js/dist/core/field.js new file mode 100644 index 0000000..94b67f8 --- /dev/null +++ b/static/js/dist/core/field.js @@ -0,0 +1,1082 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Field. Used for editable titles, variables, etc. + * This is an abstract class that defines the UI on the block. Actual + * instances would be Blockly.FieldTextInput, Blockly.FieldDropdown, etc. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Field'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Gesture'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Rect'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.utils.style'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); + +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.IASTNodeLocationSvg'); +goog.requireType('Blockly.IASTNodeLocationWithBlock'); +goog.requireType('Blockly.IBlocklyActionable'); +goog.requireType('Blockly.IRegistrable'); +goog.requireType('Blockly.ShortcutRegistry'); + + +/** + * 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 + * @implements {Blockly.IASTNodeLocationSvg} + * @implements {Blockly.IASTNodeLocationWithBlock} + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IRegistrable} + */ +Blockly.Field = function(value, opt_validator, opt_config) { + /** + * A generic value possessed by the field. + * Should generally be non-null, only null when the field is created. + * @type {*} + * @protected + */ + this.value_ = this.DEFAULT_VALUE; + + /** + * Validation function called when user edits an editable field. + * @type {Function} + * @protected + */ + this.validator_ = null; + + /** + * Used to cache the field's tooltip value if setTooltip is called when the + * field is not yet initialized. Is *not* guaranteed to be accurate. + * @type {?Blockly.Tooltip.TipInfo} + * @private + */ + this.tooltip_ = null; + + /** + * The size of the area rendered by the field. + * @type {!Blockly.utils.Size} + * @protected + */ + this.size_ = new Blockly.utils.Size(0, 0); + + /** + * Holds the cursors svg element when the cursor is attached to the field. + * This is null if there is no cursor on the field. + * @type {SVGElement} + * @private + */ + this.cursorSvg_ = null; + + /** + * Holds the markers svg element when the marker is attached to the field. + * This is null if there is no marker on the field. + * @type {SVGElement} + * @private + */ + this.markerSvg_ = null; + + /** + * The rendered field's SVG group element. + * @type {SVGGElement} + * @protected + */ + this.fieldGroup_ = null; + + /** + * The rendered field's SVG border element. + * @type {SVGRectElement} + * @protected + */ + this.borderRect_ = null; + + /** + * The rendered field's SVG text element. + * @type {SVGTextElement} + * @protected + */ + this.textElement_ = null; + + /** + * The rendered field's text content element. + * @type {Text} + * @protected + */ + this.textContent_ = null; + + /** + * Mouse down event listener data. + * @type {?Blockly.EventData} + * @private + */ + this.mouseDownWrapper_ = null; + + /** + * Constants associated with the source block's renderer. + * @type {Blockly.blockRendering.ConstantProvider} + * @protected + */ + this.constants_ = null; + + opt_config && this.configure_(opt_config); + this.setValue(value); + opt_validator && this.setValidator(opt_validator); +}; + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.Field.prototype.DEFAULT_VALUE = null; + +/** + * Name of field. Unique within each block. + * Static labels are usually unnamed. + * @type {string|undefined} + */ +Blockly.Field.prototype.name = undefined; + +/** + * Has this field been disposed of? + * @type {boolean} + * @package + */ +Blockly.Field.prototype.disposed = false; + +/** + * Maximum characters of text to display before adding an ellipsis. + * @type {number} + */ +Blockly.Field.prototype.maxDisplayLength = 50; + +/** + * Block this field is attached to. Starts as null, then set in init. + * @type {Blockly.Block} + * @protected + */ +Blockly.Field.prototype.sourceBlock_ = null; + +/** + * Does this block need to be re-rendered? + * @type {boolean} + * @protected + */ +Blockly.Field.prototype.isDirty_ = true; + +/** + * Is the field visible, or hidden due to the block being collapsed? + * @type {boolean} + * @protected + */ +Blockly.Field.prototype.visible_ = true; + +/** + * The element the click handler is bound to. + * @type {Element} + * @protected + */ +Blockly.Field.prototype.clickTarget_ = null; + +/** + * 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 + */ +Blockly.Field.prototype.getText_; + +/** + * 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 programmatically. + * @return {void} + * @protected + */ +Blockly.Field.prototype.showEditor_; + +/** + * Non-breaking space. + * @const + */ +Blockly.Field.NBSP = '\u00A0'; + +/** + * Editable fields usually show some sort of UI indicating they are editable. + * They will also be saved by the XML renderer. + * @type {boolean} + */ +Blockly.Field.prototype.EDITABLE = true; + +/** + * 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} + */ +Blockly.Field.prototype.SERIALIZABLE = false; + +/** + * 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 + */ +Blockly.Field.prototype.configure_ = function(config) { + var tooltip = config['tooltip']; + if (typeof tooltip == 'string') { + tooltip = Blockly.utils.replaceMessageReferences( + config['tooltip']); + } + tooltip && this.setTooltip(tooltip); + + // TODO (#2884): Possibly add CSS class config option. + // TODO (#2885): Possibly add cursor config option. +}; + +/** + * Attach this field to a block. + * @param {!Blockly.Block} block The block containing this field. + */ +Blockly.Field.prototype.setSourceBlock = function(block) { + if (this.sourceBlock_) { + throw Error('Field already bound to a block.'); + } + this.sourceBlock_ = block; +}; + +/** + * Get the renderer constant provider. + * @return {?Blockly.blockRendering.ConstantProvider} The renderer constant + * provider. + */ +Blockly.Field.prototype.getConstants = function() { + if (!this.constants_ && this.sourceBlock_ && this.sourceBlock_.workspace && + this.sourceBlock_.workspace.rendered) { + this.constants_ = this.sourceBlock_.workspace.getRenderer().getConstants(); + } + return this.constants_; +}; + +/** + * Get the block this field is attached to. + * @return {Blockly.Block} The block containing this field. + */ +Blockly.Field.prototype.getSourceBlock = function() { + return this.sourceBlock_; +}; + +/** + * Initialize everything to render this field. Override + * methods initModel and initView rather than this method. + * @package + */ +Blockly.Field.prototype.init = function() { + if (this.fieldGroup_) { + // Field has already been initialized once. + return; + } + this.fieldGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, {}, null); + if (!this.isVisible()) { + this.fieldGroup_.style.display = 'none'; + } + var sourceBlockSvg = /** @type {!Blockly.BlockSvg} **/ (this.sourceBlock_); + sourceBlockSvg.getSvgRoot().appendChild(this.fieldGroup_); + this.initView(); + this.updateEditable(); + this.setTooltip(this.tooltip_); + this.bindEvents_(); + this.initModel(); +}; + +/** + * Create the block UI for this field. + * @package + */ +Blockly.Field.prototype.initView = function() { + this.createBorderRect_(); + this.createTextElement_(); +}; + +/** + * Initializes the model of the field after it has been installed on a block. + * No-op by default. + * @package + */ +Blockly.Field.prototype.initModel = function() { +}; + +/** + * 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 + */ +Blockly.Field.prototype.createBorderRect_ = function() { + this.borderRect_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, { + 'rx': this.getConstants().FIELD_BORDER_RECT_RADIUS, + 'ry': this.getConstants().FIELD_BORDER_RECT_RADIUS, + 'x': 0, + 'y': 0, + 'height': this.size_.height, + 'width': this.size_.width, + 'class': 'blocklyFieldRect' + }, this.fieldGroup_); +}; + +/** + * 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 + */ +Blockly.Field.prototype.createTextElement_ = function() { + this.textElement_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TEXT, { + 'class': 'blocklyText', + }, this.fieldGroup_); + if (this.getConstants().FIELD_TEXT_BASELINE_CENTER) { + this.textElement_.setAttribute('dominant-baseline', 'central'); + } + this.textContent_ = document.createTextNode(''); + this.textElement_.appendChild(this.textContent_); +}; + +/** + * Bind events to the field. Can be overridden by subclasses if they need to do + * custom input handling. + * @protected + */ +Blockly.Field.prototype.bindEvents_ = function() { + Blockly.Tooltip.bindMouseEvents(this.getClickTarget_()); + this.mouseDownWrapper_ = + Blockly.bindEventWithChecks_( + this.getClickTarget_(), 'mousedown', this, this.onMouseDown_); +}; + +/** + * 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 + */ +Blockly.Field.prototype.fromXml = function(fieldElement) { + this.setValue(fieldElement.textContent); +}; + +/** + * 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 + */ +Blockly.Field.prototype.toXml = function(fieldElement) { + fieldElement.textContent = this.getValue(); + return fieldElement; +}; + +/** + * Dispose of all DOM objects and events belonging to this editable field. + * @package + */ +Blockly.Field.prototype.dispose = function() { + Blockly.DropDownDiv.hideIfOwner(this); + Blockly.WidgetDiv.hideIfOwner(this); + Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_()); + + if (this.mouseDownWrapper_) { + Blockly.unbindEvent_(this.mouseDownWrapper_); + } + + Blockly.utils.dom.removeNode(this.fieldGroup_); + + this.disposed = true; +}; + +/** + * Add or remove the UI indicating if this field is editable or not. + */ +Blockly.Field.prototype.updateEditable = function() { + var group = this.fieldGroup_; + if (!this.EDITABLE || !group) { + return; + } + if (this.sourceBlock_.isEditable()) { + Blockly.utils.dom.addClass(group, 'blocklyEditableText'); + Blockly.utils.dom.removeClass(group, 'blocklyNonEditableText'); + group.style.cursor = this.CURSOR; + } else { + Blockly.utils.dom.addClass(group, 'blocklyNonEditableText'); + Blockly.utils.dom.removeClass(group, 'blocklyEditableText'); + group.style.cursor = ''; + } +}; + +/** + * Check whether this field defines the showEditor_ function. + * @return {boolean} Whether this field is clickable. + */ +Blockly.Field.prototype.isClickable = function() { + return !!this.sourceBlock_ && this.sourceBlock_.isEditable() && + !!this.showEditor_ && (typeof this.showEditor_ === 'function'); +}; + +/** + * 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 + */ +Blockly.Field.prototype.isCurrentlyEditable = function() { + return this.EDITABLE && !!this.sourceBlock_ && this.sourceBlock_.isEditable(); +}; + +/** + * 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. + */ +Blockly.Field.prototype.isSerializable = function() { + var isSerializable = false; + if (this.name) { + if (this.SERIALIZABLE) { + isSerializable = true; + } else if (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.'); + isSerializable = true; + } + } + return isSerializable; +}; + +/** + * Gets whether this editable field is visible or not. + * @return {boolean} True if visible. + */ +Blockly.Field.prototype.isVisible = function() { + return this.visible_; +}; + +/** + * Sets whether this editable field is visible or not. Should only be called + * by input.setVisible. + * @param {boolean} visible True if visible. + * @package + */ +Blockly.Field.prototype.setVisible = function(visible) { + if (this.visible_ == visible) { + return; + } + this.visible_ = visible; + var root = this.getSvgRoot(); + if (root) { + root.style.display = visible ? 'block' : 'none'; + } +}; + +/** + * 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. + */ +Blockly.Field.prototype.setValidator = function(handler) { + this.validator_ = handler; +}; + +/** + * Gets the validation function for editable fields, or null if not set. + * @return {Function} Validation function, or null. + */ +Blockly.Field.prototype.getValidator = function() { + return this.validator_; +}; + +/** + * Gets the group element for this editable field. + * Used for measuring the size and for positioning. + * @return {!SVGGElement} The group element. + */ +Blockly.Field.prototype.getSvgRoot = function() { + return /** @type {!SVGGElement} */ (this.fieldGroup_); +}; + +/** + * Updates the field to match the colour/style of the block. Should only be + * called by BlockSvg.applyColour(). + * @package + */ +Blockly.Field.prototype.applyColour = function() { + // Non-abstract sub-classes may wish to implement this. See FieldDropdown. +}; + +/** + * 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 + */ +Blockly.Field.prototype.render_ = function() { + if (this.textContent_) { + this.textContent_.nodeValue = this.getDisplayText_(); + } + this.updateSize_(); +}; + +/** + * 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 programmatically. + * @package + */ +Blockly.Field.prototype.showEditor = function(opt_e) { + if (this.isClickable()) { + this.showEditor_(opt_e); + } +}; + +/** + * Updates the size of the field based on the text. + * @param {number=} opt_margin margin to use when positioning the text element. + * @protected + */ +Blockly.Field.prototype.updateSize_ = function(opt_margin) { + var constants = this.getConstants(); + var xOffset = opt_margin != undefined ? opt_margin : + (this.borderRect_ ? this.getConstants().FIELD_BORDER_RECT_X_PADDING : 0); + var totalWidth = xOffset * 2; + var totalHeight = constants.FIELD_TEXT_HEIGHT; + + var contentWidth = 0; + if (this.textElement_) { + contentWidth = Blockly.utils.dom.getFastTextWidth(this.textElement_, + constants.FIELD_TEXT_FONTSIZE, + constants.FIELD_TEXT_FONTWEIGHT, + constants.FIELD_TEXT_FONTFAMILY); + totalWidth += contentWidth; + } + if (this.borderRect_) { + totalHeight = Math.max(totalHeight, constants.FIELD_BORDER_RECT_HEIGHT); + } + + this.size_.height = totalHeight; + this.size_.width = totalWidth; + + this.positionTextElement_(xOffset, contentWidth); + this.positionBorderRect_(); +}; + +/** + * Position a field's text element after a size change. This handles both LTR + * and RTL positioning. + * @param {number} xOffset x offset to use when positioning the text element. + * @param {number} contentWidth The content width. + * @protected + */ +Blockly.Field.prototype.positionTextElement_ = function(xOffset, contentWidth) { + if (!this.textElement_) { + return; + } + var constants = this.getConstants(); + var halfHeight = this.size_.height / 2; + + this.textElement_.setAttribute('x', this.sourceBlock_.RTL ? + this.size_.width - contentWidth - xOffset : xOffset); + this.textElement_.setAttribute('y', constants.FIELD_TEXT_BASELINE_CENTER ? + halfHeight : halfHeight - constants.FIELD_TEXT_HEIGHT / 2 + + constants.FIELD_TEXT_BASELINE); +}; + +/** + * Position a field's border rect after a size change. + * @protected + */ +Blockly.Field.prototype.positionBorderRect_ = function() { + if (!this.borderRect_) { + return; + } + this.borderRect_.setAttribute('width', this.size_.width); + this.borderRect_.setAttribute('height', this.size_.height); + this.borderRect_.setAttribute('rx', + this.getConstants().FIELD_BORDER_RECT_RADIUS); + this.borderRect_.setAttribute('ry', + this.getConstants().FIELD_BORDER_RECT_RADIUS); +}; + + +/** + * 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. + */ +Blockly.Field.prototype.getSize = function() { + if (!this.isVisible()) { + return new Blockly.utils.Size(0, 0); + } + + if (this.isDirty_) { + this.render_(); + this.isDirty_ = false; + } else if (this.visible_ && this.size_.width == 0) { + // If the field is not visible the width will be 0 as well, one of the + // problems with the old system. + 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_; +}; + +/** + * Returns the bounding box of the rendered field, accounting for workspace + * scaling. + * @return {!Blockly.utils.Rect} An object with top, bottom, left, and right in + * pixels relative to the top left corner of the page (window coordinates). + * @package + */ +Blockly.Field.prototype.getScaledBBox = function() { + if (!this.borderRect_) { + // Browsers are inconsistent in what they return for a bounding box. + // - Webkit / Blink: fill-box / object bounding box + // - Gecko / Triden / EdgeHTML: stroke-box + var bBox = this.sourceBlock_.getHeightWidth(); + var scale = this.sourceBlock_.workspace.scale; + var xy = this.getAbsoluteXY_(); + var scaledWidth = bBox.width * scale; + var scaledHeight = bBox.height * scale; + + if (Blockly.utils.userAgent.GECKO) { + xy.x += 1.5 * scale; + xy.y += 1.5 * scale; + scaledWidth += 1 * scale; + scaledHeight += 1 * scale; + } else { + if (!Blockly.utils.userAgent.EDGE && !Blockly.utils.userAgent.IE) { + xy.x -= 0.5 * scale; + xy.y -= 0.5 * scale; + } + scaledWidth += 1 * scale; + scaledHeight += 1 * scale; + } + } else { + var bBox = this.borderRect_.getBoundingClientRect(); + var xy = Blockly.utils.style.getPageOffset(this.borderRect_); + var scaledWidth = bBox.width; + var scaledHeight = bBox.height; + } + return new Blockly.utils.Rect( + xy.y, + xy.y + scaledHeight, + xy.x, + xy.x + scaledWidth + ); +}; + +/** + * 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 + */ +Blockly.Field.prototype.getDisplayText_ = function() { + var text = this.getText(); + if (!text) { + // Prevent the field from disappearing if empty. + return Blockly.Field.NBSP; + } + if (text.length > this.maxDisplayLength) { + // Truncate displayed string and add an ellipsis ('...'). + text = text.substring(0, this.maxDisplayLength - 2) + '\u2026'; + } + // Replace whitespace with non-breaking spaces so the text doesn't collapse. + text = text.replace(/\s/g, Blockly.Field.NBSP); + if (this.sourceBlock_ && this.sourceBlock_.RTL) { + // The SVG is LTR, force text to be RTL. + text += '\u200F'; + } + return text; +}; + +/** + * Get the text from this field. + * @return {string} Current text. + */ +Blockly.Field.prototype.getText = function() { + if (this.getText_) { + var text = this.getText_.call(this); + if (text !== null) { + return String(text); + } + } + return String(this.getValue()); +}; + +/** + * 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 + */ +Blockly.Field.prototype.markDirty = function() { + this.isDirty_ = true; + this.constants_ = null; +}; + +/** + * 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 + */ +Blockly.Field.prototype.forceRerender = function() { + this.isDirty_ = true; + if (this.sourceBlock_ && this.sourceBlock_.rendered) { + this.sourceBlock_.render(); + this.sourceBlock_.bumpNeighbours(); + this.updateMarkers_(); + } +}; + +/** + * 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. + */ +Blockly.Field.prototype.setValue = function(newValue) { + var doLogging = false; + if (newValue === null) { + doLogging && console.log('null, return'); + // Not a valid value to check. + return; + } + + var validatedValue = this.doClassValidation_(newValue); + // Class validators might accidentally forget to return, we'll ignore that. + newValue = this.processValidation_(newValue, validatedValue); + if (newValue instanceof Error) { + doLogging && console.log('invalid class validation, return'); + return; + } + + var localValidator = this.getValidator(); + if (localValidator) { + validatedValue = localValidator.call(this, newValue); + // Local validators might accidentally forget to return, we'll ignore that. + newValue = this.processValidation_(newValue, validatedValue); + if (newValue instanceof Error) { + doLogging && console.log('invalid local validation, return'); + return; + } + } + var source = this.sourceBlock_; + if (source && source.disposed) { + doLogging && console.log('source disposed, return'); + return; + } + var oldValue = this.getValue(); + if (oldValue === newValue) { + doLogging && console.log('same, doValueUpdate_, return'); + this.doValueUpdate_(newValue); + return; + } + + if (source && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + source, 'field', this.name || null, oldValue, newValue)); + } + this.doValueUpdate_(newValue); + if (this.isDirty_) { + this.forceRerender(); + } + doLogging && console.log(this.value_); +}; + +/** + * Process the result of validation. + * @param {*} newValue New value. + * @param {*} validatedValue Validated value. + * @return {*} New value, or an Error object. + * @private + */ +Blockly.Field.prototype.processValidation_ = function(newValue, + validatedValue) { + if (validatedValue === null) { + this.doValueInvalid_(newValue); + if (this.isDirty_) { + this.forceRerender(); + } + return Error(); + } + if (validatedValue !== undefined) { + newValue = validatedValue; + } + return newValue; +}; + +/** + * Get the current value of the field. + * @return {*} Current value. + */ +Blockly.Field.prototype.getValue = function() { + return this.value_; +}; + +/** + * 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 + */ +Blockly.Field.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === null || opt_newValue === undefined) { + return null; + } + return opt_newValue; +}; + +/** + * 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 + */ +Blockly.Field.prototype.doValueUpdate_ = function(newValue) { + this.value_ = newValue; + this.isDirty_ = true; +}; + +/** + * Used to notify the field an invalid value was input. Can be overridden by + * subclasses, see FieldTextInput. + * No-op by default. + * @param {*} _invalidValue The input value that was determined to be invalid. + * @protected + */ +Blockly.Field.prototype.doValueInvalid_ = function(_invalidValue) { + // NOP +}; + +/** + * Handle a mouse down event on a field. + * @param {!Event} e Mouse down event. + * @protected + */ +Blockly.Field.prototype.onMouseDown_ = function(e) { + if (!this.sourceBlock_ || !this.sourceBlock_.workspace) { + return; + } + var gesture = this.sourceBlock_.workspace.getGesture(e); + if (gesture) { + gesture.setStartField(this); + } +}; + +/** + * Sets the tooltip for this field. + * @param {?Blockly.Tooltip.TipInfo} newTip The + * text for the tooltip, a function that returns the text for the tooltip, a + * parent object whose tooltip will be used, or null to display the tooltip + * of the parent block. To not display a tooltip pass the empty string. + */ +Blockly.Field.prototype.setTooltip = function(newTip) { + if (!newTip && newTip !== '') { // If null or undefined. + newTip = this.sourceBlock_; + } + var clickTarget = this.getClickTarget_(); + if (clickTarget) { + clickTarget.tooltip = newTip; + } else { + // Field has not been initialized yet. + this.tooltip_ = newTip; + } +}; + +/** + * Returns the tooltip text for this field. + * @returns {string} The tooltip text for this field. + */ +Blockly.Field.prototype.getTooltip = function() { + var clickTarget = this.getClickTarget_(); + if (clickTarget) { + return Blockly.Tooltip.getTooltipOfObject(clickTarget); + } + // Field has not been initialized yet. Return stashed this.tooltip_ value. + return Blockly.Tooltip.getTooltipOfObject({tooltip: this.tooltip_}); +}; + +/** + * 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 + */ +Blockly.Field.prototype.getClickTarget_ = function() { + return this.clickTarget_ || this.getSvgRoot(); +}; + +/** + * Return the absolute coordinates of the top-left corner of this field. + * The origin (0,0) is the top-left corner of the page body. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties. + * @protected + */ +Blockly.Field.prototype.getAbsoluteXY_ = function() { + return Blockly.utils.style.getPageOffset( + /** @type {!SVGRectElement} */ (this.getClickTarget_())); +}; + +/** + * 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 + */ +Blockly.Field.prototype.referencesVariables = function() { + return false; +}; + +/** + * 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 + */ +Blockly.Field.prototype.getParentInput = function() { + var parentInput = null; + var block = this.sourceBlock_; + var inputs = block.inputList; + + for (var idx = 0; idx < block.inputList.length; idx++) { + var input = inputs[idx]; + var fieldRows = input.fieldRow; + for (var j = 0; j < fieldRows.length; j++) { + if (fieldRows[j] === this) { + parentInput = input; + break; + } + } + } + return parentInput; +}; + +/** + * Returns whether or not we should flip the field in RTL. + * @return {boolean} True if we should flip in RTL. + */ +Blockly.Field.prototype.getFlipRtl = function() { + return false; +}; + +/** + * Returns whether or not the field is tab navigable. + * @return {boolean} True if the field is tab navigable. + */ +Blockly.Field.prototype.isTabNavigable = function() { + return false; +}; + +/** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} _action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ +Blockly.Field.prototype.onBlocklyAction = function(_action) { + return false; +}; + +/** + * 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 + */ +Blockly.Field.prototype.setCursorSvg = function(cursorSvg) { + if (!cursorSvg) { + this.cursorSvg_ = null; + return; + } + + this.fieldGroup_.appendChild(cursorSvg); + this.cursorSvg_ = cursorSvg; +}; + +/** + * 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 + */ +Blockly.Field.prototype.setMarkerSvg = function(markerSvg) { + if (!markerSvg) { + this.markerSvg_ = null; + return; + } + + this.fieldGroup_.appendChild(markerSvg); + this.markerSvg_ = markerSvg; +}; + +/** + * Redraw any attached marker or cursor svgs if needed. + * @protected + */ +Blockly.Field.prototype.updateMarkers_ = function() { + var workspace = + /** @type {!Blockly.WorkspaceSvg} */ (this.sourceBlock_.workspace); + if (workspace.keyboardAccessibilityMode && this.cursorSvg_) { + workspace.getCursor().draw(); + } + if (workspace.keyboardAccessibilityMode && this.markerSvg_) { + workspace.getMarker(Blockly.navigation.MARKER_NAME).draw(); + } +}; diff --git a/static/js/dist/core/field_angle.js b/static/js/dist/core/field_angle.js new file mode 100644 index 0000000..cbafe10 --- /dev/null +++ b/static/js/dist/core/field_angle.js @@ -0,0 +1,562 @@ +/** + * @license + * Copyright 2013 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Angle input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldAngle'); + +goog.require('Blockly.Css'); +goog.require('Blockly.DropDownDiv'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.math'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); + + +/** + * 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 + */ +Blockly.FieldAngle = function(opt_value, opt_validator, opt_config) { + + /** + * Should the angle increase as the angle picker is moved clockwise (true) + * or counterclockwise (false) + * @see Blockly.FieldAngle.CLOCKWISE + * @type {boolean} + * @private + */ + this.clockwise_ = Blockly.FieldAngle.CLOCKWISE; + + /** + * The offset of zero degrees (and all other angles). + * @see Blockly.FieldAngle.OFFSET + * @type {number} + * @private + */ + this.offset_ = Blockly.FieldAngle.OFFSET; + + /** + * The maximum angle to allow before wrapping. + * @see Blockly.FieldAngle.WRAP + * @type {number} + * @private + */ + this.wrap_ = Blockly.FieldAngle.WRAP; + + /** + * The amount to round angles to when using a mouse or keyboard nav input. + * @see Blockly.FieldAngle.ROUND + * @type {number} + * @private + */ + this.round_ = Blockly.FieldAngle.ROUND; + + Blockly.FieldAngle.superClass_.constructor.call( + this, opt_value, opt_validator, opt_config); + + /** + * The angle picker's gauge path depending on the value. + * @type {SVGElement} + */ + this.gauge_ = null; + + /** + * The angle picker's line drawn representing the value's angle. + * @type {SVGElement} + */ + this.line_ = null; + + /** + * Wrapper click event data. + * @type {?Blockly.EventData} + * @private + */ + this.clickWrapper_ = null; + + /** + * Surface click event data. + * @type {?Blockly.EventData} + * @private + */ + this.clickSurfaceWrapper_ = null; + + /** + * Surface mouse move event data. + * @type {?Blockly.EventData} + * @private + */ + this.moveSurfaceWrapper_ = null; +}; +Blockly.utils.object.inherits(Blockly.FieldAngle, Blockly.FieldTextInput); + + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldAngle.prototype.DEFAULT_VALUE = 0; + +/** + * 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 + */ +Blockly.FieldAngle.fromJson = function(options) { + return new Blockly.FieldAngle(options['angle'], undefined, options); +}; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldAngle.prototype.SERIALIZABLE = true; + +/** + * 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} + */ +Blockly.FieldAngle.ROUND = 15; + +/** + * Half the width of protractor image. + * @const {number} + */ +Blockly.FieldAngle.HALF = 100 / 2; + +/** + * Default property describing which direction makes an angle field's value + * increase. Angle increases clockwise (true) or counterclockwise (false). + * @const {boolean} + */ +Blockly.FieldAngle.CLOCKWISE = false; + +/** + * 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} + */ +Blockly.FieldAngle.OFFSET = 0; + +/** + * 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} + */ +Blockly.FieldAngle.WRAP = 360; + +/** + * Radius of protractor circle. Slightly smaller than protractor size since + * otherwise SVG crops off half the border at the edges. + * @const {number} + */ +Blockly.FieldAngle.RADIUS = Blockly.FieldAngle.HALF - 1; + +/** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @private + */ +Blockly.FieldAngle.prototype.configure_ = function(config) { + Blockly.FieldAngle.superClass_.configure_.call(this, config); + + switch (config['mode']) { + case 'compass': + this.clockwise_ = true; + this.offset_ = 90; + break; + case 'protractor': + // This is the default mode, so we could do nothing. But just to + // future-proof, we'll set it anyway. + this.clockwise_ = false; + this.offset_ = 0; + break; + } + + // Allow individual settings to override the mode setting. + var clockwise = config['clockwise']; + if (typeof clockwise == 'boolean') { + this.clockwise_ = clockwise; + } + + // If these are passed as null then we should leave them on the default. + var offset = config['offset']; + if (offset != null) { + offset = Number(offset); + if (!isNaN(offset)) { + this.offset_ = offset; + } + } + var wrap = config['wrap']; + if (wrap != null) { + wrap = Number(wrap); + if (!isNaN(wrap)) { + this.wrap_ = wrap; + } + } + var round = config['round']; + if (round != null) { + round = Number(round); + if (!isNaN(round)) { + this.round_ = round; + } + } +}; + + + +/** + * Create the block UI for this field. + * @package + */ +Blockly.FieldAngle.prototype.initView = function() { + Blockly.FieldAngle.superClass_.initView.call(this); + // Add the degree symbol to the left of the number, even in RTL (issue #2380) + this.symbol_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TSPAN, {}, null); + this.symbol_.appendChild(document.createTextNode('\u00B0')); + this.textElement_.appendChild(this.symbol_); +}; + +/** + * Updates the graph when the field rerenders. + * @private + * @override + */ +Blockly.FieldAngle.prototype.render_ = function() { + Blockly.FieldAngle.superClass_.render_.call(this); + this.updateGraph_(); +}; + +/** + * Create and show the angle field's editor. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @protected + */ +Blockly.FieldAngle.prototype.showEditor_ = function(opt_e) { + // Mobile browsers have issues with in-line textareas (focus & keyboards). + var noFocus = + Blockly.utils.userAgent.MOBILE || + Blockly.utils.userAgent.ANDROID || + Blockly.utils.userAgent.IPAD; + Blockly.FieldAngle.superClass_.showEditor_.call(this, opt_e, noFocus); + + 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)); + + this.updateGraph_(); +}; + +/** + * Create the angle dropdown editor. + * @return {!SVGElement} The newly created angle picker. + * @private + */ +Blockly.FieldAngle.prototype.dropdownCreate_ = function() { + var svg = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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': (Blockly.FieldAngle.HALF * 2) + 'px', + 'width': (Blockly.FieldAngle.HALF * 2) + 'px', + 'style': 'touch-action: none' + }, null); + var circle = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.CIRCLE, { + 'cx': Blockly.FieldAngle.HALF, + 'cy': Blockly.FieldAngle.HALF, + 'r': Blockly.FieldAngle.RADIUS, + 'class': 'blocklyAngleCircle' + }, svg); + this.gauge_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.PATH, { + 'class': 'blocklyAngleGauge' + }, svg); + this.line_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, { + 'x1': Blockly.FieldAngle.HALF, + 'y1': Blockly.FieldAngle.HALF, + 'class': 'blocklyAngleLine' + }, svg); + // Draw markers around the edge. + for (var angle = 0; angle < 360; angle += 15) { + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, { + 'x1': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS, + 'y1': Blockly.FieldAngle.HALF, + 'x2': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS - + (angle % 45 == 0 ? 10 : 5), + 'y2': Blockly.FieldAngle.HALF, + 'class': 'blocklyAngleMarks', + 'transform': 'rotate(' + angle + ',' + + Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + ')' + }, svg); + } + + // The angle 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. + this.clickWrapper_ = + Blockly.bindEventWithChecks_(svg, 'click', this, this.hide_); + // On touch devices, the picker's value is only updated with a drag. Add + // a click handler on the drag surface to update the value if the surface + // is clicked. + this.clickSurfaceWrapper_ = + Blockly.bindEventWithChecks_(circle, 'click', this, this.onMouseMove_, + true, true); + this.moveSurfaceWrapper_ = + Blockly.bindEventWithChecks_(circle, 'mousemove', this, this.onMouseMove_, + true, true); + return svg; +}; + +/** + * Disposes of events and dom-references belonging to the angle editor. + * @private + */ +Blockly.FieldAngle.prototype.dropdownDispose_ = function() { + if (this.clickWrapper_) { + Blockly.unbindEvent_(this.clickWrapper_); + this.clickWrapper_ = null; + } + if (this.clickSurfaceWrapper_) { + Blockly.unbindEvent_(this.clickSurfaceWrapper_); + this.clickSurfaceWrapper_ = null; + } + if (this.moveSurfaceWrapper_) { + Blockly.unbindEvent_(this.moveSurfaceWrapper_); + this.moveSurfaceWrapper_ = null; + } + this.gauge_ = null; + this.line_ = null; +}; + +/** + * Hide the editor. + * @private + */ +Blockly.FieldAngle.prototype.hide_ = function() { + Blockly.DropDownDiv.hideIfOwner(this); + Blockly.WidgetDiv.hide(); +}; + +/** + * Set the angle to match the mouse's position. + * @param {!Event} e Mouse move event. + * @protected + */ +Blockly.FieldAngle.prototype.onMouseMove_ = function(e) { + // Calculate angle. + var bBox = this.gauge_.ownerSVGElement.getBoundingClientRect(); + var dx = e.clientX - bBox.left - Blockly.FieldAngle.HALF; + var dy = e.clientY - bBox.top - Blockly.FieldAngle.HALF; + var angle = Math.atan(-dy / dx); + if (isNaN(angle)) { + // This shouldn't happen, but let's not let this error propagate further. + return; + } + angle = Blockly.utils.math.toDegrees(angle); + // 0: East, 90: North, 180: West, 270: South. + if (dx < 0) { + angle += 180; + } else if (dy > 0) { + angle += 360; + } + + // Do offsetting. + if (this.clockwise_) { + angle = this.offset_ + 360 - angle; + } else { + angle = 360 - (this.offset_ - angle); + } + + this.displayMouseOrKeyboardValue_(angle); +}; + +/** + * Handles and displays values that are input via mouse or arrow key input. + * These values need to be rounded and wrapped before being displayed so + * that the text input's value is appropriate. + * @param {number} angle New angle. + * @private + */ +Blockly.FieldAngle.prototype.displayMouseOrKeyboardValue_ = function(angle) { + if (this.round_) { + angle = Math.round(angle / this.round_) * this.round_; + } + angle = this.wrapValue_(angle); + if (angle != this.value_) { + this.setEditorValue_(angle); + } +}; + +/** + * Redraw the graph with the current angle. + * @private + */ +Blockly.FieldAngle.prototype.updateGraph_ = function() { + if (!this.gauge_) { + return; + } + // Always display the input (i.e. getText) even if it is invalid. + var angleDegrees = Number(this.getText()) + this.offset_; + angleDegrees %= 360; + var angleRadians = Blockly.utils.math.toRadians(angleDegrees); + var path = ['M ', Blockly.FieldAngle.HALF, ',', Blockly.FieldAngle.HALF]; + var x2 = Blockly.FieldAngle.HALF; + var y2 = Blockly.FieldAngle.HALF; + if (!isNaN(angleRadians)) { + var clockwiseFlag = Number(this.clockwise_); + var angle1 = Blockly.utils.math.toRadians(this.offset_); + var x1 = Math.cos(angle1) * Blockly.FieldAngle.RADIUS; + var y1 = Math.sin(angle1) * -Blockly.FieldAngle.RADIUS; + if (clockwiseFlag) { + angleRadians = 2 * angle1 - angleRadians; + } + x2 += Math.cos(angleRadians) * Blockly.FieldAngle.RADIUS; + y2 -= Math.sin(angleRadians) * Blockly.FieldAngle.RADIUS; + // Don't ask how the flag calculations work. They just do. + var largeFlag = Math.abs(Math.floor((angleRadians - angle1) / Math.PI) % 2); + if (clockwiseFlag) { + largeFlag = 1 - largeFlag; + } + path.push(' l ', x1, ',', y1, + ' A ', Blockly.FieldAngle.RADIUS, ',', Blockly.FieldAngle.RADIUS, + ' 0 ', largeFlag, ' ', clockwiseFlag, ' ', x2, ',', y2, ' z'); + } + this.gauge_.setAttribute('d', path.join('')); + this.line_.setAttribute('x2', x2); + this.line_.setAttribute('y2', y2); +}; + +/** + * Handle key down to the editor. + * @param {!Event} e Keyboard event. + * @protected + * @override + */ +Blockly.FieldAngle.prototype.onHtmlInputKeyDown_ = function(e) { + Blockly.FieldAngle.superClass_.onHtmlInputKeyDown_.call(this, e); + + var multiplier; + if (e.keyCode === Blockly.utils.KeyCodes.LEFT) { + // decrement (increment in RTL) + multiplier = this.sourceBlock_.RTL ? 1 : -1; + } else if (e.keyCode === Blockly.utils.KeyCodes.RIGHT) { + // increment (decrement in RTL) + multiplier = this.sourceBlock_.RTL ? -1 : 1; + } else if (e.keyCode === Blockly.utils.KeyCodes.DOWN) { + // decrement + multiplier = -1; + } else if (e.keyCode === Blockly.utils.KeyCodes.UP) { + // increment + multiplier = 1; + } + if (multiplier) { + var value = /** @type {number} */ (this.getValue()); + this.displayMouseOrKeyboardValue_( + value + (multiplier * this.round_)); + e.preventDefault(); + e.stopPropagation(); + } +}; + +/** + * Ensure that the input value is a valid angle. + * @param {*=} opt_newValue The input value. + * @return {?number} A valid angle, or null if invalid. + * @protected + * @override + */ +Blockly.FieldAngle.prototype.doClassValidation_ = function(opt_newValue) { + var value = Number(opt_newValue); + if (isNaN(value) || !isFinite(value)) { + return null; + } + return this.wrapValue_(value); +}; + +/** + * Wraps the value so that it is in the range (-360 + wrap, wrap). + * @param {number} value The value to wrap. + * @return {number} The wrapped value. + * @private + */ +Blockly.FieldAngle.prototype.wrapValue_ = function(value) { + value %= 360; + if (value < 0) { + value += 360; + } + if (value > this.wrap_) { + value -= 360; + } + return value; +}; + +/** + * CSS for angle field. See css.js for use. + */ +Blockly.Css.register([ + /* eslint-disable indent */ + '.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;', + '}' + /* eslint-enable indent */ +]); + +Blockly.fieldRegistry.register('field_angle', Blockly.FieldAngle); diff --git a/static/js/dist/core/field_checkbox.js b/static/js/dist/core/field_checkbox.js new file mode 100644 index 0000000..acca4f2 --- /dev/null +++ b/static/js/dist/core/field_checkbox.js @@ -0,0 +1,220 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Checkbox field. Checked or not checked. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldCheckbox'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Field'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Size'); + + +/** + * 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 + */ +Blockly.FieldCheckbox = function(opt_value, opt_validator, opt_config) { + /** + * Character for the check mark. Used to apply a different check mark + * character to individual fields. + * @type {?string} + * @private + */ + this.checkChar_ = null; + + Blockly.FieldCheckbox.superClass_.constructor.call( + this, opt_value, opt_validator, opt_config); +}; +Blockly.utils.object.inherits(Blockly.FieldCheckbox, Blockly.Field); + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldCheckbox.prototype.DEFAULT_VALUE = false; + +/** + * 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 + */ +Blockly.FieldCheckbox.fromJson = function(options) { + return new Blockly.FieldCheckbox(options['checked'], undefined, options); +}; + +/** + * Default character for the checkmark. + * @type {string} + * @const + */ +Blockly.FieldCheckbox.CHECK_CHAR = '\u2713'; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldCheckbox.prototype.SERIALIZABLE = true; + +/** + * Mouse cursor style when over the hotspot that initiates editability. + */ +Blockly.FieldCheckbox.prototype.CURSOR = 'default'; + +/** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @private + */ +Blockly.FieldCheckbox.prototype.configure_ = function(config) { + Blockly.FieldCheckbox.superClass_.configure_.call(this, config); + if (config['checkCharacter']) { + this.checkChar_ = config['checkCharacter']; + } +}; + +/** + * Create the block UI for this checkbox. + * @package + */ +Blockly.FieldCheckbox.prototype.initView = function() { + Blockly.FieldCheckbox.superClass_.initView.call(this); + + Blockly.utils.dom.addClass( + /** @type {!SVGTextElement} **/ (this.textElement_), 'blocklyCheckbox'); + this.textElement_.style.display = this.value_ ? 'block' : 'none'; +}; + +/** + * @override + */ +Blockly.FieldCheckbox.prototype.render_ = function() { + if (this.textContent_) { + this.textContent_.nodeValue = this.getDisplayText_(); + } + this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET); +}; + +/** + * @override + */ +Blockly.FieldCheckbox.prototype.getDisplayText_ = function() { + return this.checkChar_ || Blockly.FieldCheckbox.CHECK_CHAR; +}; + +/** + * 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. + */ +Blockly.FieldCheckbox.prototype.setCheckCharacter = function(character) { + this.checkChar_ = character; + this.forceRerender(); +}; + +/** + * Toggle the state of the checkbox on click. + * @protected + */ +Blockly.FieldCheckbox.prototype.showEditor_ = function() { + this.setValue(!this.value_); +}; + +/** + * 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 + */ +Blockly.FieldCheckbox.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === true || opt_newValue === 'TRUE') { + return 'TRUE'; + } + if (opt_newValue === false || opt_newValue === 'FALSE') { + return 'FALSE'; + } + return null; +}; + +/** + * 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 + */ +Blockly.FieldCheckbox.prototype.doValueUpdate_ = function(newValue) { + this.value_ = this.convertValueToBool_(newValue); + // Update visual. + if (this.textElement_) { + this.textElement_.style.display = this.value_ ? 'block' : 'none'; + } +}; + +/** + * Get the value of this field, either 'TRUE' or 'FALSE'. + * @return {string} The value of this field. + */ +Blockly.FieldCheckbox.prototype.getValue = function() { + return this.value_ ? 'TRUE' : 'FALSE'; +}; + +/** + * Get the boolean value of this field. + * @return {boolean} The boolean value of this field. + */ +Blockly.FieldCheckbox.prototype.getValueBoolean = function() { + return /** @type {boolean} */ (this.value_); +}; + +/** + * Get the text of this field. Used when the block is collapsed. + * @return {string} Text representing the value of this field + * ('true' or 'false'). + */ +Blockly.FieldCheckbox.prototype.getText = function() { + return String(this.convertValueToBool_(this.value_)); +}; + +/** + * Convert a value into a pure boolean. + * + * Converts 'TRUE' to true and 'FALSE' to false correctly, everything else + * is cast to a boolean. + * @param {*} value The value to convert. + * @return {boolean} The converted value. + * @private + */ +Blockly.FieldCheckbox.prototype.convertValueToBool_ = function(value) { + if (typeof value == 'string') { + return value == 'TRUE'; + } else { + return !!value; + } +}; + +Blockly.fieldRegistry.register('field_checkbox', Blockly.FieldCheckbox); diff --git a/static/js/dist/core/field_colour.js b/static/js/dist/core/field_colour.js new file mode 100644 index 0000000..6a31623 --- /dev/null +++ b/static/js/dist/core/field_colour.js @@ -0,0 +1,668 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Colour input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldColour'); + +goog.require('Blockly.Css'); +goog.require('Blockly.DropDownDiv'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Field'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.navigation'); +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.colour'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.IdGenerator'); +goog.require('Blockly.utils.KeyCodes'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Size'); + +goog.requireType('Blockly.ShortcutRegistry'); + +/** + * 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 + */ +Blockly.FieldColour = function(opt_value, opt_validator, opt_config) { + Blockly.FieldColour.superClass_.constructor.call( + this, opt_value, opt_validator, opt_config); + + /** + * The field's colour picker element. + * @type {Element} + * @private + */ + this.picker_ = null; + + /** + * Index of the currently highlighted element. + * @type {?number} + * @private + */ + this.highlightedIndex_ = null; + + /** + * Mouse click event data. + * @type {?Blockly.EventData} + * @private + */ + this.onClickWrapper_ = null; + + /** + * Mouse move event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseMoveWrapper_ = null; + + /** + * Mouse enter event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseEnterWrapper_ = null; + + /** + * Mouse leave event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseLeaveWrapper_ = null; + + /** + * Key down event data. + * @type {?Blockly.EventData} + * @private + */ + this.onKeyDownWrapper_ = null; +}; +Blockly.utils.object.inherits(Blockly.FieldColour, Blockly.Field); + +/** + * 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 + */ +Blockly.FieldColour.fromJson = function(options) { + return new Blockly.FieldColour(options['colour'], undefined, options); +}; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldColour.prototype.SERIALIZABLE = true; + +/** + * Mouse cursor style when over the hotspot that initiates the editor. + */ +Blockly.FieldColour.prototype.CURSOR = 'default'; + +/** + * 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 + */ +Blockly.FieldColour.prototype.isDirty_ = false; + +/** + * Array of colours used by this field. If null, use the global list. + * @type {Array.} + * @private + */ +Blockly.FieldColour.prototype.colours_ = null; + +/** + * Array of colour tooltips used by this field. If null, use the global list. + * @type {Array.} + * @private + */ +Blockly.FieldColour.prototype.titles_ = null; + +/** + * Number of colour columns used by this field. If 0, use the global setting. + * By default use the global constants for columns. + * @type {number} + * @private + */ +Blockly.FieldColour.prototype.columns_ = 0; + +/** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @private + */ +Blockly.FieldColour.prototype.configure_ = function(config) { + Blockly.FieldColour.superClass_.configure_.call(this, config); + if (config['colourOptions']) { + this.colours_ = config['colourOptions']; + this.titles_ = config['colourTitles']; + } + if (config['columns']) { + this.columns_ = config['columns']; + } +}; + +/** + * Create the block UI for this colour field. + * @package + */ +Blockly.FieldColour.prototype.initView = function() { + this.size_ = new Blockly.utils.Size( + this.getConstants().FIELD_COLOUR_DEFAULT_WIDTH, + this.getConstants().FIELD_COLOUR_DEFAULT_HEIGHT); + if (!this.getConstants().FIELD_COLOUR_FULL_BLOCK) { + this.createBorderRect_(); + this.borderRect_.style['fillOpacity'] = '1'; + } else { + this.clickTarget_ = this.sourceBlock_.getSvgRoot(); + } +}; + +/** + * @override + */ +Blockly.FieldColour.prototype.applyColour = function() { + if (!this.getConstants().FIELD_COLOUR_FULL_BLOCK) { + if (this.borderRect_) { + this.borderRect_.style.fill = this.getValue(); + } + } else { + this.sourceBlock_.pathObject.svgPath.setAttribute('fill', this.getValue()); + this.sourceBlock_.pathObject.svgPath.setAttribute('stroke', '#fff'); + } +}; + +/** + * 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 + */ +Blockly.FieldColour.prototype.doClassValidation_ = function(opt_newValue) { + if (typeof opt_newValue != 'string') { + return null; + } + return Blockly.utils.colour.parse(opt_newValue); +}; + +/** + * 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 + */ +Blockly.FieldColour.prototype.doValueUpdate_ = function(newValue) { + this.value_ = newValue; + if (this.borderRect_) { + this.borderRect_.style.fill = newValue; + } else if (this.sourceBlock_ && this.sourceBlock_.rendered) { + this.sourceBlock_.pathObject.svgPath.setAttribute('fill', newValue); + this.sourceBlock_.pathObject.svgPath.setAttribute('stroke', '#fff'); + } +}; + +/** + * Get the text for this field. Used when the block is collapsed. + * @return {string} Text representing the value of this field. + */ +Blockly.FieldColour.prototype.getText = function() { + var colour = /** @type {string} */ (this.value_); + // Try to use #rgb format if possible, rather than #rrggbb. + if (/^#(.)\1(.)\2(.)\3$/.test(colour)) { + colour = '#' + colour[1] + colour[3] + colour[5]; + } + return colour; +}; + +/** + * 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.} + */ +Blockly.FieldColour.COLOURS = [ + // grays + '#ffffff', '#cccccc', '#c0c0c0', '#999999', '#666666', '#333333', '#000000', + // reds + '#ffcccc', '#ff6666', '#ff0000', '#cc0000', '#990000', '#660000', '#330000', + // oranges + '#ffcc99', '#ff9966', '#ff9900', '#ff6600', '#cc6600', '#993300', '#663300', + // yellows + '#ffff99', '#ffff66', '#ffcc66', '#ffcc33', '#cc9933', '#996633', '#663333', + // olives + '#ffffcc', '#ffff33', '#ffff00', '#ffcc00', '#999900', '#666600', '#333300', + // greens + '#99ff99', '#66ff99', '#33ff33', '#33cc00', '#009900', '#006600', '#003300', + // turquoises + '#99ffff', '#33ffff', '#66cccc', '#00cccc', '#339999', '#336666', '#003333', + // blues + '#ccffff', '#66ffff', '#33ccff', '#3366ff', '#3333ff', '#000099', '#000066', + // purples + '#ccccff', '#9999ff', '#6666cc', '#6633ff', '#6600cc', '#333399', '#330099', + // violets + '#ffccff', '#ff99ff', '#cc66cc', '#cc33cc', '#993399', '#663366', '#330033' +]; + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldColour.prototype.DEFAULT_VALUE = Blockly.FieldColour.COLOURS[0]; + +/** + * 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.} + */ +Blockly.FieldColour.TITLES = []; + +/** + * Number of columns in the palette. + * All colour pickers use this unless overridden with setColumns. + */ +Blockly.FieldColour.COLUMNS = 7; + +/** + * 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). + */ +Blockly.FieldColour.prototype.setColours = function(colours, opt_titles) { + this.colours_ = colours; + if (opt_titles) { + this.titles_ = opt_titles; + } + return this; +}; + +/** + * 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). + */ +Blockly.FieldColour.prototype.setColumns = function(columns) { + this.columns_ = columns; + return this; +}; + +/** + * Create and show the colour field's editor. + * @protected + */ +Blockly.FieldColour.prototype.showEditor_ = function() { + this.picker_ = this.dropdownCreate_(); + Blockly.DropDownDiv.getContentDiv().appendChild(this.picker_); + + Blockly.DropDownDiv.showPositionedByField( + this, this.dropdownDispose_.bind(this)); + + // Focus so we can start receiving keyboard events. + this.picker_.focus({preventScroll:true}); +}; + +/** + * Handle a click on a colour cell. + * @param {!MouseEvent} e Mouse event. + * @private + */ +Blockly.FieldColour.prototype.onClick_ = function(e) { + var cell = /** @type {!Element} */ (e.target); + var colour = cell && cell.label; + if (colour !== null) { + this.setValue(colour); + Blockly.DropDownDiv.hideIfOwner(this); + } +}; + +/** + * Handle a key down event. Navigate around the grid with the + * arrow keys. Enter selects the highlighted colour. + * @param {!KeyboardEvent} e Keyboard event. + * @private + */ +Blockly.FieldColour.prototype.onKeyDown_ = function(e) { + var handled = false; + if (e.keyCode === Blockly.utils.KeyCodes.UP) { + this.moveHighlightBy_(0, -1); + handled = true; + } else if (e.keyCode === Blockly.utils.KeyCodes.DOWN) { + this.moveHighlightBy_(0, 1); + handled = true; + } else if (e.keyCode === Blockly.utils.KeyCodes.LEFT) { + this.moveHighlightBy_(-1, 0); + handled = true; + } else if (e.keyCode === Blockly.utils.KeyCodes.RIGHT) { + this.moveHighlightBy_(1, 0); + handled = true; + } else if (e.keyCode === Blockly.utils.KeyCodes.ENTER) { + // Select the highlighted colour. + var highlighted = this.getHighlighted_(); + if (highlighted) { + var colour = highlighted && highlighted.label; + if (colour !== null) { + this.setValue(colour); + } + } + Blockly.DropDownDiv.hideWithoutAnimation(); + handled = true; + } + if (handled) { + e.stopPropagation(); + } +}; + +/** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ +Blockly.FieldColour.prototype.onBlocklyAction = function(action) { + if (this.picker_) { + switch (action.name) { + case Blockly.navigation.actionNames.PREVIOUS: + this.moveHighlightBy_(0, -1); + return true; + case Blockly.navigation.actionNames.NEXT: + this.moveHighlightBy_(0, 1); + return true; + case Blockly.navigation.actionNames.OUT: + this.moveHighlightBy_(-1, 0); + return true; + case Blockly.navigation.actionNames.IN: + this.moveHighlightBy_(1, 0); + return true; + default: + return false; + } + } + return Blockly.FieldColour.superClass_.onBlocklyAction.call(this, action); +}; + +/** + * Move the currently highlighted position by dx and dy. + * @param {number} dx Change of x + * @param {number} dy Change of y + * @private + */ +Blockly.FieldColour.prototype.moveHighlightBy_ = function(dx, dy) { + var colours = this.colours_ || Blockly.FieldColour.COLOURS; + var columns = this.columns_ || Blockly.FieldColour.COLUMNS; + + // Get the current x and y coordinates + var x = this.highlightedIndex_ % columns; + var y = Math.floor(this.highlightedIndex_ / columns); + + // Add the offset + x += dx; + y += dy; + + if (dx < 0) { + // Move left one grid cell, even in RTL. + // Loop back to the end of the previous row if we have room. + if (x < 0 && y > 0) { + x = columns - 1; + y--; + } else if (x < 0) { + x = 0; + } + } else if (dx > 0) { + // Move right one grid cell, even in RTL. + // Loop to the start of the next row, if there's room. + if (x > columns - 1 && + y < Math.floor(colours.length / columns) - 1) { + x = 0; + y++; + } else if (x > columns - 1) { + x--; + } + } else if (dy < 0) { + // Move up one grid cell, stop at the top. + if (y < 0) { + y = 0; + } + } else if (dy > 0) { + // Move down one grid cell, stop at the bottom. + if (y > Math.floor(colours.length / columns) - 1) { + y = Math.floor(colours.length / columns) - 1; + } + } + + // Move the highlight to the new coordinates. + var cell = /** @type {!Element} */ (this.picker_.childNodes[y].childNodes[x]); + var index = (y * columns) + x; + this.setHighlightedCell_(cell, index); +}; + +/** + * Handle a mouse move event. Highlight the hovered colour. + * @param {!MouseEvent} e Mouse event. + * @private + */ +Blockly.FieldColour.prototype.onMouseMove_ = function(e) { + var cell = /** @type {!Element} */ (e.target); + var index = cell && Number(cell.getAttribute('data-index')); + if (index !== null && index !== this.highlightedIndex_) { + this.setHighlightedCell_(cell, index); + } +}; + +/** + * Handle a mouse enter event. Focus the picker. + * @private + */ +Blockly.FieldColour.prototype.onMouseEnter_ = function() { + this.picker_.focus({preventScroll:true}); +}; + +/** + * Handle a mouse leave event. Blur the picker and unhighlight + * the currently highlighted colour. + * @private + */ +Blockly.FieldColour.prototype.onMouseLeave_ = function() { + this.picker_.blur(); + var highlighted = this.getHighlighted_(); + if (highlighted) { + Blockly.utils.dom.removeClass(highlighted, 'blocklyColourHighlighted'); + } +}; + +/** + * Returns the currently highlighted item (if any). + * @return {HTMLElement} Highlighted item (null if none). + * @private + */ +Blockly.FieldColour.prototype.getHighlighted_ = function() { + var columns = this.columns_ || Blockly.FieldColour.COLUMNS; + var x = this.highlightedIndex_ % columns; + var y = Math.floor(this.highlightedIndex_ / columns); + var row = this.picker_.childNodes[y]; + if (!row) { + return null; + } + var col = /** @type {HTMLElement} */ (row.childNodes[x]); + return col; +}; + +/** + * Update the currently highlighted cell. + * @param {!Element} cell the new cell to highlight + * @param {number} index the index of the new cell + * @private + */ +Blockly.FieldColour.prototype.setHighlightedCell_ = function(cell, index) { + // Unhighlight the current item. + var highlighted = this.getHighlighted_(); + if (highlighted) { + Blockly.utils.dom.removeClass(highlighted, 'blocklyColourHighlighted'); + } + // Highlight new item. + Blockly.utils.dom.addClass(cell, 'blocklyColourHighlighted'); + // Set new highlighted index. + this.highlightedIndex_ = index; + + // Update accessibility roles. + Blockly.utils.aria.setState(/** @type {!Element} */ (this.picker_), + Blockly.utils.aria.State.ACTIVEDESCENDANT, cell.getAttribute('id')); +}; + +/** + * Create a colour picker dropdown editor. + * @return {!Element} The newly created colour picker. + * @private + */ +Blockly.FieldColour.prototype.dropdownCreate_ = function() { + var columns = this.columns_ || Blockly.FieldColour.COLUMNS; + var colours = this.colours_ || Blockly.FieldColour.COLOURS; + var titles = this.titles_ || Blockly.FieldColour.TITLES; + var selectedColour = this.getValue(); + // Create the palette. + var table = document.createElement('table'); + table.className = 'blocklyColourTable'; + table.tabIndex = 0; + table.dir = 'ltr'; + Blockly.utils.aria.setRole(table, Blockly.utils.aria.Role.GRID); + Blockly.utils.aria.setState(table, Blockly.utils.aria.State.EXPANDED, true); + Blockly.utils.aria.setState(table, Blockly.utils.aria.State.ROWCOUNT, + Math.floor(colours.length / columns)); + Blockly.utils.aria.setState(table, Blockly.utils.aria.State.COLCOUNT, + columns); + var row; + for (var i = 0; i < colours.length; i++) { + if (i % columns == 0) { + row = document.createElement('tr'); + Blockly.utils.aria.setRole(row, Blockly.utils.aria.Role.ROW); + table.appendChild(row); + } + var cell = document.createElement('td'); + row.appendChild(cell); + cell.label = colours[i]; // This becomes the value, if clicked. + cell.title = titles[i] || colours[i]; + cell.id = Blockly.utils.IdGenerator.getNextUniqueId(); + cell.setAttribute('data-index', i); + Blockly.utils.aria.setRole(cell, Blockly.utils.aria.Role.GRIDCELL); + Blockly.utils.aria.setState(cell, + Blockly.utils.aria.State.LABEL, colours[i]); + Blockly.utils.aria.setState(cell, + Blockly.utils.aria.State.SELECTED, colours[i] == selectedColour); + cell.style.backgroundColor = colours[i]; + if (colours[i] == selectedColour) { + cell.className = 'blocklyColourSelected'; + this.highlightedIndex_ = i; + } + } + + // Configure event handler on the table to listen for any event in a cell. + this.onClickWrapper_ = Blockly.bindEventWithChecks_(table, + 'click', this, this.onClick_, true); + this.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(table, + 'mousemove', this, this.onMouseMove_, true); + this.onMouseEnterWrapper_ = Blockly.bindEventWithChecks_(table, + 'mouseenter', this, this.onMouseEnter_, true); + this.onMouseLeaveWrapper_ = Blockly.bindEventWithChecks_(table, + 'mouseleave', this, this.onMouseLeave_, true); + this.onKeyDownWrapper_ = Blockly.bindEventWithChecks_(table, + 'keydown', this, this.onKeyDown_); + + return table; +}; + +/** + * Disposes of events and dom-references belonging to the colour editor. + * @private + */ +Blockly.FieldColour.prototype.dropdownDispose_ = function() { + if (this.onClickWrapper_) { + Blockly.unbindEvent_(this.onClickWrapper_); + this.onClickWrapper_ = null; + } + if (this.onMouseMoveWrapper_) { + Blockly.unbindEvent_(this.onMouseMoveWrapper_); + this.onMouseMoveWrapper_ = null; + } + if (this.onMouseEnterWrapper_) { + Blockly.unbindEvent_(this.onMouseEnterWrapper_); + this.onMouseEnterWrapper_ = null; + } + if (this.onMouseLeaveWrapper_) { + Blockly.unbindEvent_(this.onMouseLeaveWrapper_); + this.onMouseLeaveWrapper_ = null; + } + if (this.onKeyDownWrapper_) { + Blockly.unbindEvent_(this.onKeyDownWrapper_); + this.onKeyDownWrapper_ = null; + } + this.picker_ = null; + this.highlightedIndex_ = null; +}; + +/** + * CSS for colour picker. See css.js for use. + */ +Blockly.Css.register([ + /* eslint-disable indent */ + '.blocklyColourTable {', + 'border-collapse: collapse;', + 'display: block;', + 'outline: none;', + 'padding: 1px;', + '}', + + '.blocklyColourTable>tr>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;', + '}' + /* eslint-enable indent */ +]); + +Blockly.fieldRegistry.register('field_colour', Blockly.FieldColour); diff --git a/static/js/dist/core/field_dropdown.js b/static/js/dist/core/field_dropdown.js new file mode 100644 index 0000000..d1b0af9 --- /dev/null +++ b/static/js/dist/core/field_dropdown.js @@ -0,0 +1,765 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Dropdown input field. Used for editable titles and variables. + * In the interests of a consistent UI, the toolbox shares some functions and + * properties with the context menu. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldDropdown'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Field'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.Menu'); +goog.require('Blockly.MenuItem'); +goog.require('Blockly.navigation'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.utils.string'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); + +goog.requireType('Blockly.ShortcutRegistry'); + + +/** + * 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. + */ +Blockly.FieldDropdown = function(menuGenerator, opt_validator, opt_config) { + if (typeof menuGenerator != 'function') { + Blockly.FieldDropdown.validateOptions_(menuGenerator); + } + + /** + * An array of options for a dropdown list, + * or a function which generates these options. + * @type {(!Array.| + * !function(this:Blockly.FieldDropdown): !Array.)} + * @protected + */ + this.menuGenerator_ = menuGenerator; + + /** + * A cache of the most recently generated options. + * @type {Array.>} + * @private + */ + this.generatedOptions_ = null; + + /** + * The prefix field label, of common words set after options are trimmed. + * @type {?string} + * @package + */ + this.prefixField = null; + + /** + * The suffix field label, of common words set after options are trimmed. + * @type {?string} + * @package + */ + this.suffixField = null; + + this.trimOptions_(); + + /** + * The currently selected option. The field is initialized with the + * first option selected. + * @type {!Object} + * @private + */ + this.selectedOption_ = this.getOptions(false)[0]; + + // Call parent's constructor. + Blockly.FieldDropdown.superClass_.constructor.call( + this, this.selectedOption_[1], opt_validator, opt_config); + + /** + * A reference to the currently selected menu item. + * @type {Blockly.MenuItem} + * @private + */ + this.selectedMenuItem_ = null; + + /** + * The dropdown menu. + * @type {Blockly.Menu} + * @protected + */ + this.menu_ = null; + + /** + * SVG image element if currently selected option is an image, or null. + * @type {SVGImageElement} + * @private + */ + this.imageElement_ = null; + + /** + * Tspan based arrow element. + * @type {SVGTSpanElement} + * @private + */ + this.arrow_ = null; + + /** + * SVG based arrow element. + * @type {SVGElement} + * @private + */ + this.svgArrow_ = null; +}; +Blockly.utils.object.inherits(Blockly.FieldDropdown, Blockly.Field); + +/** + * Dropdown image properties. + * @typedef {{ + * src:string, + * alt:string, + * width:number, + * height:number + * }} + */ +Blockly.FieldDropdown.ImageProperties; + +/** + * 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 + */ +Blockly.FieldDropdown.fromJson = function(options) { + return new Blockly.FieldDropdown(options['options'], undefined, options); +}; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldDropdown.prototype.SERIALIZABLE = true; + +/** + * Horizontal distance that a checkmark overhangs the dropdown. + */ +Blockly.FieldDropdown.CHECKMARK_OVERHANG = 25; + +/** + * Maximum height of the dropdown menu, as a percentage of the viewport height. + */ +Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH = 0.45; + +/** + * The y offset from the top of the field to the top of the image, if an image + * is selected. + * @type {number} + * @const + * @private + */ +Blockly.FieldDropdown.IMAGE_Y_OFFSET = 5; + +/** + * The total vertical padding above and below an image. + * @type {number} + * @const + * @private + */ +Blockly.FieldDropdown.IMAGE_Y_PADDING = + Blockly.FieldDropdown.IMAGE_Y_OFFSET * 2; + +/** + * Android can't (in 2014) display "▾", so use "▼" instead. + */ +Blockly.FieldDropdown.ARROW_CHAR = + Blockly.utils.userAgent.ANDROID ? '\u25BC' : '\u25BE'; + +/** + * Mouse cursor style when over the hotspot that initiates the editor. + */ +Blockly.FieldDropdown.prototype.CURSOR = 'default'; + +/** + * Create the block UI for this dropdown. + * @package + */ +Blockly.FieldDropdown.prototype.initView = function() { + if (this.shouldAddBorderRect_()) { + this.createBorderRect_(); + } else { + this.clickTarget_ = this.sourceBlock_.getSvgRoot(); + } + this.createTextElement_(); + + this.imageElement_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.IMAGE, {}, this.fieldGroup_); + + if (this.getConstants().FIELD_DROPDOWN_SVG_ARROW) { + this.createSVGArrow_(); + } else { + this.createTextArrow_(); + } + + if (this.borderRect_) { + Blockly.utils.dom.addClass(this.borderRect_, 'blocklyDropdownRect'); + } +}; + +/** + * Whether or not the dropdown should add a border rect. + * @return {boolean} True if the dropdown field should add a border rect. + * @protected + */ +Blockly.FieldDropdown.prototype.shouldAddBorderRect_ = function() { + return !this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW || + (this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW && + !this.sourceBlock_.isShadow()); +}; + +/** + * Create a tspan based arrow. + * @protected + */ +Blockly.FieldDropdown.prototype.createTextArrow_ = function() { + this.arrow_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TSPAN, {}, this.textElement_); + this.arrow_.appendChild(document.createTextNode( + this.sourceBlock_.RTL ? + Blockly.FieldDropdown.ARROW_CHAR + ' ' : + ' ' + Blockly.FieldDropdown.ARROW_CHAR)); + if (this.sourceBlock_.RTL) { + this.textElement_.insertBefore(this.arrow_, this.textContent_); + } else { + this.textElement_.appendChild(this.arrow_); + } +}; + +/** + * Create an SVG based arrow. + * @protected + */ +Blockly.FieldDropdown.prototype.createSVGArrow_ = function() { + this.svgArrow_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.IMAGE, { + 'height': this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE + 'px', + 'width': this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE + 'px' + }, this.fieldGroup_); + this.svgArrow_.setAttributeNS(Blockly.utils.dom.XLINK_NS, 'xlink:href', + this.getConstants().FIELD_DROPDOWN_SVG_ARROW_DATAURI); +}; + +/** + * Create a dropdown menu under the text. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @protected + */ +Blockly.FieldDropdown.prototype.showEditor_ = function(opt_e) { + this.menu_ = this.dropdownCreate_(); + if (opt_e && typeof opt_e.clientX === 'number') { + this.menu_.openingCoords = + new Blockly.utils.Coordinate(opt_e.clientX, opt_e.clientY); + } else { + this.menu_.openingCoords = null; + } + // Element gets created in render. + this.menu_.render(Blockly.DropDownDiv.getContentDiv()); + var menuElement = /** @type {!Element} */ (this.menu_.getElement()); + Blockly.utils.dom.addClass(menuElement, 'blocklyDropdownMenu'); + + if (this.getConstants().FIELD_DROPDOWN_COLOURED_DIV) { + var primaryColour = (this.sourceBlock_.isShadow()) ? + this.sourceBlock_.getParent().getColour() : + this.sourceBlock_.getColour(); + var borderColour = (this.sourceBlock_.isShadow()) ? + this.sourceBlock_.getParent().style.colourTertiary : + this.sourceBlock_.style.colourTertiary; + Blockly.DropDownDiv.setColour(primaryColour, borderColour); + } + + Blockly.DropDownDiv.showPositionedByField( + this, this.dropdownDispose_.bind(this)); + + // Focusing needs to be handled after the menu is rendered and positioned. + // Otherwise it will cause a page scroll to get the misplaced menu in + // view. See issue #1329. + this.menu_.focus(); + + if (this.selectedMenuItem_) { + this.menu_.setHighlighted(this.selectedMenuItem_); + } + + this.applyColour(); +}; + +/** + * Create the dropdown editor. + * @return {!Blockly.Menu} The newly created dropdown menu. + * @private + */ +Blockly.FieldDropdown.prototype.dropdownCreate_ = function() { + var menu = new Blockly.Menu(); + menu.setRole(Blockly.utils.aria.Role.LISTBOX); + + var options = this.getOptions(false); + this.selectedMenuItem_ = null; + for (var i = 0; i < options.length; i++) { + var content = options[i][0]; // Human-readable text or image. + var value = options[i][1]; // Language-neutral value. + if (typeof content == 'object') { + // An image, not text. + var image = new Image(content['width'], content['height']); + image.src = content['src']; + image.alt = content['alt'] || ''; + content = image; + } + var menuItem = new Blockly.MenuItem(content, value); + menuItem.setRole(Blockly.utils.aria.Role.OPTION); + menuItem.setRightToLeft(this.sourceBlock_.RTL); + menuItem.setCheckable(true); + menu.addChild(menuItem); + menuItem.setChecked(value == this.value_); + if (value == this.value_) { + this.selectedMenuItem_ = menuItem; + } + menuItem.onAction(this.handleMenuActionEvent_, this); + } + + return menu; +}; + +/** + * Disposes of events and dom-references belonging to the dropdown editor. + * @private + */ +Blockly.FieldDropdown.prototype.dropdownDispose_ = function() { + if (this.menu_) { + this.menu_.dispose(); + } + this.menu_ = null; + this.selectedMenuItem_ = null; + this.applyColour(); +}; + +/** + * Handle an action in the dropdown menu. + * @param {!Blockly.MenuItem} menuItem The MenuItem selected within menu. + * @private + */ +Blockly.FieldDropdown.prototype.handleMenuActionEvent_ = function(menuItem) { + Blockly.DropDownDiv.hideIfOwner(this, true); + this.onItemSelected_(/** @type {!Blockly.Menu} */ (this.menu_), menuItem); +}; + +/** + * 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 + */ +Blockly.FieldDropdown.prototype.onItemSelected_ = function(menu, menuItem) { + this.setValue(menuItem.getValue()); +}; + +/** + * Factor out common words in statically defined options. + * Create prefix and/or suffix labels. + * @private + */ +Blockly.FieldDropdown.prototype.trimOptions_ = function() { + var options = this.menuGenerator_; + if (!Array.isArray(options)) { + return; + } + var hasImages = false; + + // Localize label text and image alt text. + for (var i = 0; i < options.length; i++) { + var label = options[i][0]; + if (typeof label == 'string') { + options[i][0] = Blockly.utils.replaceMessageReferences(label); + } else { + if (label.alt != null) { + options[i][0].alt = Blockly.utils.replaceMessageReferences(label.alt); + } + hasImages = true; + } + } + if (hasImages || options.length < 2) { + return; // Do nothing if too few items or at least one label is an image. + } + var strings = []; + for (var i = 0; i < options.length; i++) { + strings.push(options[i][0]); + } + var shortest = Blockly.utils.string.shortestStringLength(strings); + var prefixLength = Blockly.utils.string.commonWordPrefix(strings, shortest); + var suffixLength = Blockly.utils.string.commonWordSuffix(strings, shortest); + if (!prefixLength && !suffixLength) { + return; + } + if (shortest <= prefixLength + suffixLength) { + // One or more strings will entirely vanish if we proceed. Abort. + return; + } + if (prefixLength) { + this.prefixField = strings[0].substring(0, prefixLength - 1); + } + if (suffixLength) { + this.suffixField = strings[0].substr(1 - suffixLength); + } + + this.menuGenerator_ = Blockly.FieldDropdown.applyTrim_(options, prefixLength, + suffixLength); +}; + +/** + * 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. + */ +Blockly.FieldDropdown.applyTrim_ = function(options, + prefixLength, suffixLength) { + var newOptions = []; + // Remove the prefix and suffix from the options. + for (var i = 0; i < options.length; i++) { + var text = options[i][0]; + var value = options[i][1]; + text = text.substring(prefixLength, text.length - suffixLength); + newOptions[i] = [text, value]; + } + return newOptions; +}; + +/** + * @return {boolean} True if the option list is generated by a function. + * Otherwise false. + */ +Blockly.FieldDropdown.prototype.isOptionListDynamic = function() { + return typeof this.menuGenerator_ == 'function'; +}; + +/** + * 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. + */ +Blockly.FieldDropdown.prototype.getOptions = function(opt_useCache) { + if (this.isOptionListDynamic()) { + if (!this.generatedOptions_ || !opt_useCache) { + this.generatedOptions_ = this.menuGenerator_.call(this); + Blockly.FieldDropdown.validateOptions_(this.generatedOptions_); + } + return this.generatedOptions_; + } + return /** @type {!Array.>} */ (this.menuGenerator_); +}; + +/** + * 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 + */ +Blockly.FieldDropdown.prototype.doClassValidation_ = function(opt_newValue) { + var isValueValid = false; + var options = this.getOptions(true); + for (var i = 0, option; (option = options[i]); i++) { + // Options are tuples of human-readable text and language-neutral values. + if (option[1] == opt_newValue) { + isValueValid = true; + break; + } + } + if (!isValueValid) { + if (this.sourceBlock_) { + console.warn('Cannot set the dropdown\'s value to an unavailable option.' + + ' Block type: ' + this.sourceBlock_.type + ', Field name: ' + this.name + + ', Value: ' + opt_newValue); + } + return null; + } + return /** @type {string} */ (opt_newValue); +}; + +/** + * 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 + */ +Blockly.FieldDropdown.prototype.doValueUpdate_ = function(newValue) { + Blockly.FieldDropdown.superClass_.doValueUpdate_.call(this, newValue); + var options = this.getOptions(true); + for (var i = 0, option; (option = options[i]); i++) { + if (option[1] == this.value_) { + this.selectedOption_ = option; + } + } +}; + +/** + * Updates the dropdown arrow to match the colour/style of the block. + * @package + */ +Blockly.FieldDropdown.prototype.applyColour = function() { + if (this.borderRect_) { + this.borderRect_.setAttribute('stroke', + this.sourceBlock_.style.colourTertiary); + if (this.menu_) { + this.borderRect_.setAttribute('fill', + this.sourceBlock_.style.colourTertiary); + } else { + this.borderRect_.setAttribute('fill', 'transparent'); + } + } + // Update arrow's colour. + if (this.sourceBlock_ && this.arrow_) { + if (this.sourceBlock_.isShadow()) { + this.arrow_.style.fill = this.sourceBlock_.style.colourSecondary; + } else { + this.arrow_.style.fill = this.sourceBlock_.style.colourPrimary; + } + } +}; + +/** + * Draws the border with the correct width. + * @protected + */ +Blockly.FieldDropdown.prototype.render_ = function() { + // Hide both elements. + this.textContent_.nodeValue = ''; + this.imageElement_.style.display = 'none'; + + // Show correct element. + var option = this.selectedOption_ && this.selectedOption_[0]; + if (option && typeof option == 'object') { + this.renderSelectedImage_( + /** @type {!Blockly.FieldDropdown.ImageProperties} */ (option)); + } else { + this.renderSelectedText_(); + } + + this.positionBorderRect_(); +}; + +/** + * Renders the selected option, which must be an image. + * @param {!Blockly.FieldDropdown.ImageProperties} imageJson Selected + * option that must be an image. + * @private + */ +Blockly.FieldDropdown.prototype.renderSelectedImage_ = function(imageJson) { + this.imageElement_.style.display = ''; + this.imageElement_.setAttributeNS( + Blockly.utils.dom.XLINK_NS, 'xlink:href', imageJson.src); + this.imageElement_.setAttribute('height', imageJson.height); + this.imageElement_.setAttribute('width', imageJson.width); + + var imageHeight = Number(imageJson.height); + var imageWidth = Number(imageJson.width); + + // Height and width include the border rect. + var hasBorder = !!this.borderRect_; + var height = Math.max( + hasBorder ? this.getConstants().FIELD_DROPDOWN_BORDER_RECT_HEIGHT : 0, + imageHeight + Blockly.FieldDropdown.IMAGE_Y_PADDING); + var xPadding = hasBorder ? this.getConstants().FIELD_BORDER_RECT_X_PADDING : 0; + var arrowWidth = 0; + if (this.svgArrow_) { + arrowWidth = this.positionSVGArrow_(imageWidth + xPadding, height / 2 - + this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE / 2); + } else { + arrowWidth = Blockly.utils.dom.getFastTextWidth( + /** @type {!SVGTSpanElement} */ (this.arrow_), + this.getConstants().FIELD_TEXT_FONTSIZE, + this.getConstants().FIELD_TEXT_FONTWEIGHT, + this.getConstants().FIELD_TEXT_FONTFAMILY); + } + this.size_.width = imageWidth + arrowWidth + xPadding * 2; + this.size_.height = height; + + var arrowX = 0; + if (this.sourceBlock_.RTL) { + var imageX = xPadding + arrowWidth; + this.imageElement_.setAttribute('x', imageX); + } else { + arrowX = imageWidth + arrowWidth; + this.textElement_.setAttribute('text-anchor', 'end'); + this.imageElement_.setAttribute('x', xPadding); + } + this.imageElement_.setAttribute('y', height / 2 - imageHeight / 2); + + this.positionTextElement_(arrowX + xPadding, imageWidth + arrowWidth); +}; + +/** + * Renders the selected option, which must be text. + * @private + */ +Blockly.FieldDropdown.prototype.renderSelectedText_ = function() { + // Retrieves the selected option to display through getText_. + this.textContent_.nodeValue = this.getDisplayText_(); + Blockly.utils.dom.addClass(/** @type {!Element} */ (this.textElement_), + 'blocklyDropdownText'); + this.textElement_.setAttribute('text-anchor', 'start'); + + // Height and width include the border rect. + var hasBorder = !!this.borderRect_; + var height = Math.max( + hasBorder ? this.getConstants().FIELD_DROPDOWN_BORDER_RECT_HEIGHT : 0, + this.getConstants().FIELD_TEXT_HEIGHT); + var textWidth = Blockly.utils.dom.getFastTextWidth(this.textElement_, + this.getConstants().FIELD_TEXT_FONTSIZE, + this.getConstants().FIELD_TEXT_FONTWEIGHT, + this.getConstants().FIELD_TEXT_FONTFAMILY); + var xPadding = hasBorder ? this.getConstants().FIELD_BORDER_RECT_X_PADDING : 0; + var arrowWidth = 0; + if (this.svgArrow_) { + arrowWidth = this.positionSVGArrow_(textWidth + xPadding, height / 2 - + this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE / 2); + } + this.size_.width = textWidth + arrowWidth + xPadding * 2; + this.size_.height = height; + + this.positionTextElement_(xPadding, textWidth); +}; + +/** + * Position a drop-down arrow at the appropriate location at render-time. + * @param {number} x X position the arrow is being rendered at, in px. + * @param {number} y Y position the arrow is being rendered at, in px. + * @return {number} Amount of space the arrow is taking up, in px. + * @private + */ +Blockly.FieldDropdown.prototype.positionSVGArrow_ = function(x, y) { + if (!this.svgArrow_) { + return 0; + } + var hasBorder = !!this.borderRect_; + var xPadding = hasBorder ? this.getConstants().FIELD_BORDER_RECT_X_PADDING : 0; + var textPadding = this.getConstants().FIELD_DROPDOWN_SVG_ARROW_PADDING; + var svgArrowSize = this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE; + var arrowX = this.sourceBlock_.RTL ? xPadding : x + textPadding; + this.svgArrow_.setAttribute('transform', + 'translate(' + arrowX + ',' + y + ')'); + return svgArrowSize + textPadding; +}; + +/** + * Use the `getText_` developer hook to override the field's text + * representation. Get the selected option text. If the selected option is an + * image we return the image alt text. + * @return {?string} Selected option text. + * @protected + * @override + */ +Blockly.FieldDropdown.prototype.getText_ = function() { + if (!this.selectedOption_) { + return null; + } + var option = this.selectedOption_[0]; + if (typeof option == 'object') { + return option['alt']; + } + return option; +}; + +/** + * Validates the data structure to be processed as an options list. + * @param {?} options The proposed dropdown options. + * @throws {TypeError} If proposed options are incorrectly structured. + * @private + */ +Blockly.FieldDropdown.validateOptions_ = function(options) { + if (!Array.isArray(options)) { + throw TypeError('FieldDropdown options must be an array.'); + } + if (!options.length) { + throw TypeError('FieldDropdown options must not be an empty array.'); + } + var foundError = false; + for (var i = 0; i < options.length; ++i) { + var tuple = options[i]; + if (!Array.isArray(tuple)) { + foundError = true; + console.error( + 'Invalid option[' + i + ']: Each FieldDropdown option must be an ' + + 'array. Found: ', tuple); + } else if (typeof tuple[1] != 'string') { + foundError = true; + console.error( + 'Invalid option[' + i + ']: Each FieldDropdown option id must be ' + + 'a string. Found ' + tuple[1] + ' in: ', tuple); + } else if (tuple[0] && + (typeof tuple[0] != 'string') && + (typeof tuple[0].src != 'string')) { + foundError = true; + console.error( + 'Invalid option[' + i + ']: Each FieldDropdown option must have a ' + + 'string label or image description. Found' + tuple[0] + ' in: ', + tuple); + } + } + if (foundError) { + throw TypeError('Found invalid FieldDropdown options.'); + } +}; + +/** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ +Blockly.FieldDropdown.prototype.onBlocklyAction = function(action) { + if (this.menu_) { + switch (action.name) { + case Blockly.navigation.actionNames.PREVIOUS: + this.menu_.highlightPrevious(); + return true; + case Blockly.navigation.actionNames.NEXT: + this.menu_.highlightNext(); + return true; + default: + return false; + } + } + return Blockly.FieldDropdown.superClass_.onBlocklyAction.call(this, action); +}; + + +Blockly.fieldRegistry.register('field_dropdown', Blockly.FieldDropdown); diff --git a/static/js/dist/core/field_image.js b/static/js/dist/core/field_image.js new file mode 100644 index 0000000..60400de --- /dev/null +++ b/static/js/dist/core/field_image.js @@ -0,0 +1,286 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Image field. Used for pictures, icons, etc. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldImage'); + +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'); +goog.require('Blockly.utils.Svg'); + + +/** + * Class for an image on a block. + * @param {string} src The URL of the image. + * @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 + */ +Blockly.FieldImage = function(src, width, height, + opt_alt, opt_onClick, opt_flipRtl, opt_config) { + // Return early. + if (!src) { + throw Error('Src value of an image field is required'); + } + src = Blockly.utils.replaceMessageReferences(src); + var imageHeight = Number(Blockly.utils.replaceMessageReferences(height)); + var imageWidth = Number(Blockly.utils.replaceMessageReferences(width)); + if (isNaN(imageHeight) || isNaN(imageWidth)) { + throw Error('Height and width values of an image field must cast to' + + ' numbers.'); + } + if (imageHeight <= 0 || imageWidth <= 0) { + throw Error('Height and width values of an image field must be greater' + + ' than 0.'); + } + + // Initialize configurable properties. + /** + * Whether to flip this image in RTL. + * @type {boolean} + * @private + */ + this.flipRtl_ = false; + + /** + * Alt text of this image. + * @type {string} + * @private + */ + this.altText_ = ''; + + Blockly.FieldImage.superClass_.constructor.call( + this, src, null, opt_config); + + if (!opt_config) { // If the config wasn't passed, do old configuration. + this.flipRtl_ = !!opt_flipRtl; + this.altText_ = Blockly.utils.replaceMessageReferences(opt_alt) || ''; + } + + // Initialize other properties. + /** + * The size of the area rendered by the field. + * @type {Blockly.utils.Size} + * @protected + * @override + */ + this.size_ = new Blockly.utils.Size(imageWidth, + imageHeight + Blockly.FieldImage.Y_PADDING); + + /** + * Store the image height, since it is different from the field height. + * @type {number} + * @private + */ + this.imageHeight_ = imageHeight; + + /** + * The function to be called when this field is clicked. + * @type {?function(!Blockly.FieldImage)} + * @private + */ + this.clickHandler_ = null; + + if (typeof opt_onClick == 'function') { + this.clickHandler_ = opt_onClick; + } + + /** + * The rendered field's image element. + * @type {SVGImageElement} + * @private + */ + this.imageElement_ = null; +}; +Blockly.utils.object.inherits(Blockly.FieldImage, Blockly.Field); + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldImage.prototype.DEFAULT_VALUE = ''; + +/** + * 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 + */ +Blockly.FieldImage.fromJson = function(options) { + return new Blockly.FieldImage( + options['src'], options['width'], options['height'], + undefined, undefined, undefined, options); +}; + +/** + * Vertical padding below the image, which is included in the reported height of + * the field. + * @type {number} + * @private + */ +Blockly.FieldImage.Y_PADDING = 1; + +/** + * Editable fields usually show some sort of UI indicating they are + * editable. This field should not. + * @type {boolean} + */ +Blockly.FieldImage.prototype.EDITABLE = false; + +/** + * 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 + */ +Blockly.FieldImage.prototype.isDirty_ = false; + +/** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @private + */ +Blockly.FieldImage.prototype.configure_ = function(config) { + Blockly.FieldImage.superClass_.configure_.call(this, config); + this.flipRtl_ = !!config['flipRtl']; + this.altText_ = Blockly.utils.replaceMessageReferences(config['alt']) || ''; +}; + +/** + * Create the block UI for this image. + * @package + */ +Blockly.FieldImage.prototype.initView = function() { + this.imageElement_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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', /** @type {string} */ (this.value_)); + + if (this.clickHandler_) { + this.imageElement_.style.cursor = 'pointer'; + } +}; + +/** + * @override + */ +Blockly.FieldImage.prototype.updateSize_ = function() { + // NOP +}; + +/** + * 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 + */ +Blockly.FieldImage.prototype.doClassValidation_ = function(opt_newValue) { + if (typeof opt_newValue != 'string') { + return null; + } + return opt_newValue; +}; + +/** + * 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 + */ +Blockly.FieldImage.prototype.doValueUpdate_ = function(newValue) { + this.value_ = newValue; + if (this.imageElement_) { + this.imageElement_.setAttributeNS(Blockly.utils.dom.XLINK_NS, + 'xlink:href', String(this.value_)); + } +}; + +/** + * Get whether to flip this image in RTL + * @return {boolean} True if we should flip in RTL. + * @override + */ +Blockly.FieldImage.prototype.getFlipRtl = function() { + return this.flipRtl_; +}; + +/** + * Set the alt text of this image. + * @param {?string} alt New alt text. + * @public + */ +Blockly.FieldImage.prototype.setAlt = function(alt) { + if (alt == this.altText_) { + return; + } + this.altText_ = alt || ''; + if (this.imageElement_) { + this.imageElement_.setAttribute('alt', this.altText_); + } +}; + +/** + * If field click is called, and click handler defined, + * call the handler. + * @protected + */ +Blockly.FieldImage.prototype.showEditor_ = function() { + if (this.clickHandler_) { + this.clickHandler_(this); + } +}; + +/** + * 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. + */ +Blockly.FieldImage.prototype.setOnClickHandler = function(func) { + this.clickHandler_ = func; +}; + +/** + * Use the `getText_` developer hook to override the field's text + * representation. + * Return the image alt text instead. + * @return {?string} The image alt text. + * @protected + * @override + */ +Blockly.FieldImage.prototype.getText_ = function() { + return this.altText_; +}; + +Blockly.fieldRegistry.register('field_image', Blockly.FieldImage); diff --git a/static/js/dist/core/field_label.js b/static/js/dist/core/field_label.js new file mode 100644 index 0000000..87942a3 --- /dev/null +++ b/static/js/dist/core/field_label.js @@ -0,0 +1,130 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Non-editable, non-serializable text field. Used for titles, + * labels, etc. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldLabel'); + +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'); + + +/** + * 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 + */ +Blockly.FieldLabel = function(opt_value, opt_class, opt_config) { + /** + * The html class name to use for this field. + * @type {?string} + * @private + */ + this.class_ = null; + + Blockly.FieldLabel.superClass_.constructor.call( + this, opt_value, null, opt_config); + + if (!opt_config) { // If the config was not passed use old configuration. + this.class_ = opt_class || null; + } +}; +Blockly.utils.object.inherits(Blockly.FieldLabel, Blockly.Field); + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldLabel.prototype.DEFAULT_VALUE = ''; + +/** + * 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 + */ +Blockly.FieldLabel.fromJson = function(options) { + var text = Blockly.utils.replaceMessageReferences(options['text']); + return new Blockly.FieldLabel(text, undefined, options); +}; + +/** + * Editable fields usually show some sort of UI indicating they are + * editable. This field should not. + * @type {boolean} + */ +Blockly.FieldLabel.prototype.EDITABLE = false; + +/** + * @override + */ +Blockly.FieldLabel.prototype.configure_ = function(config) { + Blockly.FieldLabel.superClass_.configure_.call(this, config); + this.class_ = config['class']; +}; + +/** + * Create block UI for this label. + * @package + */ +Blockly.FieldLabel.prototype.initView = function() { + this.createTextElement_(); + if (this.class_) { + Blockly.utils.dom.addClass( + /** @type {!SVGTextElement} */ (this.textElement_), this.class_); + } +}; + +/** + * 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 + */ +Blockly.FieldLabel.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === null || opt_newValue === undefined) { + return null; + } + return String(opt_newValue); +}; + +/** + * Set the css class applied to the field's textElement_. + * @param {?string} cssClass The new css class name, or null to remove. + */ +Blockly.FieldLabel.prototype.setClass = function(cssClass) { + if (this.textElement_) { + // This check isn't necessary, but it's faster than letting removeClass + // figure it out. + if (this.class_) { + Blockly.utils.dom.removeClass(this.textElement_, this.class_); + } + if (cssClass) { + Blockly.utils.dom.addClass(this.textElement_, cssClass); + } + } + this.class_ = cssClass; +}; + +Blockly.fieldRegistry.register('field_label', Blockly.FieldLabel); diff --git a/static/js/dist/core/field_label_serializable.js b/static/js/dist/core/field_label_serializable.js new file mode 100644 index 0000000..eeaac9f --- /dev/null +++ b/static/js/dist/core/field_label_serializable.js @@ -0,0 +1,69 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Non-editable, serializable text field. Behaves like a + * normal label but is serialized to XML. It may only be + * edited programmatically. + */ +'use strict'; + +goog.provide('Blockly.FieldLabelSerializable'); + +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.object'); + + +/** + * 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 + * + */ +Blockly.FieldLabelSerializable = function(opt_value, opt_class, opt_config) { + Blockly.FieldLabelSerializable.superClass_.constructor.call( + this, opt_value, opt_class, opt_config); +}; +Blockly.utils.object.inherits(Blockly.FieldLabelSerializable, + Blockly.FieldLabel); + +/** + * 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 + */ +Blockly.FieldLabelSerializable.fromJson = function(options) { + var text = Blockly.utils.replaceMessageReferences(options['text']); + return new Blockly.FieldLabelSerializable(text, undefined, options); +}; + +/** + * Editable fields usually show some sort of UI indicating they are + * editable. This field should not. + * @type {boolean} + */ +Blockly.FieldLabelSerializable.prototype.EDITABLE = false; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. This field should be serialized, but only edited programmatically. + * @type {boolean} + */ +Blockly.FieldLabelSerializable.prototype.SERIALIZABLE = true; + +Blockly.fieldRegistry.register( + 'field_label_serializable', Blockly.FieldLabelSerializable); diff --git a/static/js/dist/core/field_multilineinput.js b/static/js/dist/core/field_multilineinput.js new file mode 100644 index 0000000..38b8db6 --- /dev/null +++ b/static/js/dist/core/field_multilineinput.js @@ -0,0 +1,297 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Text Area field. + * @author fraser@google.com (Neil Fraser) + * @author Andrew Mee + * @author acbart@udel.edu (Austin Cory Bart) + */ +'use strict'; + +goog.provide('Blockly.FieldMultilineInput'); + +goog.require('Blockly.Css'); +goog.require('Blockly.DropDownDiv'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.KeyCodes'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); + + +/** + * 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/multiline-text-input#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.FieldTextInput} + * @constructor + */ +Blockly.FieldMultilineInput = function(opt_value, opt_validator, opt_config) { + Blockly.FieldMultilineInput.superClass_.constructor.call(this, + opt_value, opt_validator, opt_config); + + /** + * The SVG group element that will contain a text element for each text row + * when initialized. + * @type {SVGGElement} + */ + this.textGroup_ = null; +}; +Blockly.utils.object.inherits(Blockly.FieldMultilineInput, + Blockly.FieldTextInput); + +/** + * 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 + */ +Blockly.FieldMultilineInput.fromJson = function(options) { + var text = Blockly.utils.replaceMessageReferences(options['text']); + return new Blockly.FieldMultilineInput(text, undefined, options); +}; + +/** + * 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 + */ +Blockly.FieldMultilineInput.prototype.toXml = function(fieldElement) { + // Replace '\n' characters with html-escaped equivalent ' '. This is + // needed so the plain-text representation of the xml produced by + // `Blockly.Xml.domToText` will appear on a single line (this is a limitation + // of the plain-text format). + fieldElement.textContent = this.getValue().replace(/\n/g, ' '); + return fieldElement; +}; + +/** + * 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 + */ +Blockly.FieldMultilineInput.prototype.fromXml = function(fieldElement) { + this.setValue(fieldElement.textContent.replace(/ /g, '\n')); +}; + +/** + * Create the block UI for this field. + * @package + */ +Blockly.FieldMultilineInput.prototype.initView = function() { + this.createBorderRect_(); + this.textGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, { + 'class': 'blocklyEditableText', + }, this.fieldGroup_); +}; + +/** + * Get the text from this field as displayed on screen. May differ from getText + * due to ellipsis, and other formatting. + * @return {string} Currently displayed text. + * @private + */ +Blockly.FieldMultilineInput.prototype.getDisplayText_ = function() { + var textLines = this.getText(); + if (!textLines) { + // Prevent the field from disappearing if empty. + return Blockly.Field.NBSP; + } + var lines = textLines.split('\n'); + textLines = ''; + for (var i = 0; i < lines.length; i++) { + var text = lines[i]; + if (text.length > this.maxDisplayLength) { + // Truncate displayed string and add an ellipsis ('...'). + text = text.substring(0, this.maxDisplayLength - 4) + '...'; + } + // Replace whitespace with non-breaking spaces so the text doesn't collapse. + text = text.replace(/\s/g, Blockly.Field.NBSP); + + textLines += text; + if (i !== lines.length - 1) { + textLines += '\n'; + } + } + if (this.sourceBlock_.RTL) { + // The SVG is LTR, force value to be RTL. + textLines += '\u200F'; + } + return textLines; +}; + +/** + * Updates the text of the textElement. + * @protected + */ +Blockly.FieldMultilineInput.prototype.render_ = function() { + // Remove all text group children. + var currentChild; + while ((currentChild = this.textGroup_.firstChild)) { + this.textGroup_.removeChild(currentChild); + } + + // Add in text elements into the group. + var lines = this.getDisplayText_().split('\n'); + var y = 0; + for (var i = 0; i < lines.length; i++) { + var lineHeight = this.getConstants().FIELD_TEXT_HEIGHT + + this.getConstants().FIELD_BORDER_RECT_Y_PADDING; + var span = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TEXT, { + 'class': 'blocklyText blocklyMultilineText', + x: this.getConstants().FIELD_BORDER_RECT_X_PADDING, + y: y + this.getConstants().FIELD_BORDER_RECT_Y_PADDING, + dy: this.getConstants().FIELD_TEXT_BASELINE + }, this.textGroup_); + span.appendChild(document.createTextNode(lines[i])); + y += lineHeight; + } + + this.updateSize_(); + + if (this.isBeingEdited_) { + if (this.sourceBlock_.RTL) { + // in RTL, we need to let the browser reflow before resizing + // in order to get the correct bounding box of the borderRect + // avoiding issue #2777. + setTimeout(this.resizeEditor_.bind(this), 0); + } else { + this.resizeEditor_(); + } + var htmlInput = /** @type {!HTMLElement} */(this.htmlInput_); + if (!this.isTextValid_) { + Blockly.utils.dom.addClass(htmlInput, 'blocklyInvalidInput'); + Blockly.utils.aria.setState(htmlInput, + Blockly.utils.aria.State.INVALID, true); + } else { + Blockly.utils.dom.removeClass(htmlInput, 'blocklyInvalidInput'); + Blockly.utils.aria.setState(htmlInput, + Blockly.utils.aria.State.INVALID, false); + } + } +}; + +/** + * Updates the size of the field based on the text. + * @protected + */ +Blockly.FieldMultilineInput.prototype.updateSize_ = function() { + var nodes = this.textGroup_.childNodes; + var totalWidth = 0; + var totalHeight = 0; + for (var i = 0; i < nodes.length; i++) { + var tspan = /** @type {!Element} */ (nodes[i]); + var textWidth = Blockly.utils.dom.getTextWidth(tspan); + if (textWidth > totalWidth) { + totalWidth = textWidth; + } + totalHeight += this.getConstants().FIELD_TEXT_HEIGHT + + (i > 0 ? this.getConstants().FIELD_BORDER_RECT_Y_PADDING : 0); + } + if (this.borderRect_) { + totalHeight += this.getConstants().FIELD_BORDER_RECT_Y_PADDING * 2; + totalWidth += this.getConstants().FIELD_BORDER_RECT_X_PADDING * 2; + this.borderRect_.setAttribute('width', totalWidth); + this.borderRect_.setAttribute('height', totalHeight); + } + this.size_.width = totalWidth; + this.size_.height = totalHeight; + + this.positionBorderRect_(); +}; + +/** + * Create the text input editor widget. + * @return {!HTMLTextAreaElement} The newly created text input editor. + * @protected + */ +Blockly.FieldMultilineInput.prototype.widgetCreate_ = function() { + var div = Blockly.WidgetDiv.DIV; + var scale = this.workspace_.getScale(); + + var htmlInput = + /** @type {HTMLTextAreaElement} */ (document.createElement('textarea')); + htmlInput.className = 'blocklyHtmlInput blocklyHtmlTextAreaInput'; + htmlInput.setAttribute('spellcheck', this.spellcheck_); + var fontSize = (this.getConstants().FIELD_TEXT_FONTSIZE * scale) + 'pt'; + div.style.fontSize = fontSize; + htmlInput.style.fontSize = fontSize; + var borderRadius = (Blockly.FieldTextInput.BORDERRADIUS * scale) + 'px'; + htmlInput.style.borderRadius = borderRadius; + var paddingX = this.getConstants().FIELD_BORDER_RECT_X_PADDING * scale; + var paddingY = this.getConstants().FIELD_BORDER_RECT_Y_PADDING * scale / 2; + htmlInput.style.padding = paddingY + 'px ' + paddingX + 'px ' + paddingY + + 'px ' + paddingX + 'px'; + var lineHeight = this.getConstants().FIELD_TEXT_HEIGHT + + this.getConstants().FIELD_BORDER_RECT_Y_PADDING; + htmlInput.style.lineHeight = (lineHeight * scale) + 'px'; + + div.appendChild(htmlInput); + + htmlInput.value = htmlInput.defaultValue = this.getEditorText_(this.value_); + htmlInput.untypedDefaultValue_ = this.value_; + htmlInput.oldValue_ = null; + if (Blockly.utils.userAgent.GECKO) { + // In FF, ensure the browser reflows before resizing to avoid issue #2777. + setTimeout(this.resizeEditor_.bind(this), 0); + } else { + this.resizeEditor_(); + } + + this.bindInputEvents_(htmlInput); + + return htmlInput; +}; + +/** + * 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 + */ +Blockly.FieldMultilineInput.prototype.onHtmlInputKeyDown_ = function(e) { + if (e.keyCode !== Blockly.utils.KeyCodes.ENTER) { + Blockly.FieldMultilineInput.superClass_.onHtmlInputKeyDown_.call(this, e); + } +}; + +/** + * CSS for multiline field. See css.js for use. + */ +Blockly.Css.register([ + /* eslint-disable indent */ + '.blocklyHtmlTextAreaInput {', + 'font-family: monospace;', + 'resize: none;', + 'overflow: hidden;', + 'height: 100%;', + 'text-align: left;', + '}' + /* eslint-enable indent */ +]); + + +Blockly.fieldRegistry.register('field_multilinetext', Blockly.FieldMultilineInput); diff --git a/static/js/dist/core/field_number.js b/static/js/dist/core/field_number.js new file mode 100644 index 0000000..e052ff3 --- /dev/null +++ b/static/js/dist/core/field_number.js @@ -0,0 +1,317 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Number input field + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.FieldNumber'); + +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.object'); + + +/** + * 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 + */ +Blockly.FieldNumber = function(opt_value, opt_min, opt_max, opt_precision, + opt_validator, opt_config) { + + /** + * The minimum value this number field can contain. + * @type {number} + * @protected + */ + this.min_ = -Infinity; + + /** + * The maximum value this number field can contain. + * @type {number} + * @protected + */ + this.max_ = Infinity; + + /** + * The multiple to which this fields value is rounded. + * @type {number} + * @protected + */ + this.precision_ = 0; + + /** + * The number of decimal places to allow, or null to allow any number of + * decimal digits. + * @type {?number} + * @private + */ + this.decimalPlaces_ = null; + + Blockly.FieldNumber.superClass_.constructor.call( + this, opt_value, opt_validator, opt_config); + + if (!opt_config) { // Only do one kind of configuration or the other. + this.setConstraints(opt_min, opt_max, opt_precision); + } +}; +Blockly.utils.object.inherits(Blockly.FieldNumber, Blockly.FieldTextInput); + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldNumber.prototype.DEFAULT_VALUE = 0; + +/** + * 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 + */ +Blockly.FieldNumber.fromJson = function(options) { + return new Blockly.FieldNumber(options['value'], + undefined, undefined, undefined, undefined, options); +}; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldNumber.prototype.SERIALIZABLE = true; + +/** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @private + */ +Blockly.FieldNumber.prototype.configure_ = function(config) { + Blockly.FieldNumber.superClass_.configure_.call(this, config); + this.setMinInternal_(config['min']); + this.setMaxInternal_(config['max']); + this.setPrecisionInternal_(config['precision']); +}; + +/** + * 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. + */ +Blockly.FieldNumber.prototype.setConstraints = function(min, max, precision) { + this.setMinInternal_(min); + this.setMaxInternal_(max); + this.setPrecisionInternal_(precision); + this.setValue(this.getValue()); +}; + +/** + * Sets the minimum value this field can contain. Updates the value to reflect. + * @param {?(number|string|undefined)} min Minimum value. + */ +Blockly.FieldNumber.prototype.setMin = function(min) { + this.setMinInternal_(min); + this.setValue(this.getValue()); +}; + +/** + * Sets the minimum value this field can contain. Called internally to avoid + * value updates. + * @param {?(number|string|undefined)} min Minimum value. + * @private + */ +Blockly.FieldNumber.prototype.setMinInternal_ = function(min) { + if (min == null) { + this.min_ = -Infinity; + } else { + min = Number(min); + if (!isNaN(min)) { + this.min_ = min; + } + } +}; + +/** + * Returns the current minimum value this field can contain. Default is + * -Infinity. + * @return {number} The current minimum value this field can contain. + */ +Blockly.FieldNumber.prototype.getMin = function() { + return this.min_; +}; + +/** + * Sets the maximum value this field can contain. Updates the value to reflect. + * @param {?(number|string|undefined)} max Maximum value. + */ +Blockly.FieldNumber.prototype.setMax = function(max) { + this.setMaxInternal_(max); + this.setValue(this.getValue()); +}; + +/** + * Sets the maximum value this field can contain. Called internally to avoid + * value updates. + * @param {?(number|string|undefined)} max Maximum value. + * @private + */ +Blockly.FieldNumber.prototype.setMaxInternal_ = function(max) { + if (max == null) { + this.max_ = Infinity; + } else { + max = Number(max); + if (!isNaN(max)) { + this.max_ = max; + } + } +}; + +/** + * Returns the current maximum value this field can contain. Default is + * Infinity. + * @return {number} The current maximum value this field can contain. + */ +Blockly.FieldNumber.prototype.getMax = function() { + return this.max_; +}; + +/** + * 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. + */ +Blockly.FieldNumber.prototype.setPrecision = function(precision) { + this.setPrecisionInternal_(precision); + this.setValue(this.getValue()); +}; + +/** + * Sets the precision of this field's value. Called internally to avoid + * value updates. + * @param {?(number|string|undefined)} precision The number to which the + * field's value is rounded. + * @private + */ +Blockly.FieldNumber.prototype.setPrecisionInternal_ = function(precision) { + if (precision == null) { + // Number(precision) would also be 0, but set explicitly to be clear. + this.precision_ = 0; + } else { + precision = Number(precision); + if (!isNaN(precision)) { + this.precision_ = precision; + } + } + + var precisionString = this.precision_.toLocaleString("en-US", {maximumFractionDigits: 20}); + var decimalIndex = precisionString.indexOf('.'); + if (decimalIndex == -1) { + // If the precision is 0 (float) allow any number of decimals, + // otherwise allow none. + this.decimalPlaces_ = precision ? 0 : null; + } else { + this.decimalPlaces_ = precisionString.length - decimalIndex - 1; + } +}; + +/** + * 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. + */ +Blockly.FieldNumber.prototype.getPrecision = function() { + return this.precision_; +}; + +/** + * Ensure that the input value is a valid number (must fulfill the + * constraints placed on the field). + * @param {*=} opt_newValue The input value. + * @return {?number} A valid number, or null if invalid. + * @protected + * @override + */ +Blockly.FieldNumber.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === null) { + return null; + } + // Clean up text. + var newValue = String(opt_newValue); + // TODO: Handle cases like 'ten', '1.203,14', etc. + // 'O' is sometimes mistaken for '0' by inexperienced users. + newValue = newValue.replace(/O/ig, '0'); + // Strip out thousands separators. + newValue = newValue.replace(/,/g, ''); + // Ignore case of 'Infinity'. + newValue = newValue.replace(/infinity/i, 'Infinity'); + + // Clean up number. + var n = Number(newValue || 0); + if (isNaN(n)) { + // Invalid number. + return null; + } + // Get the value in range. + n = Math.min(Math.max(n, this.min_), this.max_); + // Round to nearest multiple of precision. + if (this.precision_ && isFinite(n)) { + n = Math.round(n / this.precision_) * this.precision_; + } + // Clean up floating point errors. + if (this.decimalPlaces_ != null) { + n = Number(n.toFixed(this.decimalPlaces_)); + } + return n; +}; + +/** + * Create the number input editor widget. + * @return {!HTMLElement} The newly created number input editor. + * @protected + * @override + */ +Blockly.FieldNumber.prototype.widgetCreate_ = function() { + var htmlInput = Blockly.FieldNumber.superClass_.widgetCreate_.call(this); + + // Set the accessibility state + if (this.min_ > -Infinity) { + Blockly.utils.aria.setState(htmlInput, + Blockly.utils.aria.State.VALUEMIN, this.min_); + } + if (this.max_ < Infinity) { + Blockly.utils.aria.setState(htmlInput, + Blockly.utils.aria.State.VALUEMAX, this.max_); + } + return htmlInput; +}; + +Blockly.fieldRegistry.register('field_number', Blockly.FieldNumber); diff --git a/static/js/dist/core/field_registry.js b/static/js/dist/core/field_registry.js new file mode 100644 index 0000000..1a03273 --- /dev/null +++ b/static/js/dist/core/field_registry.js @@ -0,0 +1,66 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Fields can be created based on a JSON definition. This file + * contains methods for registering those JSON definitions, and building the + * fields based on JSON. + * @author bekawestberg@gmail.com (Beka Westberg) + */ +'use strict'; + +goog.provide('Blockly.fieldRegistry'); + +goog.require('Blockly.registry'); + +goog.requireType('Blockly.IRegistrableField'); + + +/** + * 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 {!Blockly.IRegistrableField} 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. + */ +Blockly.fieldRegistry.register = function(type, fieldClass) { + Blockly.registry.register(Blockly.registry.Type.FIELD, type, fieldClass); +}; + +/** + * Unregisters the field registered with the given type. + * @param {string} type The field type name as used in the JSON definition. + */ +Blockly.fieldRegistry.unregister = function(type) { + Blockly.registry.unregister(Blockly.registry.Type.FIELD, type); +}; + +/** + * 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 + */ +Blockly.fieldRegistry.fromJson = function(options) { + var fieldObject = /** @type {?Blockly.IRegistrableField} */ ( + Blockly.registry.getObject(Blockly.registry.Type.FIELD, options['type'])); + if (!fieldObject) { + console.warn('Blockly could not create a field of type ' + options['type'] + + '. The field is probably not being registered. This could be because' + + ' the file is not loaded, the field does not register itself (Issue' + + ' #1584), or the registration is not being reached.'); + return null; + } + return fieldObject.fromJson(options); +}; diff --git a/static/js/dist/core/field_textinput.js b/static/js/dist/core/field_textinput.js new file mode 100644 index 0000000..9c74997 --- /dev/null +++ b/static/js/dist/core/field_textinput.js @@ -0,0 +1,579 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Text input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldTextInput'); + +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Field'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.Msg'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.KeyCodes'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.utils.userAgent'); + + +/** + * 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 + */ +Blockly.FieldTextInput = function(opt_value, opt_validator, opt_config) { + /** + * Allow browser to spellcheck this field. + * @type {boolean} + * @protected + */ + this.spellcheck_ = true; + + Blockly.FieldTextInput.superClass_.constructor.call(this, + opt_value, opt_validator, opt_config); + + /** + * The HTML input element. + * @type {HTMLElement} + */ + this.htmlInput_ = null; + + /** + * Key down event data. + * @type {?Blockly.EventData} + * @private + */ + this.onKeyDownWrapper_ = null; + + /** + * Key input event data. + * @type {?Blockly.EventData} + * @private + */ + this.onKeyInputWrapper_ = null; + + /** + * Whether the field should consider the whole parent block to be its click + * target. + * @type {?boolean} + */ + this.fullBlockClickTarget_ = false; + + /** + * The workspace that this field belongs to. + * @type {?Blockly.WorkspaceSvg} + * @protected + */ + this.workspace_ = null; +}; +Blockly.utils.object.inherits(Blockly.FieldTextInput, Blockly.Field); + +/** + * The default value for this field. + * @type {*} + * @protected + */ +Blockly.FieldTextInput.prototype.DEFAULT_VALUE = ''; + +/** + * 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 + */ +Blockly.FieldTextInput.fromJson = function(options) { + var text = Blockly.utils.replaceMessageReferences(options['text']); + return new Blockly.FieldTextInput(text, undefined, options); +}; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldTextInput.prototype.SERIALIZABLE = true; + +/** + * Pixel size of input border radius. + * Should match blocklyText's border-radius in CSS. + */ +Blockly.FieldTextInput.BORDERRADIUS = 4; + +/** + * Mouse cursor style when over the hotspot that initiates the editor. + */ +Blockly.FieldTextInput.prototype.CURSOR = 'text'; + +/** + * @override + */ +Blockly.FieldTextInput.prototype.configure_ = function(config) { + Blockly.FieldTextInput.superClass_.configure_.call(this, config); + if (typeof config['spellcheck'] == 'boolean') { + this.spellcheck_ = config['spellcheck']; + } +}; + +/** + * @override + */ +Blockly.FieldTextInput.prototype.initView = function() { + if (this.getConstants().FULL_BLOCK_FIELDS) { + // Step one: figure out if this is the only field on this block. + // Rendering is quite different in that case. + var nFields = 0; + var nConnections = 0; + + // Count the number of fields, excluding text fields + for (var i = 0, input; (input = this.sourceBlock_.inputList[i]); i++) { + for (var j = 0; (input.fieldRow[j]); j++) { + nFields ++; + } + if (input.connection) { + nConnections++; + } + } + // The special case is when this is the only non-label field on the block + // and it has an output but no inputs. + this.fullBlockClickTarget_ = + nFields <= 1 && this.sourceBlock_.outputConnection && !nConnections; + } else { + this.fullBlockClickTarget_ = false; + } + + if (this.fullBlockClickTarget_) { + this.clickTarget_ = this.sourceBlock_.getSvgRoot(); + } else { + this.createBorderRect_(); + } + this.createTextElement_(); +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === null || opt_newValue === undefined) { + return null; + } + return String(opt_newValue); +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.doValueInvalid_ = function(_invalidValue) { + if (this.isBeingEdited_) { + this.isTextValid_ = false; + var oldValue = this.value_; + // Revert value when the text becomes invalid. + this.value_ = this.htmlInput_.untypedDefaultValue_; + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + this.sourceBlock_, 'field', this.name || null, oldValue, this.value_)); + } + } +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.doValueUpdate_ = function(newValue) { + this.isTextValid_ = true; + this.value_ = newValue; + if (!this.isBeingEdited_) { + // This should only occur if setValue is triggered programmatically. + this.isDirty_ = true; + } +}; + +/** + * Updates text field to match the colour/style of the block. + * @package + */ +Blockly.FieldTextInput.prototype.applyColour = function() { + if (this.sourceBlock_ && this.getConstants().FULL_BLOCK_FIELDS) { + if (this.borderRect_) { + this.borderRect_.setAttribute('stroke', + this.sourceBlock_.style.colourTertiary); + } else { + this.sourceBlock_.pathObject.svgPath.setAttribute('fill', + this.getConstants().FIELD_BORDER_RECT_COLOUR); + } + } +}; + +/** + * Updates the colour of the htmlInput given the current validity of the + * field's value. + * @protected + */ +Blockly.FieldTextInput.prototype.render_ = function() { + Blockly.FieldTextInput.superClass_.render_.call(this); + // This logic is done in render_ rather than doValueInvalid_ or + // doValueUpdate_ so that the code is more centralized. + if (this.isBeingEdited_) { + this.resizeEditor_(); + var htmlInput = /** @type {!HTMLElement} */(this.htmlInput_); + if (!this.isTextValid_) { + Blockly.utils.dom.addClass(htmlInput, 'blocklyInvalidInput'); + Blockly.utils.aria.setState(htmlInput, + Blockly.utils.aria.State.INVALID, true); + } else { + Blockly.utils.dom.removeClass(htmlInput, 'blocklyInvalidInput'); + Blockly.utils.aria.setState(htmlInput, + Blockly.utils.aria.State.INVALID, false); + } + } +}; + +/** + * Set whether this field is spellchecked by the browser. + * @param {boolean} check True if checked. + */ +Blockly.FieldTextInput.prototype.setSpellcheck = function(check) { + if (check == this.spellcheck_) { + return; + } + this.spellcheck_ = check; + if (this.htmlInput_) { + this.htmlInput_.setAttribute('spellcheck', this.spellcheck_); + } +}; + +/** + * 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 programmatically. + * @param {boolean=} opt_quietInput True if editor should be created without + * focus. Defaults to false. + * @protected + */ +Blockly.FieldTextInput.prototype.showEditor_ = function(_opt_e, + opt_quietInput) { + this.workspace_ = + (/** @type {!Blockly.BlockSvg} */ (this.sourceBlock_)).workspace; + var quietInput = opt_quietInput || false; + if (!quietInput && (Blockly.utils.userAgent.MOBILE || + Blockly.utils.userAgent.ANDROID || + Blockly.utils.userAgent.IPAD)) { + this.showPromptEditor_(); + } else { + this.showInlineEditor_(quietInput); + } +}; + +/** + * Create and show a text input editor that is a prompt (usually a popup). + * Mobile browsers have issues with in-line textareas (focus and keyboards). + * @private + */ +Blockly.FieldTextInput.prototype.showPromptEditor_ = function() { + Blockly.prompt(Blockly.Msg['CHANGE_VALUE_TITLE'], this.getText(), + function(text) { + this.setValue(this.getValueFromEditorText_(text)); + }.bind(this)); +}; + +/** + * Create and show a text input editor that sits directly over the text input. + * @param {boolean} quietInput True if editor should be created without + * focus. + * @private + */ +Blockly.FieldTextInput.prototype.showInlineEditor_ = function(quietInput) { + Blockly.WidgetDiv.show( + this, this.sourceBlock_.RTL, this.widgetDispose_.bind(this)); + this.htmlInput_ = this.widgetCreate_(); + this.isBeingEdited_ = true; + + if (!quietInput) { + this.htmlInput_.focus({preventScroll:true}); + this.htmlInput_.select(); + } +}; + +/** + * Create the text input editor widget. + * @return {!HTMLElement} The newly created text input editor. + * @protected + */ +Blockly.FieldTextInput.prototype.widgetCreate_ = function() { + var div = Blockly.WidgetDiv.DIV; + + Blockly.utils.dom.addClass(this.getClickTarget_(), 'editing'); + + var htmlInput = /** @type {HTMLInputElement} */ (document.createElement('input')); + htmlInput.className = 'blocklyHtmlInput'; + htmlInput.setAttribute('spellcheck', this.spellcheck_); + var scale = this.workspace_.getScale(); + var fontSize = + (this.getConstants().FIELD_TEXT_FONTSIZE * scale) + 'pt'; + div.style.fontSize = fontSize; + htmlInput.style.fontSize = fontSize; + var borderRadius = + (Blockly.FieldTextInput.BORDERRADIUS * scale) + 'px'; + + if (this.fullBlockClickTarget_) { + var bBox = this.getScaledBBox(); + + // Override border radius. + borderRadius = (bBox.bottom - bBox.top) / 2 + 'px'; + // Pull stroke colour from the existing shadow block + var strokeColour = this.sourceBlock_.getParent() ? + this.sourceBlock_.getParent().style.colourTertiary : + this.sourceBlock_.style.colourTertiary; + htmlInput.style.border = (1 * scale) + 'px solid ' + strokeColour; + div.style.borderRadius = borderRadius; + div.style.transition = 'box-shadow 0.25s ease 0s'; + if (this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW) { + div.style.boxShadow = 'rgba(255, 255, 255, 0.3) 0px 0px 0px ' + + 4 * scale + 'px'; + } + } + htmlInput.style.borderRadius = borderRadius; + + div.appendChild(htmlInput); + + htmlInput.value = htmlInput.defaultValue = this.getEditorText_(this.value_); + htmlInput.untypedDefaultValue_ = this.value_; + htmlInput.oldValue_ = null; + + this.resizeEditor_(); + + this.bindInputEvents_(htmlInput); + + return htmlInput; +}; + +/** + * Closes the editor, saves the results, and disposes of any events or + * dom-references belonging to the editor. + * @protected + */ +Blockly.FieldTextInput.prototype.widgetDispose_ = function() { + // Non-disposal related things that we do when the editor closes. + this.isBeingEdited_ = false; + this.isTextValid_ = true; + // Make sure the field's node matches the field's internal value. + this.forceRerender(); + // TODO(#2496): Make this less of a hack. + if (this.onFinishEditing_) { + this.onFinishEditing_(this.value_); + } + + // Actual disposal. + this.unbindInputEvents_(); + var style = Blockly.WidgetDiv.DIV.style; + style.width = 'auto'; + style.height = 'auto'; + style.fontSize = ''; + style.transition = ''; + style.boxShadow = ''; + this.htmlInput_ = null; + + Blockly.utils.dom.removeClass(this.getClickTarget_(), 'editing'); +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.bindInputEvents_ = function(htmlInput) { + // Trap Enter without IME and Esc to hide. + this.onKeyDownWrapper_ = + Blockly.bindEventWithChecks_( + htmlInput, 'keydown', this, this.onHtmlInputKeyDown_); + // Resize after every input change. + this.onKeyInputWrapper_ = + Blockly.bindEventWithChecks_( + htmlInput, 'input', this, this.onHtmlInputChange_); +}; + +/** + * Unbind handlers for user input and workspace size changes. + * @protected + */ +Blockly.FieldTextInput.prototype.unbindInputEvents_ = function() { + if (this.onKeyDownWrapper_) { + Blockly.unbindEvent_(this.onKeyDownWrapper_); + this.onKeyDownWrapper_ = null; + } + if (this.onKeyInputWrapper_) { + Blockly.unbindEvent_(this.onKeyInputWrapper_); + this.onKeyInputWrapper_ = null; + } +}; + +/** + * Handle key down to the editor. + * @param {!Event} e Keyboard event. + * @protected + */ +Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_ = function(e) { + if (e.keyCode == Blockly.utils.KeyCodes.ENTER) { + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); + } else if (e.keyCode == Blockly.utils.KeyCodes.ESC) { + this.htmlInput_.value = this.htmlInput_.defaultValue; + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); + } else if (e.keyCode == Blockly.utils.KeyCodes.TAB) { + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); + this.sourceBlock_.tab(this, !e.shiftKey); + e.preventDefault(); + } +}; + +/** + * Handle a change to the editor. + * @param {!Event} _e Keyboard event. + * @private + */ +Blockly.FieldTextInput.prototype.onHtmlInputChange_ = function(_e) { + var text = this.htmlInput_.value; + if (text !== this.htmlInput_.oldValue_) { + this.htmlInput_.oldValue_ = text; + + // TODO(#2169): Once issue is fixed the setGroup functionality could be + // moved up to the Field setValue method. This would create a + // broader fix for all field types. + Blockly.Events.setGroup(true); + var value = this.getValueFromEditorText_(text); + this.setValue(value); + this.forceRerender(); + this.resizeEditor_(); + Blockly.Events.setGroup(false); + } +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.setEditorValue_ = function(newValue) { + this.isDirty_ = true; + if (this.isBeingEdited_) { + // In the case this method is passed an invalid value, we still + // pass it through the transformation method `getEditorText` to deal + // with. Otherwise, the internal field's state will be inconsistent + // with what's shown to the user. + this.htmlInput_.value = this.getEditorText_(newValue); + } + this.setValue(newValue); +}; + +/** + * Resize the editor to fit the text. + * @protected + */ +Blockly.FieldTextInput.prototype.resizeEditor_ = function() { + var div = Blockly.WidgetDiv.DIV; + var bBox = this.getScaledBBox(); + div.style.width = bBox.right - bBox.left + 'px'; + div.style.height = bBox.bottom - bBox.top + 'px'; + + // In RTL mode block fields and LTR input fields the left edge moves, + // whereas the right edge is fixed. Reposition the editor. + var x = this.sourceBlock_.RTL ? bBox.right - div.offsetWidth : bBox.left; + var xy = new Blockly.utils.Coordinate(x, bBox.top); + + div.style.left = xy.x + 'px'; + div.style.top = xy.y + 'px'; +}; + +/** + * Returns whether or not the field is tab navigable. + * @return {boolean} True if the field is tab navigable. + * @override + */ +Blockly.FieldTextInput.prototype.isTabNavigable = function() { + return true; +}; + +/** + * Use the `getText_` developer hook to override the field's text representation. + * When we're currently editing, return the current html value instead. + * Otherwise, return null which tells the field to use the default behaviour + * (which is a string cast of the field's value). + * @return {?string} The html value if we're editing, otherwise null. + * @protected + * @override + */ +Blockly.FieldTextInput.prototype.getText_ = function() { + if (this.isBeingEdited_ && this.htmlInput_) { + // We are currently editing, return the html input value instead. + return this.htmlInput_.value; + } + return null; +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.getEditorText_ = function(value) { + return String(value); +}; + +/** + * 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 + */ +Blockly.FieldTextInput.prototype.getValueFromEditorText_ = function(text) { + return text; +}; + +Blockly.fieldRegistry.register('field_input', Blockly.FieldTextInput); diff --git a/static/js/dist/core/field_variable.js b/static/js/dist/core/field_variable.js new file mode 100644 index 0000000..352d59d --- /dev/null +++ b/static/js/dist/core/field_variable.js @@ -0,0 +1,464 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Variable input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldVariable'); + +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.Msg'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.VariableModel'); +goog.require('Blockly.Variables'); +goog.require('Blockly.Xml'); + + + +/** + * 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 + */ +Blockly.FieldVariable = function(varName, opt_validator, opt_variableTypes, + opt_defaultType, opt_config) { + // The FieldDropdown constructor expects the field's initial value to be + // the first entry in the menu generator, which it may or may not be. + // Just do the relevant parts of the constructor. + + /** + * An array of options for a dropdown list, + * or a function which generates these options. + * @type {(!Array.| + * !function(this:Blockly.FieldDropdown): !Array.)} + * @protected + */ + this.menuGenerator_ = Blockly.FieldVariable.dropdownCreate; + + /** + * 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} + */ + this.defaultVariableName = typeof varName === 'string' ? varName : ''; + + /** + * The size of the area rendered by the field. + * @type {Blockly.utils.Size} + * @protected + * @override + */ + this.size_ = new Blockly.utils.Size(0, 0); + + opt_config && this.configure_(opt_config); + opt_validator && this.setValidator(opt_validator); + + if (!opt_config) { // Only do one kind of configuration or the other. + this.setTypes_(opt_variableTypes, opt_defaultType); + } +}; +Blockly.utils.object.inherits(Blockly.FieldVariable, Blockly.FieldDropdown); + +/** + * 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 + */ +Blockly.FieldVariable.fromJson = function(options) { + var varName = Blockly.utils.replaceMessageReferences(options['variable']); + return new Blockly.FieldVariable( + varName, undefined, undefined, undefined, options); +}; + +/** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ +Blockly.FieldVariable.prototype.SERIALIZABLE = true; + +/** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @protected + */ +Blockly.FieldVariable.prototype.configure_ = function(config) { + Blockly.FieldVariable.superClass_.configure_.call(this, config); + this.setTypes_(config['variableTypes'], config['defaultType']); +}; + +/** + * 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 + */ +Blockly.FieldVariable.prototype.initModel = function() { + if (this.variable_) { + return; // Initialization already happened. + } + var variable = Blockly.Variables.getOrCreateVariablePackage( + this.sourceBlock_.workspace, null, + this.defaultVariableName, this.defaultType_); + + // Don't call setValue because we don't want to cause a rerender. + this.doValueUpdate_(variable.getId()); +}; + +/** + * @override + */ +Blockly.FieldVariable.prototype.shouldAddBorderRect_ = function() { + return Blockly.FieldVariable.superClass_.shouldAddBorderRect_.call(this) && + (!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW || + this.sourceBlock_.type != 'variables_get'); +}; + +/** + * Initialize this field based on the given XML. + * @param {!Element} fieldElement The element containing information about the + * variable field's state. + */ +Blockly.FieldVariable.prototype.fromXml = function(fieldElement) { + var id = fieldElement.getAttribute('id'); + var variableName = fieldElement.textContent; + // 'variabletype' should be lowercase, but until July 2019 it was sometimes + // recorded as 'variableType'. Thus we need to check for both. + var variableType = fieldElement.getAttribute('variabletype') || + fieldElement.getAttribute('variableType') || ''; + + var variable = Blockly.Variables.getOrCreateVariablePackage( + this.sourceBlock_.workspace, id, variableName, variableType); + + // This should never happen :) + if (variableType != null && variableType !== variable.type) { + throw Error('Serialized variable type with id \'' + + variable.getId() + '\' had type ' + variable.type + ', and ' + + 'does not match variable field that references it: ' + + Blockly.Xml.domToText(fieldElement) + '.'); + } + + this.setValue(variable.getId()); +}; + +/** + * 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. + */ +Blockly.FieldVariable.prototype.toXml = function(fieldElement) { + // Make sure the variable is initialized. + this.initModel(); + + fieldElement.id = this.variable_.getId(); + fieldElement.textContent = this.variable_.name; + if (this.variable_.type) { + fieldElement.setAttribute('variabletype', this.variable_.type); + } + return fieldElement; +}; + +/** + * Attach this field to a block. + * @param {!Blockly.Block} block The block containing this field. + */ +Blockly.FieldVariable.prototype.setSourceBlock = function(block) { + if (block.isShadow()) { + throw Error('Variable fields are not allowed to exist on shadow blocks.'); + } + Blockly.FieldVariable.superClass_.setSourceBlock.call(this, block); +}; + +/** + * Get the variable's ID. + * @return {string} Current variable's ID. + */ +Blockly.FieldVariable.prototype.getValue = function() { + return this.variable_ ? this.variable_.getId() : null; +}; + +/** + * 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. + */ +Blockly.FieldVariable.prototype.getText = function() { + return this.variable_ ? this.variable_.name : ''; +}; + +/** + * 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 + */ +Blockly.FieldVariable.prototype.getVariable = function() { + return this.variable_; +}; + +/** + * 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. + */ +Blockly.FieldVariable.prototype.getValidator = function() { + // Validators shouldn't operate on the initial setValue call. + // Normally this is achieved by calling setValidator after setValue, but + // this is not a possibility with variable fields. + if (this.variable_) { + return this.validator_; + } + return null; +}; + +/** + * 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 + */ +Blockly.FieldVariable.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === null) { + return null; + } + var newId = /** @type {string} */ (opt_newValue); + var variable = Blockly.Variables.getVariable( + this.sourceBlock_.workspace, newId); + if (!variable) { + console.warn('Variable id doesn\'t point to a real variable! ' + + 'ID was ' + newId); + return null; + } + // Type Checks. + var type = variable.type; + if (!this.typeIsAllowed_(type)) { + console.warn('Variable type doesn\'t match this field! Type was ' + type); + return null; + } + return newId; +}; + +/** + * 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 + */ +Blockly.FieldVariable.prototype.doValueUpdate_ = function(newId) { + this.variable_ = Blockly.Variables.getVariable( + this.sourceBlock_.workspace, /** @type {string} */ (newId)); + Blockly.FieldVariable.superClass_.doValueUpdate_.call(this, newId); +}; + +/** + * Check whether the given variable type is allowed on this field. + * @param {string} type The type to check. + * @return {boolean} True if the type is in the list of allowed types. + * @private + */ +Blockly.FieldVariable.prototype.typeIsAllowed_ = function(type) { + var typeList = this.getVariableTypes_(); + if (!typeList) { + return true; // If it's null, all types are valid. + } + for (var i = 0; i < typeList.length; i++) { + if (type == typeList[i]) { + return true; + } + } + return false; +}; + +/** + * Return a list of variable types to include in the dropdown. + * @return {!Array.} Array of variable types. + * @throws {Error} if variableTypes is an empty array. + * @private + */ +Blockly.FieldVariable.prototype.getVariableTypes_ = function() { + // TODO (#1513): Try to avoid calling this every time the field is edited. + var variableTypes = this.variableTypes; + if (variableTypes === null) { + // If variableTypes is null, return all variable types. + if (this.sourceBlock_ && this.sourceBlock_.workspace) { + return this.sourceBlock_.workspace.getVariableTypes(); + } + } + variableTypes = variableTypes || ['']; + if (variableTypes.length == 0) { + // Throw an error if variableTypes is an empty list. + var name = this.getText(); + throw Error('\'variableTypes\' of field variable ' + + name + ' was an empty list'); + } + return variableTypes; +}; + +/** + * Parse the optional arguments representing the allowed variable types and the + * default variable type. + * @param {Array.=} opt_variableTypes A list of the types of variables + * to include in the dropdown. If null or undefined, variables of all types + * will be displayed in the dropdown. + * @param {string=} opt_defaultType The type of the variable to create if this + * field's value is not explicitly set. Defaults to ''. + * @private + */ +Blockly.FieldVariable.prototype.setTypes_ = function(opt_variableTypes, + opt_defaultType) { + // If you expected that the default type would be the same as the only entry + // in the variable types array, tell the Blockly team by commenting on #1499. + var defaultType = opt_defaultType || ''; + // Set the allowable variable types. Null means all types on the workspace. + if (opt_variableTypes == null || opt_variableTypes == undefined) { + var variableTypes = null; + } else if (Array.isArray(opt_variableTypes)) { + var variableTypes = opt_variableTypes; + // Make sure the default type is valid. + var isInArray = false; + for (var i = 0; i < variableTypes.length; i++) { + if (variableTypes[i] == defaultType) { + isInArray = true; + } + } + if (!isInArray) { + throw Error('Invalid default type \'' + defaultType + '\' in ' + + 'the definition of a FieldVariable'); + } + } else { + throw Error('\'variableTypes\' was not an array in the definition of ' + + 'a FieldVariable'); + } + // Only update the field once all checks pass. + this.defaultType_ = defaultType; + this.variableTypes = variableTypes; +}; + +/** + * 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 + */ +Blockly.FieldVariable.prototype.refreshVariableName = function() { + this.forceRerender(); +}; + +/** + * 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} + */ +Blockly.FieldVariable.dropdownCreate = function() { + if (!this.variable_) { + throw Error('Tried to call dropdownCreate on a variable field with no' + + ' variable selected.'); + } + var name = this.getText(); + var variableModelList = []; + if (this.sourceBlock_ && this.sourceBlock_.workspace) { + var variableTypes = this.getVariableTypes_(); + // Get a copy of the list, so that adding rename and new variable options + // doesn't modify the workspace's list. + for (var i = 0; i < variableTypes.length; i++) { + var variableType = variableTypes[i]; + var variables = + this.sourceBlock_.workspace.getVariablesOfType(variableType); + variableModelList = variableModelList.concat(variables); + } + } + variableModelList.sort(Blockly.VariableModel.compareByName); + + var options = []; + for (var i = 0; i < variableModelList.length; i++) { + // Set the UUID as the internal representation of the variable. + options[i] = [variableModelList[i].name, variableModelList[i].getId()]; + } + options.push([Blockly.Msg['RENAME_VARIABLE'], Blockly.RENAME_VARIABLE_ID]); + if (Blockly.Msg['DELETE_VARIABLE']) { + options.push( + [ + Blockly.Msg['DELETE_VARIABLE'].replace('%1', name), + Blockly.DELETE_VARIABLE_ID + ] + ); + } + + return options; +}; + +/** + * 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 + */ +Blockly.FieldVariable.prototype.onItemSelected_ = function(menu, menuItem) { + var id = menuItem.getValue(); + // Handle special cases. + if (this.sourceBlock_ && this.sourceBlock_.workspace) { + if (id == Blockly.RENAME_VARIABLE_ID) { + // Rename variable. + Blockly.Variables.renameVariable( + this.sourceBlock_.workspace, this.variable_); + return; + } else if (id == Blockly.DELETE_VARIABLE_ID) { + // Delete variable. + this.sourceBlock_.workspace.deleteVariableById(this.variable_.getId()); + return; + } + } + // Handle unspecial case. + this.setValue(id); +}; + +/** + * Overrides referencesVariables(), indicating this field refers to a variable. + * @return {boolean} True. + * @package + * @override + */ +Blockly.FieldVariable.prototype.referencesVariables = function() { + return true; +}; + +Blockly.fieldRegistry.register('field_variable', Blockly.FieldVariable); diff --git a/static/js/dist/core/flyout_base.js b/static/js/dist/core/flyout_base.js new file mode 100644 index 0000000..14000f8 --- /dev/null +++ b/static/js/dist/core/flyout_base.js @@ -0,0 +1,1084 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Flyout tray containing blocks which may be created. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Flyout'); + +goog.require('Blockly.Block'); +goog.require('Blockly.blockRendering'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockCreate'); +goog.require('Blockly.Events.VarCreate'); +goog.require('Blockly.FlyoutCursor'); +goog.require('Blockly.Gesture'); +goog.require('Blockly.Marker'); +goog.require('Blockly.Scrollbar'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.Touch'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.toolbox'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.Xml'); + +goog.requireType('Blockly.IBlocklyActionable'); +goog.requireType('Blockly.IDeleteArea'); +goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.ShortcutRegistry'); +goog.requireType('Blockly.utils.Metrics'); + + +/** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @constructor + * @abstract + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IDeleteArea} + * @implements {Blockly.IFlyout} + */ +Blockly.Flyout = function(workspaceOptions) { + workspaceOptions.getMetrics = + /** @type {function():!Blockly.utils.Metrics} */ ( + this.getMetrics_.bind(this)); + workspaceOptions.setMetrics = this.setMetrics_.bind(this); + + /** + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); + this.workspace_.isFlyout = true; + // Keep the workspace visibility consistent with the flyout's visibility. + this.workspace_.setVisible(this.isVisible_); + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + this.RTL = !!workspaceOptions.RTL; + + /** + * Whether the flyout should be laid out horizontally or not. + * @type {boolean} + * @package + */ + this.horizontalLayout = false; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + * @protected + */ + this.toolboxPosition_ = workspaceOptions.toolboxPosition; + + /** + * Opaque data that can be passed to Blockly.unbindEvent_. + * @type {!Array.} + * @private + */ + this.eventWrappers_ = []; + + /** + * List of background mats that lurk behind each block to catch clicks + * landing in the blocks' lakes and bays. + * @type {!Array.} + * @private + */ + this.mats_ = []; + + /** + * List of visible buttons. + * @type {!Array.} + * @protected + */ + this.buttons_ = []; + + /** + * List of event listeners. + * @type {!Array.} + * @private + */ + this.listeners_ = []; + + /** + * List of blocks that should always be disabled. + * @type {!Array.} + * @private + */ + this.permanentlyDisabled_ = []; + + /** + * Width of output tab. + * @type {number} + * @protected + * @const + */ + this.tabWidth_ = this.workspace_.getRenderer().getConstants().TAB_WIDTH; + + /** + * The target workspace + * @type {?Blockly.WorkspaceSvg} + * @package + */ + this.targetWorkspace = null; +}; + +/** + * Does the flyout automatically close when a block is created? + * @type {boolean} + */ +Blockly.Flyout.prototype.autoClose = true; + +/** + * Whether the flyout is visible. + * @type {boolean} + * @private + */ +Blockly.Flyout.prototype.isVisible_ = false; + +/** + * Whether the workspace containing this flyout is visible. + * @type {boolean} + * @private + */ +Blockly.Flyout.prototype.containerVisible_ = true; + +/** + * Corner radius of the flyout background. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.CORNER_RADIUS = 8; + +/** + * Margin around the edges of the blocks in the flyout. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.MARGIN = Blockly.Flyout.prototype.CORNER_RADIUS; + +// TODO: Move GAP_X and GAP_Y to their appropriate files. + +/** + * Gap between items in horizontal flyouts. Can be overridden with the "sep" + * element. + * @const {number} + */ +Blockly.Flyout.prototype.GAP_X = Blockly.Flyout.prototype.MARGIN * 3; + +/** + * Gap between items in vertical flyouts. Can be overridden with the "sep" + * element. + * @const {number} + */ +Blockly.Flyout.prototype.GAP_Y = Blockly.Flyout.prototype.MARGIN * 3; + +/** + * Top/bottom padding between scrollbar and edge of flyout background. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.SCROLLBAR_PADDING = 2; + +/** + * Width of flyout. + * @type {number} + * @protected + */ +Blockly.Flyout.prototype.width_ = 0; + +/** + * Height of flyout. + * @type {number} + * @protected + */ +Blockly.Flyout.prototype.height_ = 0; + +/** + * 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 +*/ +Blockly.Flyout.prototype.dragAngleRange_ = 70; + +/** + * 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName The type of tag to + * put the flyout in. This should be or . + * @return {!SVGElement} The flyout's SVG group. + */ +Blockly.Flyout.prototype.createDom = function(tagName) { + /* + + + + + */ + // Setting style to display:none to start. The toolbox and flyout + // hide/show code will set up proper visibility and size later. + this.svgGroup_ = Blockly.utils.dom.createSvgElement(tagName, + {'class': 'blocklyFlyout', 'style': 'display: none'}, null); + this.svgBackground_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.PATH, + {'class': 'blocklyFlyoutBackground'}, this.svgGroup_); + this.svgGroup_.appendChild(this.workspace_.createDom()); + this.workspace_.getThemeManager().subscribe( + this.svgBackground_, 'flyoutBackgroundColour', 'fill'); + this.workspace_.getThemeManager().subscribe( + this.svgBackground_, 'flyoutOpacity', 'fill-opacity'); + this.workspace_.getMarkerManager().setCursor(new Blockly.FlyoutCursor()); + return this.svgGroup_; +}; + +/** + * Initializes the flyout. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The workspace in which to + * create new blocks. + */ +Blockly.Flyout.prototype.init = function(targetWorkspace) { + this.targetWorkspace = targetWorkspace; + this.workspace_.targetWorkspace = targetWorkspace; + + /** + * @type {!Blockly.Scrollbar} + * @package + */ + this.scrollbar = new Blockly.Scrollbar(this.workspace_, + this.horizontalLayout, false, 'blocklyFlyoutScrollbar'); + + this.hide(); + + Array.prototype.push.apply(this.eventWrappers_, + Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, this.wheel_)); + if (!this.autoClose) { + this.filterWrapper_ = this.filterForCapacity_.bind(this); + this.targetWorkspace.addChangeListener(this.filterWrapper_); + } + + // Dragging the flyout up and down. + Array.prototype.push.apply(this.eventWrappers_, + Blockly.bindEventWithChecks_( + this.svgBackground_, 'mousedown', this, this.onMouseDown_)); + + // A flyout connected to a workspace doesn't have its own current gesture. + this.workspace_.getGesture = + this.targetWorkspace.getGesture.bind(this.targetWorkspace); + + // Get variables from the main workspace rather than the target workspace. + this.workspace_.setVariableMap(this.targetWorkspace.getVariableMap()); + + this.workspace_.createPotentialVariableMap(); +}; + +/** + * Dispose of this flyout. + * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} + */ +Blockly.Flyout.prototype.dispose = function() { + this.hide(); + Blockly.unbindEvent_(this.eventWrappers_); + if (this.filterWrapper_) { + this.targetWorkspace.removeChangeListener(this.filterWrapper_); + this.filterWrapper_ = null; + } + if (this.scrollbar) { + this.scrollbar.dispose(); + this.scrollbar = null; + } + if (this.workspace_) { + this.workspace_.getThemeManager().unsubscribe(this.svgBackground_); + this.workspace_.targetWorkspace = null; + this.workspace_.dispose(); + this.workspace_ = null; + } + if (this.svgGroup_) { + Blockly.utils.dom.removeNode(this.svgGroup_); + this.svgGroup_ = null; + } + this.svgBackground_ = null; + this.targetWorkspace = null; +}; + +/** + * Get the width of the flyout. + * @return {number} The width of the flyout. + */ +Blockly.Flyout.prototype.getWidth = function() { + return this.width_; +}; + +/** + * Get the height of the flyout. + * @return {number} The width of the flyout. + */ +Blockly.Flyout.prototype.getHeight = function() { + return this.height_; +}; + +/** + * Get the workspace inside the flyout. + * @return {!Blockly.WorkspaceSvg} The workspace inside the flyout. + * @package + */ +Blockly.Flyout.prototype.getWorkspace = function() { + return this.workspace_; +}; + +/** + * Is the flyout visible? + * @return {boolean} True if visible. + */ +Blockly.Flyout.prototype.isVisible = function() { + return this.isVisible_; +}; + +/** + * 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. + */ +Blockly.Flyout.prototype.setVisible = function(visible) { + var visibilityChanged = (visible != this.isVisible()); + + this.isVisible_ = visible; + if (visibilityChanged) { + this.updateDisplay_(); + } +}; + +/** + * Set whether this flyout's container is visible. + * @param {boolean} visible Whether the container is visible. + */ +Blockly.Flyout.prototype.setContainerVisible = function(visible) { + var visibilityChanged = (visible != this.containerVisible_); + this.containerVisible_ = visible; + if (visibilityChanged) { + this.updateDisplay_(); + } +}; + +/** + * Update the display property of the flyout based whether it thinks it should + * be visible and whether its containing workspace is visible. + * @private + */ +Blockly.Flyout.prototype.updateDisplay_ = function() { + var show = true; + if (!this.containerVisible_) { + show = false; + } else { + show = this.isVisible(); + } + this.svgGroup_.style.display = show ? 'block' : 'none'; + // Update the scrollbar's visibility too since it should mimic the + // flyout's visibility. + this.scrollbar.setContainerVisible(show); +}; + +/** + * 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 + */ +Blockly.Flyout.prototype.positionAt_ = function(width, height, x, y) { + this.svgGroup_.setAttribute("width", width); + this.svgGroup_.setAttribute("height", height); + if (this.svgGroup_.tagName == 'svg') { + var transform = 'translate(' + x + 'px,' + y + 'px)'; + Blockly.utils.dom.setCssTransform(this.svgGroup_, transform); + } else { + // IE and Edge don't support CSS transforms on SVG elements so + // it's important to set the transform on the SVG element itself + var transform = 'translate(' + x + ',' + y + ')'; + this.svgGroup_.setAttribute("transform", transform); + } + + // Update the scrollbar (if one exists). + if (this.scrollbar) { + // Set the scrollbars origin to be the top left of the flyout. + this.scrollbar.setOrigin(x, y); + this.scrollbar.resize(); + // Set the position again so that if the metrics were the same (and the + // resize failed) our position is still updated. + this.scrollbar.setPosition( + this.scrollbar.position.x, this.scrollbar.position.y); + } +}; + +/** + * Hide and empty the flyout. + */ +Blockly.Flyout.prototype.hide = function() { + if (!this.isVisible()) { + return; + } + this.setVisible(false); + // Delete all the event listeners. + for (var i = 0, listen; (listen = this.listeners_[i]); i++) { + Blockly.unbindEvent_(listen); + } + this.listeners_.length = 0; + if (this.reflowWrapper_) { + this.workspace_.removeChangeListener(this.reflowWrapper_); + this.reflowWrapper_ = null; + } + // Do NOT delete the blocks here. Wait until Flyout.show. + // https://neil.fraser.name/news/2014/08/09/ +}; + +/** + * Show and populate the flyout. + * @param {!Blockly.utils.toolbox.FlyoutDefinition|string} flyoutDef Contents to display + * in the flyout. This is either an array of Nodes, a NodeList, a + * toolbox definition, or a string with the name of the dynamic category. + */ +Blockly.Flyout.prototype.show = function(flyoutDef) { + this.workspace_.setResizesEnabled(false); + this.hide(); + this.clearOldBlocks_(); + + // Handle dynamic categories, represented by a name instead of a list. + if (typeof flyoutDef == 'string') { + flyoutDef = this.getDynamicCategoryContents_(flyoutDef); + } + this.setVisible(true); + + // Parse the Array, Node or NodeList into a a list of flyout items. + var parsedContent = Blockly.utils.toolbox.convertFlyoutDefToJsonArray(flyoutDef); + var flyoutInfo = + /** @type {{contents:!Array., gaps:!Array.}} */ ( + this.createFlyoutInfo_(parsedContent)); + + this.layout_(flyoutInfo.contents, flyoutInfo.gaps); + + // IE 11 is an incompetent browser that fails to fire mouseout events. + // When the mouse is over the background, deselect all blocks. + var deselectAll = function() { + var topBlocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; (block = topBlocks[i]); i++) { + block.removeSelect(); + } + }; + + this.listeners_.push(Blockly.bindEventWithChecks_(this.svgBackground_, + 'mouseover', this, deselectAll)); + + if (this.horizontalLayout) { + this.height_ = 0; + } else { + this.width_ = 0; + } + this.workspace_.setResizesEnabled(true); + this.reflow(); + + this.filterForCapacity_(); + + // Correctly position the flyout's scrollbar when it opens. + this.position(); + + this.reflowWrapper_ = this.reflow.bind(this); + this.workspace_.addChangeListener(this.reflowWrapper_); +}; + +/** + * Create the contents array and gaps array necessary to create the layout for + * the flyout. + * @param {!Blockly.utils.toolbox.FlyoutItemInfoArray} parsedContent The array + * of objects to show in the flyout. + * @return {{contents:Array., gaps:Array.}} The list of contents + * and gaps needed to lay out the flyout. + * @private + */ +Blockly.Flyout.prototype.createFlyoutInfo_ = function(parsedContent) { + var contents = []; + var gaps = []; + this.permanentlyDisabled_.length = 0; + var defaultGap = this.horizontalLayout ? this.GAP_X : this.GAP_Y; + for (var i = 0, contentInfo; (contentInfo = parsedContent[i]); i++) { + + if (contentInfo['custom']) { + var customInfo = /** @type {!Blockly.utils.toolbox.DynamicCategoryInfo} */ (contentInfo); + var categoryName = customInfo['custom']; + var flyoutDef = this.getDynamicCategoryContents_(categoryName); + var parsedDynamicContent = /** @type {!Blockly.utils.toolbox.FlyoutItemInfoArray} */ + (Blockly.utils.toolbox.convertFlyoutDefToJsonArray(flyoutDef)); + parsedContent.splice.apply(parsedContent, [i, 1].concat(parsedDynamicContent)); + contentInfo = parsedContent[i]; + } + + switch (contentInfo['kind'].toUpperCase()) { + case 'BLOCK': + var blockInfo = /** @type {!Blockly.utils.toolbox.BlockInfo} */ (contentInfo); + var blockXml = this.getBlockXml_(blockInfo); + var block = this.createBlock_(blockXml); + // This is a deprecated method for adding gap to a block. + // + var gap = parseInt(blockInfo['gap'] || blockXml.getAttribute('gap'), 10); + gaps.push(isNaN(gap) ? defaultGap : gap); + contents.push({type: 'block', block: block}); + break; + case 'SEP': + var sepInfo = /** @type {!Blockly.utils.toolbox.SeparatorInfo} */ (contentInfo); + this.addSeparatorGap_(sepInfo, gaps, defaultGap); + break; + case 'LABEL': + var labelInfo = /** @type {!Blockly.utils.toolbox.LabelInfo} */ (contentInfo); + // A label is a button with different styling. + var label = this.createButton_(labelInfo, /** isLabel */ true); + contents.push({type: 'button', button: label}); + gaps.push(defaultGap); + break; + case 'BUTTON': + var buttonInfo = /** @type {!Blockly.utils.toolbox.ButtonInfo} */ (contentInfo); + var button = this.createButton_(buttonInfo, /** isLabel */ false); + contents.push({type: 'button', button: button}); + gaps.push(defaultGap); + break; + } + } + return {contents: contents, gaps: gaps}; +}; + +/** + * Gets the flyout definition for the dynamic category. + * @param {string} categoryName The name of the dynamic category. + * @return {!Array.} The array of flyout items. + * @private + */ +Blockly.Flyout.prototype.getDynamicCategoryContents_ = function(categoryName) { + // Look up the correct category generation function and call that to get a + // valid XML list. + var fnToApply = this.workspace_.targetWorkspace.getToolboxCategoryCallback( + categoryName); + if (typeof fnToApply != 'function') { + throw TypeError('Couldn\'t find a callback function when opening' + + ' a toolbox category.'); + } + var flyoutDef = fnToApply(this.workspace_.targetWorkspace); + if (!Array.isArray(flyoutDef)) { + throw new TypeError('Result of toolbox category callback must be an array.'); + } + return flyoutDef; +}; + +/** + * Creates a flyout button or a flyout label. + * @param {!Blockly.utils.toolbox.ButtonOrLabelInfo} btnInfo + * The object holding information about a button or a label. + * @param {boolean} isLabel True if the button is a label, false otherwise. + * @return {!Blockly.FlyoutButton} The object used to display the button in the + * flyout. + * @private + */ +Blockly.Flyout.prototype.createButton_ = function(btnInfo, isLabel) { + if (!Blockly.FlyoutButton) { + throw Error('Missing require for Blockly.FlyoutButton'); + } + var curButton = new Blockly.FlyoutButton(this.workspace_, + /** @type {!Blockly.WorkspaceSvg} */ (this.targetWorkspace), btnInfo, + isLabel); + return curButton; +}; + +/** + * Create a block from the xml and permanently disable any blocks that were + * defined as disabled. + * @param {!Element} blockXml The xml of the block. + * @return {!Blockly.BlockSvg} The block created from the blockXml. + * @protected + */ +Blockly.Flyout.prototype.createBlock_ = function(blockXml) { + var curBlock = /** @type {!Blockly.BlockSvg} */ ( + Blockly.Xml.domToBlock(blockXml, this.workspace_)); + if (!curBlock.isEnabled()) { + // Record blocks that were initially disabled. + // Do not enable these blocks as a result of capacity filtering. + this.permanentlyDisabled_.push(curBlock); + } + return curBlock; +}; + +/** + * Get the xml from the block info object. + * @param {!Blockly.utils.toolbox.BlockInfo} blockInfo The object holding + * information about a block. + * @return {!Element} The xml for the block. + * @throws {Error} if the xml is not a valid block definition. + * @private + */ +Blockly.Flyout.prototype.getBlockXml_ = function(blockInfo) { + var blockElement = null; + var blockXml = blockInfo['blockxml']; + + if (blockXml && typeof blockXml != 'string') { + blockElement = blockXml; + } else if (blockXml && typeof blockXml == 'string') { + blockElement = Blockly.Xml.textToDom(blockXml); + blockInfo['blockxml'] = blockElement; + } else if (blockInfo['type']) { + blockElement = Blockly.utils.xml.createElement('xml'); + blockElement.setAttribute('type', blockInfo['type']); + blockElement.setAttribute('disabled', blockInfo['disabled']); + blockInfo['blockxml'] = blockElement; + } + + if (!blockElement) { + throw Error('Error: Invalid block definition. Block definition must have blockxml or type.'); + } + return blockElement; +}; + +/** + * Add the necessary gap in the flyout for a separator. + * @param {!Blockly.utils.toolbox.SeparatorInfo} sepInfo The object holding + * information about a separator. + * @param {!Array.} gaps The list gaps between items in the flyout. + * @param {number} defaultGap The default gap between the button and next element. + * @private + */ +Blockly.Flyout.prototype.addSeparatorGap_ = function(sepInfo, gaps, defaultGap) { + // Change the gap between two toolbox elements. + // + // The default gap is 24, can be set larger or smaller. + // This overwrites the gap attribute on the previous element. + var newGap = parseInt(sepInfo['gap'], 10); + // Ignore gaps before the first block. + if (!isNaN(newGap) && gaps.length > 0) { + gaps[gaps.length - 1] = newGap; + } else { + gaps.push(defaultGap); + } +}; + +/** + * Delete blocks, mats and buttons from a previous showing of the flyout. + * @protected + */ +Blockly.Flyout.prototype.clearOldBlocks_ = function() { + // Delete any blocks from a previous showing. + var oldBlocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; (block = oldBlocks[i]); i++) { + if (block.workspace == this.workspace_) { + block.dispose(false, false); + } + } + // Delete any mats from a previous showing. + for (var j = 0; j < this.mats_.length; j++) { + var rect = this.mats_[j]; + if (rect) { + Blockly.Tooltip.unbindMouseEvents(rect); + Blockly.utils.dom.removeNode(rect); + } + } + this.mats_.length = 0; + // Delete any buttons from a previous showing. + for (var i = 0, button; (button = this.buttons_[i]); i++) { + button.dispose(); + } + this.buttons_.length = 0; + + // Clear potential variables from the previous showing. + this.workspace_.getPotentialVariableMap().clear(); +}; + +/** + * 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.BlockSvg} 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 + */ +Blockly.Flyout.prototype.addBlockListeners_ = function(root, block, rect) { + this.listeners_.push(Blockly.bindEventWithChecks_(root, 'mousedown', null, + this.blockMouseDown_(block))); + this.listeners_.push(Blockly.bindEventWithChecks_(rect, 'mousedown', null, + this.blockMouseDown_(block))); + this.listeners_.push(Blockly.bindEvent_(root, 'mouseenter', block, + block.addSelect)); + this.listeners_.push(Blockly.bindEvent_(root, 'mouseleave', block, + block.removeSelect)); + this.listeners_.push(Blockly.bindEvent_(rect, 'mouseenter', block, + block.addSelect)); + this.listeners_.push(Blockly.bindEvent_(rect, 'mouseleave', block, + block.removeSelect)); +}; + +/** + * Handle a mouse-down on an SVG block in a non-closing flyout. + * @param {!Blockly.BlockSvg} block The flyout block to copy. + * @return {!Function} Function to call when block is clicked. + * @private + */ +Blockly.Flyout.prototype.blockMouseDown_ = function(block) { + var flyout = this; + return function(e) { + var gesture = flyout.targetWorkspace.getGesture(e); + if (gesture) { + gesture.setStartBlock(block); + gesture.handleFlyoutStart(e, flyout); + } + }; +}; + +/** + * Mouse down on the flyout background. Start a vertical scroll drag. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.Flyout.prototype.onMouseDown_ = function(e) { + var gesture = this.targetWorkspace.getGesture(e); + if (gesture) { + gesture.handleFlyoutStart(e, this); + } +}; + +/** + * 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 + */ +Blockly.Flyout.prototype.isBlockCreatable_ = function(block) { + return block.isEnabled(); +}; + +/** + * 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. + * @throws {Error} if something went wrong with deserialization. + * @package + */ +Blockly.Flyout.prototype.createBlock = function(originalBlock) { + var newBlock = null; + Blockly.Events.disable(); + var variablesBeforeCreation = this.targetWorkspace.getAllVariables(); + this.targetWorkspace.setResizesEnabled(false); + try { + newBlock = this.placeNewBlock_(originalBlock); + } finally { + Blockly.Events.enable(); + } + + // Close the flyout. + Blockly.hideChaff(); + + var newVariables = Blockly.Variables.getAddedVariables(this.targetWorkspace, + variablesBeforeCreation); + + if (Blockly.Events.isEnabled()) { + Blockly.Events.setGroup(true); + // Fire a VarCreate event for each (if any) new variable created. + for (var i = 0; i < newVariables.length; i++) { + var thisVariable = newVariables[i]; + Blockly.Events.fire(new Blockly.Events.VarCreate(thisVariable)); + } + + // Block events come after var events, in case they refer to newly created + // variables. + Blockly.Events.fire(new Blockly.Events.Create(newBlock)); + } + if (this.autoClose) { + this.hide(); + } else { + this.filterForCapacity_(); + } + return newBlock; +}; + +/** + * 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 + */ +Blockly.Flyout.prototype.initFlyoutButton_ = function(button, x, y) { + var buttonSvg = button.createDom(); + button.moveTo(x, y); + button.show(); + // Clicking on a flyout button or label is a lot like clicking on the + // flyout background. + this.listeners_.push( + Blockly.bindEventWithChecks_( + buttonSvg, 'mousedown', this, this.onMouseDown_)); + + this.buttons_.push(button); +}; + +/** + * Create and place a rectangle corresponding to the given block. + * @param {!Blockly.BlockSvg} 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 + */ +Blockly.Flyout.prototype.createRect_ = function(block, x, y, blockHW, index) { + // Create an invisible rectangle under the block to act as a button. Just + // using the block as a button is poor, since blocks have holes in them. + var rect = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, + { + 'fill-opacity': 0, + 'x': x, + 'y': y, + 'height': blockHW.height, + 'width': blockHW.width + }, null); + rect.tooltip = block; + Blockly.Tooltip.bindMouseEvents(rect); + // Add the rectangles under the blocks, so that the blocks' tooltips work. + this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot()); + + block.flyoutRect_ = rect; + this.mats_[index] = rect; + return rect; +}; + +/** + * 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 + */ +Blockly.Flyout.prototype.moveRectToBlock_ = function(rect, block) { + var blockHW = block.getHeightWidth(); + rect.setAttribute('width', blockHW.width); + rect.setAttribute('height', blockHW.height); + + var blockXY = block.getRelativeToSurfaceXY(); + rect.setAttribute('y', blockXY.y); + rect.setAttribute('x', this.RTL ? blockXY.x - blockHW.width : blockXY.x); +}; + +/** + * Filter the blocks on the flyout to disable the ones that are above the + * capacity limit. For instance, if the user may only place two more blocks on + * the workspace, an "a + b" block that has two shadow blocks would be disabled. + * @private + */ +Blockly.Flyout.prototype.filterForCapacity_ = function() { + var blocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; (block = blocks[i]); i++) { + if (this.permanentlyDisabled_.indexOf(block) == -1) { + var enable = this.targetWorkspace + .isCapacityAvailable(Blockly.utils.getBlockTypeCounts(block)); + while (block) { + block.setEnabled(enable); + block = block.getNextBlock(); + } + } + } +}; + +/** + * Reflow blocks and their mats. + */ +Blockly.Flyout.prototype.reflow = function() { + if (this.reflowWrapper_) { + this.workspace_.removeChangeListener(this.reflowWrapper_); + } + this.reflowInternal_(); + if (this.reflowWrapper_) { + this.workspace_.addChangeListener(this.reflowWrapper_); + } +}; + +/** + * @return {boolean} True if this flyout may be scrolled with a scrollbar or by + * dragging. + * @package + */ +Blockly.Flyout.prototype.isScrollable = function() { + return this.scrollbar ? this.scrollbar.isVisible() : false; +}; + +/** + * Copy a block from the flyout to the workspace and position it correctly. + * @param {!Blockly.BlockSvg} oldBlock The flyout block to copy. + * @return {!Blockly.BlockSvg} The new block in the main workspace. + * @private + */ +Blockly.Flyout.prototype.placeNewBlock_ = function(oldBlock) { + var targetWorkspace = this.targetWorkspace; + var svgRootOld = oldBlock.getSvgRoot(); + if (!svgRootOld) { + throw Error('oldBlock is not rendered.'); + } + + // Create the new block by cloning the block in the flyout (via XML). + // This cast assumes that the oldBlock can not be an insertion marker. + var xml = /** @type {!Element} */ (Blockly.Xml.blockToDom(oldBlock, true)); + // The target workspace would normally resize during domToBlock, which will + // lead to weird jumps. Save it for terminateDrag. + targetWorkspace.setResizesEnabled(false); + + // Using domToBlock instead of domToWorkspace means that the new block will be + // placed at position (0, 0) in main workspace units. + var block = /** @type {!Blockly.BlockSvg} */ + (Blockly.Xml.domToBlock(xml, targetWorkspace)); + var svgRootNew = block.getSvgRoot(); + if (!svgRootNew) { + throw Error('block is not rendered.'); + } + + // The offset in pixels between the main workspace's origin and the upper left + // corner of the injection div. + var mainOffsetPixels = targetWorkspace.getOriginOffsetInPixels(); + + // The offset in pixels between the flyout workspace's origin and the upper + // left corner of the injection div. + var flyoutOffsetPixels = this.workspace_.getOriginOffsetInPixels(); + + // The position of the old block in flyout workspace coordinates. + var oldBlockPos = oldBlock.getRelativeToSurfaceXY(); + // The position of the old block in pixels relative to the flyout + // workspace's origin. + oldBlockPos.scale(this.workspace_.scale); + + // The position of the old block in pixels relative to the upper left corner + // of the injection div. + var oldBlockOffsetPixels = Blockly.utils.Coordinate.sum(flyoutOffsetPixels, + oldBlockPos); + + // The position of the old block in pixels relative to the origin of the + // main workspace. + var finalOffset = Blockly.utils.Coordinate.difference(oldBlockOffsetPixels, + mainOffsetPixels); + // The position of the old block in main workspace coordinates. + finalOffset.scale(1 / targetWorkspace.scale); + + block.moveBy(finalOffset.x, finalOffset.y); + return block; +}; + +/** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the flyout handled the action, false otherwise. + * @package + */ +Blockly.Flyout.prototype.onBlocklyAction = function(action) { + var cursor = this.workspace_.getCursor(); + return cursor.onBlocklyAction(action); +}; + +/** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ +Blockly.Flyout.prototype.getClientRect; + +/** + * Position the flyout. + * @return {void} + */ +Blockly.Flyout.prototype.position; + +/** + * 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 + */ +Blockly.Flyout.prototype.isDragTowardWorkspace; + +/** + * Return an object with all the metrics required to size scrollbars for the + * flyout. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ +Blockly.Flyout.prototype.getMetrics_; + +/** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ +Blockly.Flyout.prototype.setMetrics_; + +/** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ +Blockly.Flyout.prototype.layout_; + +/** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ +Blockly.Flyout.prototype.wheel_; + +/** + * Compute height of flyout. Position mat under each block. + * For RTL: Lay out the blocks right-aligned. + * @return {void} + * @protected + */ +Blockly.Flyout.prototype.reflowInternal_; + +/** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ +Blockly.Flyout.prototype.getX; + +/** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ +Blockly.Flyout.prototype.getY; diff --git a/static/js/dist/core/flyout_button.js b/static/js/dist/core/flyout_button.js new file mode 100644 index 0000000..f0a1542 --- /dev/null +++ b/static/js/dist/core/flyout_button.js @@ -0,0 +1,325 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Class for a button in the flyout. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.FlyoutButton'); + +goog.require('Blockly.Css'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); + + +/** + * 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 {!Blockly.utils.toolbox.ButtonOrLabelInfo} json + * The JSON specifying the label/button. + * @param {boolean} isLabel Whether this button should be styled as a label. + * @constructor + * @package + */ +Blockly.FlyoutButton = function(workspace, targetWorkspace, json, isLabel) { + // Labels behave the same as buttons, but are styled differently. + + /** + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = workspace; + + /** + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.targetWorkspace_ = targetWorkspace; + + /** + * @type {string} + * @private + */ + this.text_ = json['text']; + + /** + * @type {!Blockly.utils.Coordinate} + * @private + */ + this.position_ = new Blockly.utils.Coordinate(0, 0); + + /** + * Whether this button should be styled as a label. + * @type {boolean} + * @private + */ + this.isLabel_ = isLabel; + + /** + * The key to the function called when this button is clicked. + * @type {string} + * @private + */ + this.callbackKey_ = json['callbackKey'] || + /* Check the lower case version too to satisfy IE */ + json['callbackkey']; + + /** + * If specified, a CSS class to add to this button. + * @type {?string} + * @private + */ + this.cssClass_ = json['web-class'] || null; + + /** + * Mouse up event data. + * @type {?Blockly.EventData} + * @private + */ + this.onMouseUpWrapper_ = null; + + /** + * The JSON specifying the label / button. + * @type {!Blockly.utils.toolbox.ButtonOrLabelInfo} + */ + this.info = json; +}; + +/** + * The horizontal margin around the text in the button. + */ +Blockly.FlyoutButton.MARGIN_X = 5; + +/** + * The vertical margin around the text in the button. + */ +Blockly.FlyoutButton.MARGIN_Y = 2; + +/** + * The width of the button's rect. + * @type {number} + */ +Blockly.FlyoutButton.prototype.width = 0; + +/** + * The height of the button's rect. + * @type {number} + */ +Blockly.FlyoutButton.prototype.height = 0; + +/** + * Create the button elements. + * @return {!SVGElement} The button's SVG group. + */ +Blockly.FlyoutButton.prototype.createDom = function() { + var cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton'; + if (this.cssClass_) { + cssClass += ' ' + this.cssClass_; + } + + this.svgGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, {'class': cssClass}, + this.workspace_.getCanvas()); + + if (!this.isLabel_) { + // Shadow rectangle (light source does not mirror in RTL). + var shadow = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, + { + 'class': 'blocklyFlyoutButtonShadow', + 'rx': 4, 'ry': 4, 'x': 1, 'y': 1 + }, + this.svgGroup_); + } + // Background rectangle. + var rect = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, + { + 'class': this.isLabel_ ? + 'blocklyFlyoutLabelBackground' : 'blocklyFlyoutButtonBackground', + 'rx': 4, 'ry': 4 + }, + this.svgGroup_); + + var svgText = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TEXT, + { + 'class': this.isLabel_ ? 'blocklyFlyoutLabelText' : 'blocklyText', + 'x': 0, + 'y': 0, + 'text-anchor': 'middle' + }, + this.svgGroup_); + var text = Blockly.utils.replaceMessageReferences(this.text_); + if (this.workspace_.RTL) { + // Force text to be RTL by adding an RLM. + text += '\u200F'; + } + svgText.textContent = text; + if (this.isLabel_) { + this.svgText_ = svgText; + this.workspace_.getThemeManager().subscribe(this.svgText_, + 'flyoutForegroundColour', 'fill'); + } + + var fontSize = Blockly.utils.style.getComputedStyle(svgText, 'fontSize'); + var fontWeight = Blockly.utils.style.getComputedStyle(svgText, 'fontWeight'); + var fontFamily = Blockly.utils.style.getComputedStyle(svgText, 'fontFamily'); + this.width = Blockly.utils.dom.getFastTextWidthWithSizeString(svgText, + fontSize, fontWeight, fontFamily); + var fontMetrics = Blockly.utils.dom.measureFontMetrics(text, fontSize, + fontWeight, fontFamily); + this.height = fontMetrics.height; + + if (!this.isLabel_) { + this.width += 2 * Blockly.FlyoutButton.MARGIN_X; + this.height += 2 * Blockly.FlyoutButton.MARGIN_Y; + shadow.setAttribute('width', this.width); + shadow.setAttribute('height', this.height); + } + rect.setAttribute('width', this.width); + rect.setAttribute('height', this.height); + + svgText.setAttribute('x', this.width / 2); + svgText.setAttribute('y', this.height / 2 - fontMetrics.height / 2 + + fontMetrics.baseline); + + this.updateTransform_(); + + this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( + this.svgGroup_, 'mouseup', this, this.onMouseUp_); + return this.svgGroup_; +}; + +/** + * Correctly position the flyout button and make it visible. + */ +Blockly.FlyoutButton.prototype.show = function() { + this.updateTransform_(); + this.svgGroup_.setAttribute('display', 'block'); +}; + +/** + * Update SVG attributes to match internal state. + * @private + */ +Blockly.FlyoutButton.prototype.updateTransform_ = function() { + this.svgGroup_.setAttribute('transform', + 'translate(' + this.position_.x + ',' + this.position_.y + ')'); +}; + +/** + * Move the button to the given x, y coordinates. + * @param {number} x The new x coordinate. + * @param {number} y The new y coordinate. + */ +Blockly.FlyoutButton.prototype.moveTo = function(x, y) { + this.position_.x = x; + this.position_.y = y; + this.updateTransform_(); +}; + +/** + * @return {boolean} Whether or not the button is a label. + */ +Blockly.FlyoutButton.prototype.isLabel = function() { + return this.isLabel_; +}; + +/** + * Location of the button. + * @return {!Blockly.utils.Coordinate} x, y coordinates. + * @package + */ +Blockly.FlyoutButton.prototype.getPosition = function() { + return this.position_; +}; + +/** + * @return {string} Text of the button. + */ +Blockly.FlyoutButton.prototype.getButtonText = function() { + return this.text_; +}; + +/** + * Get the button's target workspace. + * @return {!Blockly.WorkspaceSvg} The target workspace of the flyout where this + * button resides. + */ +Blockly.FlyoutButton.prototype.getTargetWorkspace = function() { + return this.targetWorkspace_; +}; + +/** + * Dispose of this button. + */ +Blockly.FlyoutButton.prototype.dispose = function() { + if (this.onMouseUpWrapper_) { + Blockly.unbindEvent_(this.onMouseUpWrapper_); + } + if (this.svgGroup_) { + Blockly.utils.dom.removeNode(this.svgGroup_); + } + if (this.svgText_) { + this.workspace_.getThemeManager().unsubscribe(this.svgText_); + } +}; + +/** + * Do something when the button is clicked. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.FlyoutButton.prototype.onMouseUp_ = function(e) { + var gesture = this.targetWorkspace_.getGesture(e); + if (gesture) { + gesture.cancel(); + } + + if (this.isLabel_ && this.callbackKey_) { + console.warn('Labels should not have callbacks. Label text: ' + this.text_); + } else if (!this.isLabel_ && !(this.callbackKey_ && + this.targetWorkspace_.getButtonCallback(this.callbackKey_))) { + console.warn('Buttons should have callbacks. Button text: ' + this.text_); + } else if (!this.isLabel_) { + this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this); + } +}; + +/** + * CSS for buttons and labels. See css.js for use. + */ +Blockly.Css.register([ + /* eslint-disable indent */ + '.blocklyFlyoutButton {', + 'fill: #888;', + 'cursor: default;', + '}', + + '.blocklyFlyoutButtonShadow {', + 'fill: #666;', + '}', + + '.blocklyFlyoutButton:hover {', + 'fill: #aaa;', + '}', + + '.blocklyFlyoutLabel {', + 'cursor: default;', + '}', + + '.blocklyFlyoutLabelBackground {', + 'opacity: 0;', + '}', + /* eslint-enable indent */ +]); diff --git a/static/js/dist/core/flyout_dragger.js b/static/js/dist/core/flyout_dragger.js new file mode 100644 index 0000000..0a9bafe --- /dev/null +++ b/static/js/dist/core/flyout_dragger.js @@ -0,0 +1,76 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Methods for dragging a flyout visually. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.FlyoutDragger'); + +goog.require('Blockly.utils.object'); +goog.require('Blockly.WorkspaceDragger'); + +goog.requireType('Blockly.IFlyout'); + + +/** + * 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.IFlyout} flyout The flyout to drag. + * @extends {Blockly.WorkspaceDragger} + * @constructor + */ +Blockly.FlyoutDragger = function(flyout) { + Blockly.FlyoutDragger.superClass_.constructor.call(this, + flyout.getWorkspace()); + + /** + * The scrollbar to update to move the flyout. + * Unlike the main workspace, the flyout has only one scrollbar, in either the + * horizontal or the vertical direction. + * @type {!Blockly.Scrollbar} + * @private + */ + this.scrollbar_ = flyout.scrollbar; + + /** + * Whether the flyout scrolls horizontally. If false, the flyout scrolls + * vertically. + * @type {boolean} + * @private + */ + this.horizontalLayout_ = flyout.horizontalLayout; +}; +Blockly.utils.object.inherits(Blockly.FlyoutDragger, Blockly.WorkspaceDragger); + +/** + * 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 + */ +Blockly.FlyoutDragger.prototype.drag = function(currentDragDeltaXY) { + // startScrollXY_ is assigned by the superclass. + var newXY = Blockly.utils.Coordinate.sum(this.startScrollXY_, + currentDragDeltaXY); + + // We can't call workspace.scroll because the flyout's workspace doesn't own + // it's own scrollbars. This is because (as of 2.20190722.1) the + // workspace's scrollbar property must be a scrollbar pair, rather than a + // single scrollbar. + // Instead we'll just expect setting the scrollbar to update the scroll of + // the workspace as well. + if (this.horizontalLayout_) { + this.scrollbar_.set(-newXY.x); + } else { + this.scrollbar_.set(-newXY.y); + } +}; diff --git a/static/js/dist/core/flyout_horizontal.js b/static/js/dist/core/flyout_horizontal.js new file mode 100644 index 0000000..6a08178 --- /dev/null +++ b/static/js/dist/core/flyout_horizontal.js @@ -0,0 +1,418 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Horizontal flyout tray containing blocks which may be created. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.HorizontalFlyout'); + +goog.require('Blockly.Block'); +goog.require('Blockly.constants'); +goog.require('Blockly.Flyout'); +goog.require('Blockly.registry'); +goog.require('Blockly.Scrollbar'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Rect'); +goog.require('Blockly.WidgetDiv'); + +goog.requireType('Blockly.utils.Metrics'); + + +/** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @extends {Blockly.Flyout} + * @constructor + */ +Blockly.HorizontalFlyout = function(workspaceOptions) { + Blockly.HorizontalFlyout.superClass_.constructor.call(this, workspaceOptions); + this.horizontalLayout = true; +}; +Blockly.utils.object.inherits(Blockly.HorizontalFlyout, Blockly.Flyout); + +/** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ +Blockly.HorizontalFlyout.prototype.getMetrics_ = function() { + if (!this.isVisible()) { + // Flyout is hidden. + return null; + } + + try { + var optionBox = this.workspace_.getCanvas().getBBox(); + } catch (e) { + // Firefox has trouble with hidden elements (Bug 528969). + var optionBox = {height: 0, y: 0, width: 0, x: 0}; + } + + var absoluteTop = this.SCROLLBAR_PADDING; + var absoluteLeft = this.SCROLLBAR_PADDING; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + absoluteTop = 0; + } + var viewHeight = this.height_; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + viewHeight -= this.SCROLLBAR_PADDING; + } + var viewWidth = this.width_ - 2 * this.SCROLLBAR_PADDING; + + var metrics = { + contentHeight: (optionBox.height + 2 * this.MARGIN) * this.workspace_.scale, + contentWidth: (optionBox.width + 2 * this.MARGIN) * this.workspace_.scale, + contentTop: 0, + contentLeft: 0, + + viewHeight: viewHeight, + viewWidth: viewWidth, + viewTop: -this.workspace_.scrollY, + viewLeft: -this.workspace_.scrollX, + + absoluteTop: absoluteTop, + absoluteLeft: absoluteLeft + }; + return metrics; +}; + +/** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ +Blockly.HorizontalFlyout.prototype.setMetrics_ = function(xyRatio) { + var metrics = this.getMetrics_(); + // This is a fix to an apparent race condition. + if (!metrics) { + return; + } + + if (typeof xyRatio.x == 'number') { + this.workspace_.scrollX = -metrics.contentWidth * xyRatio.x; + } + + this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, + this.workspace_.scrollY + metrics.absoluteTop); +}; + +/** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ +Blockly.HorizontalFlyout.prototype.getX = function() { + // X is always 0 since this is a horizontal flyout. + return 0; +}; + +/** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ +Blockly.HorizontalFlyout.prototype.getY = function() { + var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); + if (!targetWorkspaceMetrics) { + // Hidden components will return null. + return 0; + } + + var y = 0; + // If this flyout is not the trashcan flyout (e.g. toolbox or mutator). + if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_) { + // If there is a category toolbox. + if (targetWorkspaceMetrics.toolboxHeight) { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + y = targetWorkspaceMetrics.toolboxHeight; + } else { + y = targetWorkspaceMetrics.viewHeight - this.height_; + } + // Simple (flyout-only) toolbox. + } else { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + y = 0; + } else { + // The simple flyout does not cover the workspace. + y = targetWorkspaceMetrics.viewHeight; + } + } + // Trashcan flyout is opposite the main flyout. + } else { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + y = 0; + } else { + // Because the anchor point of the flyout is on the top, but we want + // to align the bottom edge of the flyout with the bottom edge of the + // blocklyDiv, we calculate the full height of the div minus the height + // of the flyout. + y = targetWorkspaceMetrics.viewHeight + + targetWorkspaceMetrics.absoluteTop - this.height_; + } + } + + return y; +}; + +/** + * Move the flyout to the edge of the workspace. + */ +Blockly.HorizontalFlyout.prototype.position = function() { + if (!this.isVisible()) { + return; + } + var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); + if (!targetWorkspaceMetrics) { + // Hidden components will return null. + return; + } + // Record the width for Blockly.Flyout.getMetrics_. + this.width_ = targetWorkspaceMetrics.viewWidth; + + var edgeWidth = targetWorkspaceMetrics.viewWidth - 2 * this.CORNER_RADIUS; + var edgeHeight = this.height_ - this.CORNER_RADIUS; + this.setBackgroundPath_(edgeWidth, edgeHeight); + + var x = this.getX(); + var y = this.getY(); + + this.positionAt_(this.width_, this.height_, x, y); +}; + +/** + * Create and set the path for the visible boundaries of the flyout. + * @param {number} width The width of the flyout, not including the + * rounded corners. + * @param {number} height The height of the flyout, not including + * rounded corners. + * @private + */ +Blockly.HorizontalFlyout.prototype.setBackgroundPath_ = function(width, + height) { + var atTop = this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP; + // Start at top left. + var path = ['M 0,' + (atTop ? 0 : this.CORNER_RADIUS)]; + + if (atTop) { + // Top. + path.push('h', width + 2 * this.CORNER_RADIUS); + // Right. + path.push('v', height); + // Bottom. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + -this.CORNER_RADIUS, this.CORNER_RADIUS); + path.push('h', -width); + // Left. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + -this.CORNER_RADIUS, -this.CORNER_RADIUS); + path.push('z'); + } else { + // Top. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + this.CORNER_RADIUS, -this.CORNER_RADIUS); + path.push('h', width); + // Right. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + this.CORNER_RADIUS, this.CORNER_RADIUS); + path.push('v', height); + // Bottom. + path.push('h', -width - 2 * this.CORNER_RADIUS); + // Left. + path.push('z'); + } + this.svgBackground_.setAttribute('d', path.join(' ')); +}; + +/** + * Scroll the flyout to the top. + */ +Blockly.HorizontalFlyout.prototype.scrollToStart = function() { + this.scrollbar.set(this.RTL ? Infinity : 0); +}; + +/** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ +Blockly.HorizontalFlyout.prototype.wheel_ = function(e) { + var scrollDelta = Blockly.utils.getScrollDeltaPixels(e); + var delta = scrollDelta.x || scrollDelta.y; + + if (delta) { + var metrics = this.getMetrics_(); + var pos = metrics.viewLeft + delta; + var limit = metrics.contentWidth - metrics.viewWidth; + pos = Math.min(pos, limit); + pos = Math.max(pos, 0); + this.scrollbar.set(pos); + // When the flyout moves from a wheel event, hide WidgetDiv and DropDownDiv. + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); + } + + // Don't scroll the page. + e.preventDefault(); + // Don't propagate mousewheel event (zooming). + e.stopPropagation(); +}; + +/** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ +Blockly.HorizontalFlyout.prototype.layout_ = function(contents, gaps) { + this.workspace_.scale = this.targetWorkspace.scale; + var margin = this.MARGIN; + var cursorX = margin + this.tabWidth_; + var cursorY = margin; + if (this.RTL) { + contents = contents.reverse(); + } + + for (var i = 0, item; (item = contents[i]); i++) { + if (item.type == 'block') { + var block = item.block; + var allBlocks = block.getDescendants(false); + for (var j = 0, child; (child = allBlocks[j]); j++) { + // Mark blocks as being inside a flyout. This is used to detect and + // prevent the closure of the flyout if the user right-clicks on such a + // block. + child.isInFlyout = true; + } + block.render(); + var root = block.getSvgRoot(); + var blockHW = block.getHeightWidth(); + + // Figure out where to place the block. + var tab = block.outputConnection ? this.tabWidth_ : 0; + if (this.RTL) { + var moveX = cursorX + blockHW.width; + } else { + var moveX = cursorX - tab; + } + block.moveBy(moveX, cursorY); + + var rect = this.createRect_(block, moveX, cursorY, blockHW, i); + cursorX += (blockHW.width + gaps[i]); + + this.addBlockListeners_(root, block, rect); + } else if (item.type == 'button') { + this.initFlyoutButton_(item.button, cursorX, cursorY); + cursorX += (item.button.width + gaps[i]); + } + } +}; + +/** + * 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 + */ +Blockly.HorizontalFlyout.prototype.isDragTowardWorkspace = function( + currentDragDeltaXY) { + var dx = currentDragDeltaXY.x; + var dy = currentDragDeltaXY.y; + // Direction goes from -180 to 180, with 0 toward the right and 90 on top. + var dragDirection = Math.atan2(dy, dx) / Math.PI * 180; + + var range = this.dragAngleRange_; + // Check for up or down dragging. + if ((dragDirection < 90 + range && dragDirection > 90 - range) || + (dragDirection > -90 - range && dragDirection < -90 + range)) { + return true; + } + return false; +}; + +/** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ +Blockly.HorizontalFlyout.prototype.getClientRect = function() { + if (!this.svgGroup_) { + return null; + } + + var flyoutRect = this.svgGroup_.getBoundingClientRect(); + // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout + // area are still deleted. Must be larger than the largest screen size, + // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). + var BIG_NUM = 1000000000; + var top = flyoutRect.top; + + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + var height = flyoutRect.height; + return new Blockly.utils.Rect(-BIG_NUM, top + height, -BIG_NUM, BIG_NUM); + } else { // Bottom. + return new Blockly.utils.Rect(top, BIG_NUM, -BIG_NUM, BIG_NUM); + } +}; + +/** + * Compute height of flyout. Position mat under each block. + * For RTL: Lay out the blocks right-aligned. + * @protected + */ +Blockly.HorizontalFlyout.prototype.reflowInternal_ = function() { + this.workspace_.scale = this.targetWorkspace.scale; + var flyoutHeight = 0; + var blocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; (block = blocks[i]); i++) { + flyoutHeight = Math.max(flyoutHeight, block.getHeightWidth().height); + } + flyoutHeight += this.MARGIN * 1.5; + flyoutHeight *= this.workspace_.scale; + flyoutHeight += Blockly.Scrollbar.scrollbarThickness; + + if (this.height_ != flyoutHeight) { + for (var i = 0, block; (block = blocks[i]); i++) { + if (block.flyoutRect_) { + this.moveRectToBlock_(block.flyoutRect_, block); + } + } + + if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_ && + this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP && + !this.targetWorkspace.getToolbox()) { + // This flyout is a simple toolbox. Reposition the workspace so that (0,0) + // is in the correct position relative to the new absolute edge (ie + // toolbox edge). + this.targetWorkspace.translate( + this.targetWorkspace.scrollX, this.targetWorkspace.scrollY + flyoutHeight); + } + + // Record the height for .getMetrics_ and .position. + this.height_ = flyoutHeight; + this.position(); + } +}; + +Blockly.registry.register(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX, + Blockly.registry.DEFAULT, Blockly.HorizontalFlyout); diff --git a/static/js/dist/core/flyout_vertical.js b/static/js/dist/core/flyout_vertical.js new file mode 100644 index 0000000..9e62c96 --- /dev/null +++ b/static/js/dist/core/flyout_vertical.js @@ -0,0 +1,428 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Layout code for a vertical variant of the flyout. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.VerticalFlyout'); + +goog.require('Blockly.Block'); +goog.require('Blockly.constants'); +goog.require('Blockly.Flyout'); +goog.require('Blockly.registry'); +goog.require('Blockly.Scrollbar'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Rect'); +goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.WidgetDiv'); + +goog.requireType('Blockly.utils.Metrics'); + + +/** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @extends {Blockly.Flyout} + * @constructor + */ +Blockly.VerticalFlyout = function(workspaceOptions) { + Blockly.VerticalFlyout.superClass_.constructor.call(this, workspaceOptions); +}; +Blockly.utils.object.inherits(Blockly.VerticalFlyout, Blockly.Flyout); + +/** + * The name of the vertical flyout in the registry. + * @type {string} + */ +Blockly.VerticalFlyout.registryName = 'verticalFlyout'; + +/** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ +Blockly.VerticalFlyout.prototype.getMetrics_ = function() { + if (!this.isVisible()) { + // Flyout is hidden. + return null; + } + + try { + var optionBox = this.workspace_.getCanvas().getBBox(); + } catch (e) { + // Firefox has trouble with hidden elements (Bug 528969). + var optionBox = {height: 0, y: 0, width: 0, x: 0}; + } + + // Padding for the end of the scrollbar. + var absoluteTop = this.SCROLLBAR_PADDING; + var absoluteLeft = 0; + + var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; + var viewWidth = this.width_; + if (!this.RTL) { + viewWidth -= this.SCROLLBAR_PADDING; + } + + var metrics = { + contentHeight: optionBox.height * this.workspace_.scale + 2 * this.MARGIN, + contentWidth: optionBox.width * this.workspace_.scale + 2 * this.MARGIN, + contentTop: optionBox.y, + contentLeft: optionBox.x, + + viewHeight: viewHeight, + viewWidth: viewWidth, + viewTop: -this.workspace_.scrollY + optionBox.y, + viewLeft: -this.workspace_.scrollX, + + absoluteTop: absoluteTop, + absoluteLeft: absoluteLeft + }; + return metrics; +}; + +/** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ +Blockly.VerticalFlyout.prototype.setMetrics_ = function(xyRatio) { + var metrics = this.getMetrics_(); + // This is a fix to an apparent race condition. + if (!metrics) { + return; + } + if (typeof xyRatio.y == 'number') { + this.workspace_.scrollY = -metrics.contentHeight * xyRatio.y; + } + this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, + this.workspace_.scrollY + metrics.absoluteTop); +}; + +/** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ +Blockly.VerticalFlyout.prototype.getX = function() { + var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); + if (!targetWorkspaceMetrics) { + // Hidden components will return null. + return 0; + } + + var x = 0; + + // If this flyout is not the trashcan flyout (e.g. toolbox or mutator). + if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_) { + // If there is a category toolbox. + if (targetWorkspaceMetrics.toolboxWidth) { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + x = targetWorkspaceMetrics.toolboxWidth; + } else { + x = targetWorkspaceMetrics.viewWidth - this.width_; + } + // Simple (flyout-only) toolbox. + } else { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + x = 0; + } else { + // The simple flyout does not cover the workspace. + x = targetWorkspaceMetrics.viewWidth; + } + } + // Trashcan flyout is opposite the main flyout. + } else { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + x = 0; + } else { + // Because the anchor point of the flyout is on the left, but we want + // to align the right edge of the flyout with the right edge of the + // blocklyDiv, we calculate the full width of the div minus the width + // of the flyout. + x = targetWorkspaceMetrics.viewWidth + + targetWorkspaceMetrics.absoluteLeft - this.width_; + } + } + + return x; +}; + +/** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ +Blockly.VerticalFlyout.prototype.getY = function() { + // Y is always 0 since this is a vertical flyout. + return 0; +}; + +/** + * Move the flyout to the edge of the workspace. + */ +Blockly.VerticalFlyout.prototype.position = function() { + if (!this.isVisible()) { + return; + } + var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); + if (!targetWorkspaceMetrics) { + // Hidden components will return null. + return; + } + // Record the height for Blockly.Flyout.getMetrics_ + this.height_ = targetWorkspaceMetrics.viewHeight; + + var edgeWidth = this.width_ - this.CORNER_RADIUS; + var edgeHeight = targetWorkspaceMetrics.viewHeight - 2 * this.CORNER_RADIUS; + this.setBackgroundPath_(edgeWidth, edgeHeight); + + var x = this.getX(); + var y = this.getY(); + + this.positionAt_(this.width_, this.height_, x, y); +}; + +/** + * Create and set the path for the visible boundaries of the flyout. + * @param {number} width The width of the flyout, not including the + * rounded corners. + * @param {number} height The height of the flyout, not including + * rounded corners. + * @private + */ +Blockly.VerticalFlyout.prototype.setBackgroundPath_ = function(width, height) { + var atRight = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT; + var totalWidth = width + this.CORNER_RADIUS; + + // Decide whether to start on the left or right. + var path = ['M ' + (atRight ? totalWidth : 0) + ',0']; + // Top. + path.push('h', atRight ? -width : width); + // Rounded corner. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, + atRight ? 0 : 1, + atRight ? -this.CORNER_RADIUS : this.CORNER_RADIUS, + this.CORNER_RADIUS); + // Side closest to workspace. + path.push('v', Math.max(0, height)); + // Rounded corner. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, + atRight ? 0 : 1, + atRight ? this.CORNER_RADIUS : -this.CORNER_RADIUS, + this.CORNER_RADIUS); + // Bottom. + path.push('h', atRight ? width : -width); + path.push('z'); + this.svgBackground_.setAttribute('d', path.join(' ')); +}; + +/** + * Scroll the flyout to the top. + */ +Blockly.VerticalFlyout.prototype.scrollToStart = function() { + this.scrollbar.set(0); +}; + +/** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ +Blockly.VerticalFlyout.prototype.wheel_ = function(e) { + var scrollDelta = Blockly.utils.getScrollDeltaPixels(e); + + if (scrollDelta.y) { + var metrics = this.getMetrics_(); + var pos = (metrics.viewTop - metrics.contentTop) + scrollDelta.y; + var limit = metrics.contentHeight - metrics.viewHeight; + pos = Math.min(pos, limit); + pos = Math.max(pos, 0); + this.scrollbar.set(pos); + // When the flyout moves from a wheel event, hide WidgetDiv and DropDownDiv. + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); + } + + // Don't scroll the page. + e.preventDefault(); + // Don't propagate mousewheel event (zooming). + e.stopPropagation(); +}; + +/** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ +Blockly.VerticalFlyout.prototype.layout_ = function(contents, gaps) { + this.workspace_.scale = this.targetWorkspace.scale; + var margin = this.MARGIN; + var cursorX = this.RTL ? margin : margin + this.tabWidth_; + var cursorY = margin; + + for (var i = 0, item; (item = contents[i]); i++) { + if (item.type == 'block') { + var block = item.block; + var allBlocks = block.getDescendants(false); + for (var j = 0, child; (child = allBlocks[j]); j++) { + // Mark blocks as being inside a flyout. This is used to detect and + // prevent the closure of the flyout if the user right-clicks on such a + // block. + child.isInFlyout = true; + } + block.render(); + var root = block.getSvgRoot(); + var blockHW = block.getHeightWidth(); + var moveX = block.outputConnection ? cursorX - this.tabWidth_ : cursorX; + block.moveBy(moveX, cursorY); + + var rect = this.createRect_(block, + this.RTL ? moveX - blockHW.width : moveX, cursorY, blockHW, i); + + this.addBlockListeners_(root, block, rect); + + cursorY += blockHW.height + gaps[i]; + } else if (item.type == 'button') { + this.initFlyoutButton_(item.button, cursorX, cursorY); + cursorY += item.button.height + gaps[i]; + } + } +}; + +/** + * 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 + */ +Blockly.VerticalFlyout.prototype.isDragTowardWorkspace = function( + currentDragDeltaXY) { + var dx = currentDragDeltaXY.x; + var dy = currentDragDeltaXY.y; + // Direction goes from -180 to 180, with 0 toward the right and 90 on top. + var dragDirection = Math.atan2(dy, dx) / Math.PI * 180; + + var range = this.dragAngleRange_; + // Check for left or right dragging. + if ((dragDirection < range && dragDirection > -range) || + (dragDirection < -180 + range || dragDirection > 180 - range)) { + return true; + } + return false; +}; + +/** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ +Blockly.VerticalFlyout.prototype.getClientRect = function() { + if (!this.svgGroup_) { + return null; + } + + var flyoutRect = this.svgGroup_.getBoundingClientRect(); + // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout + // area are still deleted. Must be larger than the largest screen size, + // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). + var BIG_NUM = 1000000000; + var left = flyoutRect.left; + + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + var width = flyoutRect.width; + return new Blockly.utils.Rect(-BIG_NUM, BIG_NUM, -BIG_NUM, left + width); + } else { // Right + return new Blockly.utils.Rect(-BIG_NUM, BIG_NUM, left, BIG_NUM); + } +}; + +/** + * Compute width of flyout. Position mat under each block. + * For RTL: Lay out the blocks and buttons to be right-aligned. + * @protected + */ +Blockly.VerticalFlyout.prototype.reflowInternal_ = function() { + this.workspace_.scale = this.targetWorkspace.scale; + var flyoutWidth = 0; + var blocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; (block = blocks[i]); i++) { + var width = block.getHeightWidth().width; + if (block.outputConnection) { + width -= this.tabWidth_; + } + flyoutWidth = Math.max(flyoutWidth, width); + } + for (var i = 0, button; (button = this.buttons_[i]); i++) { + flyoutWidth = Math.max(flyoutWidth, button.width); + } + flyoutWidth += this.MARGIN * 1.5 + this.tabWidth_; + flyoutWidth *= this.workspace_.scale; + flyoutWidth += Blockly.Scrollbar.scrollbarThickness; + + if (this.width_ != flyoutWidth) { + for (var i = 0, block; (block = blocks[i]); i++) { + if (this.RTL) { + // With the flyoutWidth known, right-align the blocks. + var oldX = block.getRelativeToSurfaceXY().x; + var newX = flyoutWidth / this.workspace_.scale - this.MARGIN; + if (!block.outputConnection) { + newX -= this.tabWidth_; + } + block.moveBy(newX - oldX, 0); + } + if (block.flyoutRect_) { + this.moveRectToBlock_(block.flyoutRect_, block); + } + } + if (this.RTL) { + // With the flyoutWidth known, right-align the buttons. + for (var i = 0, button; (button = this.buttons_[i]); i++) { + var y = button.getPosition().y; + var x = flyoutWidth / this.workspace_.scale - button.width - + this.MARGIN - this.tabWidth_; + button.moveTo(x, y); + } + } + + if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_ && + this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT && + !this.targetWorkspace.getToolbox()) { + // This flyout is a simple toolbox. Reposition the workspace so that (0,0) + // is in the correct position relative to the new absolute edge (ie + // toolbox edge). + this.targetWorkspace.translate( + this.targetWorkspace.scrollX + flyoutWidth, this.targetWorkspace.scrollY); + } + + // Record the width for .getMetrics_ and .position. + this.width_ = flyoutWidth; + this.position(); + } +}; + +Blockly.registry.register(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, + Blockly.registry.DEFAULT, Blockly.VerticalFlyout); diff --git a/static/js/dist/core/generator.js b/static/js/dist/core/generator.js new file mode 100644 index 0000000..b9b488d --- /dev/null +++ b/static/js/dist/core/generator.js @@ -0,0 +1,497 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Utility functions for generating executable code from + * Blockly code. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Generator'); + +goog.require('Blockly.constants'); +goog.require('Blockly.Block'); + + +/** + * Class for a code generator that translates the blocks into a language. + * @param {string} name Language name of this generator. + * @constructor + */ +Blockly.Generator = function(name) { + this.name_ = name; + this.FUNCTION_NAME_PLACEHOLDER_REGEXP_ = + new RegExp(this.FUNCTION_NAME_PLACEHOLDER_, 'g'); +}; + +/** + * Category to separate generated function names from variables and procedures. + */ +Blockly.Generator.NAME_TYPE = 'generated_function'; + +/** + * 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} + */ +Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null; + +/** + * 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} + */ +Blockly.Generator.prototype.STATEMENT_PREFIX = null; + +/** + * 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} + */ +Blockly.Generator.prototype.STATEMENT_SUFFIX = null; + +/** + * The method of indenting. Defaults to two spaces, but language generators + * may override this to increase indent or change to tabs. + * @type {string} + */ +Blockly.Generator.prototype.INDENT = ' '; + +/** + * Maximum length for a comment before wrapping. Does not account for + * indenting level. + * @type {number} + */ +Blockly.Generator.prototype.COMMENT_WRAP = 60; + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.Generator.prototype.ORDER_OVERRIDES = []; + +/** + * Whether the init method has been called. + * Generators that set this flag to false after creation and true in init + * will cause blockToCode to emit a warning if the generator has not been + * initialized. If this flag is untouched, it will have no effect. + * @type {?boolean} + */ +Blockly.Generator.prototype.isInitialized = null; + +/** + * 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. + */ +Blockly.Generator.prototype.workspaceToCode = function(workspace) { + if (!workspace) { + // Backwards compatibility from before there could be multiple workspaces. + console.warn('No workspace specified in workspaceToCode call. Guessing.'); + workspace = Blockly.getMainWorkspace(); + } + var code = []; + this.init(workspace); + var blocks = workspace.getTopBlocks(true); + for (var i = 0, block; (block = blocks[i]); i++) { + var line = this.blockToCode(block); + if (Array.isArray(line)) { + // Value blocks return tuples of code and operator order. + // Top-level blocks don't care about operator order. + line = line[0]; + } + if (line) { + if (block.outputConnection) { + // This block is a naked value. Ask the language's code generator if + // it wants to append a semicolon, or something. + line = this.scrubNakedValue(line); + if (this.STATEMENT_PREFIX && !block.suppressPrefixSuffix) { + line = this.injectId(this.STATEMENT_PREFIX, block) + line; + } + if (this.STATEMENT_SUFFIX && !block.suppressPrefixSuffix) { + line = line + this.injectId(this.STATEMENT_SUFFIX, block); + } + } + code.push(line); + } + } + code = code.join('\n'); // Blank line between each section. + code = this.finish(code); + // Final scrubbing of whitespace. + code = code.replace(/^\s+\n/, ''); + code = code.replace(/\n\s+$/, '\n'); + code = code.replace(/[ \t]+\n/g, '\n'); + return code; +}; + +// The following are some helpful functions which can be used by multiple +// languages. + +/** + * 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. + */ +Blockly.Generator.prototype.prefixLines = function(text, prefix) { + return prefix + text.replace(/(?!\n$)\n/g, '\n' + prefix); +}; + +/** + * 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. + */ +Blockly.Generator.prototype.allNestedComments = function(block) { + var comments = []; + var blocks = block.getDescendants(true); + for (var i = 0; i < blocks.length; i++) { + var comment = blocks[i].getCommentText(); + if (comment) { + comments.push(comment); + } + } + // Append an empty string to create a trailing line break when joined. + if (comments.length) { + comments.push(''); + } + return comments.join('\n'); +}; + +/** + * Generate code for the specified block (and attached blocks). + * The generator must be initialized before calling this function. + * @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. + */ +Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { + if (this.isInitialized === false) { + console.warn( + 'Generator init was not called before blockToCode was called.'); + } + if (!block) { + return ''; + } + if (!block.isEnabled()) { + // Skip past this block if it is disabled. + return opt_thisOnly ? '' : this.blockToCode(block.getNextBlock()); + } + if (block.isInsertionMarker()) { + // Skip past insertion markers. + return opt_thisOnly ? '' : this.blockToCode(block.getChildren(false)[0]); + } + + var func = this[block.type]; + if (typeof func != 'function') { + throw Error('Language "' + this.name_ + '" does not know how to generate ' + + ' code for block type "' + block.type + '".'); + } + // First argument to func.call is the value of 'this' in the generator. + // Prior to 24 September 2013 'this' was the only way to access the block. + // The current preferred method of accessing the block is through the second + // argument to func.call, which becomes the first parameter to the generator. + var code = func.call(block, block); + if (Array.isArray(code)) { + // Value blocks return tuples of code and operator order. + if (!block.outputConnection) { + throw TypeError('Expecting string from statement block: ' + block.type); + } + return [this.scrub_(block, code[0], opt_thisOnly), code[1]]; + } else if (typeof code == 'string') { + if (this.STATEMENT_PREFIX && !block.suppressPrefixSuffix) { + code = this.injectId(this.STATEMENT_PREFIX, block) + code; + } + if (this.STATEMENT_SUFFIX && !block.suppressPrefixSuffix) { + code = code + this.injectId(this.STATEMENT_SUFFIX, block); + } + return this.scrub_(block, code, opt_thisOnly); + } else if (code === null) { + // Block has handled code generation itself. + return ''; + } else { + throw SyntaxError('Invalid code generated: ' + code); + } +}; + +/** + * 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. + */ +Blockly.Generator.prototype.valueToCode = function(block, name, outerOrder) { + if (isNaN(outerOrder)) { + throw TypeError('Expecting valid order from block: ' + block.type); + } + var targetBlock = block.getInputTargetBlock(name); + if (!targetBlock) { + return ''; + } + var tuple = this.blockToCode(targetBlock); + if (tuple === '') { + // Disabled block. + return ''; + } + // Value blocks must return code and order of operations info. + // Statement blocks must only return code. + if (!Array.isArray(tuple)) { + throw TypeError('Expecting tuple from value block: ' + targetBlock.type); + } + var code = tuple[0]; + var innerOrder = tuple[1]; + if (isNaN(innerOrder)) { + throw TypeError('Expecting valid order from value block: ' + + targetBlock.type); + } + if (!code) { + return ''; + } + + // Add parentheses if needed. + var parensNeeded = false; + var outerOrderClass = Math.floor(outerOrder); + var innerOrderClass = Math.floor(innerOrder); + if (outerOrderClass <= innerOrderClass) { + if (outerOrderClass == innerOrderClass && + (outerOrderClass == 0 || outerOrderClass == 99)) { + // Don't generate parens around NONE-NONE and ATOMIC-ATOMIC pairs. + // 0 is the atomic order, 99 is the none order. No parentheses needed. + // In all known languages multiple such code blocks are not order + // sensitive. In fact in Python ('a' 'b') 'c' would fail. + } else { + // The operators outside this code are stronger than the operators + // inside this code. To prevent the code from being pulled apart, + // wrap the code in parentheses. + parensNeeded = true; + // Check for special exceptions. + for (var i = 0; i < this.ORDER_OVERRIDES.length; i++) { + if (this.ORDER_OVERRIDES[i][0] == outerOrder && + this.ORDER_OVERRIDES[i][1] == innerOrder) { + parensNeeded = false; + break; + } + } + } + } + if (parensNeeded) { + // Technically, this should be handled on a language-by-language basis. + // However all known (sane) languages use parentheses for grouping. + code = '(' + code + ')'; + } + return code; +}; + +/** + * 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. + */ +Blockly.Generator.prototype.statementToCode = function(block, name) { + var targetBlock = block.getInputTargetBlock(name); + var code = this.blockToCode(targetBlock); + // Value blocks must return code and order of operations info. + // Statement blocks must only return code. + if (typeof code != 'string') { + throw TypeError('Expecting code from statement block: ' + + (targetBlock && targetBlock.type)); + } + if (code) { + code = this.prefixLines(/** @type {string} */ (code), this.INDENT); + } + return code; +}; + +/** + * 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. + */ +Blockly.Generator.prototype.addLoopTrap = function(branch, block) { + if (this.INFINITE_LOOP_TRAP) { + branch = this.prefixLines(this.injectId(this.INFINITE_LOOP_TRAP, block), + this.INDENT) + branch; + } + if (this.STATEMENT_SUFFIX && !block.suppressPrefixSuffix) { + branch = this.prefixLines(this.injectId(this.STATEMENT_SUFFIX, block), + this.INDENT) + branch; + } + if (this.STATEMENT_PREFIX && !block.suppressPrefixSuffix) { + branch = branch + this.prefixLines(this.injectId(this.STATEMENT_PREFIX, + block), this.INDENT); + } + return branch; +}; + +/** + * 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. + */ +Blockly.Generator.prototype.injectId = function(msg, block) { + var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. + return msg.replace(/%1/g, '\'' + id + '\''); +}; + +/** + * Comma-separated list of reserved words. + * @type {string} + * @protected + */ +Blockly.Generator.prototype.RESERVED_WORDS_ = ''; + +/** + * 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. + */ +Blockly.Generator.prototype.addReservedWords = function(words) { + this.RESERVED_WORDS_ += words + ','; +}; + +/** + * 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 + */ +Blockly.Generator.prototype.FUNCTION_NAME_PLACEHOLDER_ = '{leCUI8hutHZI4480Dc}'; + +/** + * A dictionary of definitions to be printed before the code. + * @type {Object} + * @protected + */ +Blockly.Generator.prototype.definitions_; + +/** + * A dictionary mapping desired function names in definitions_ to actual + * function names (to avoid collisions with user functions). + * @type {Object} + * @protected + */ +Blockly.Generator.prototype.functionNames_; + +/** + * A database of variable names. + * @type {Blockly.Names} + * @protected + */ +Blockly.Generator.prototype.variableDB_; + +/** + * 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 + */ +Blockly.Generator.prototype.provideFunction_ = function(desiredName, code) { + if (!this.definitions_[desiredName]) { + var functionName = this.variableDB_.getDistinctName(desiredName, + Blockly.PROCEDURE_CATEGORY_NAME); + this.functionNames_[desiredName] = functionName; + var codeText = code.join('\n').replace( + this.FUNCTION_NAME_PLACEHOLDER_REGEXP_, functionName); + // Change all ' ' indents into the desired indent. + // To avoid an infinite loop of replacements, change all indents to '\0' + // character first, then replace them all with the indent. + // We are assuming that no provided functions contain a literal null char. + var oldCodeText; + while (oldCodeText != codeText) { + oldCodeText = codeText; + codeText = codeText.replace(/^(( {2})*) {2}/gm, '$1\0'); + } + codeText = codeText.replace(/\0/g, this.INDENT); + this.definitions_[desiredName] = codeText; + } + return this.functionNames_[desiredName]; +}; + +/** + * 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. + */ +Blockly.Generator.prototype.init = function(_workspace) { + // Optionally override +}; + +/** + * 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 + */ +Blockly.Generator.prototype.scrub_ = function(_block, code, _opt_thisOnly) { + // Optionally override + return code; +}; + +/** + * 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. + */ +Blockly.Generator.prototype.finish = function(code) { + // Optionally override + return code; +}; + +/** + * 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. + */ +Blockly.Generator.prototype.scrubNakedValue = function(line) { + // Optionally override + return line; +}; diff --git a/static/js/dist/core/gesture.js b/static/js/dist/core/gesture.js new file mode 100644 index 0000000..30a1faa --- /dev/null +++ b/static/js/dist/core/gesture.js @@ -0,0 +1,993 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing an in-progress gesture, usually a drag + * or a tap. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Gesture'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.blockAnimations'); +goog.require('Blockly.BlockDragger'); +goog.require('Blockly.BubbleDragger'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.Click'); +goog.require('Blockly.FlyoutDragger'); +goog.require('Blockly.navigation'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.Touch'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.WorkspaceDragger'); + +goog.requireType('Blockly.IBubble'); +goog.requireType('Blockly.IFlyout'); + + +/** + * Note: In this file "start" refers to touchstart, mousedown, and pointerstart + * events. "End" refers to touchend, mouseup, and pointerend events. + */ +// TODO: Consider touchcancel/pointercancel. + +/** + * 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 + */ +Blockly.Gesture = function(e, creatorWorkspace) { + /** + * The position of the mouse when the gesture started. Units are CSS pixels, + * with (0, 0) at the top left of the browser window (mouseEvent clientX/Y). + * @type {Blockly.utils.Coordinate} + * @private + */ + this.mouseDownXY_ = null; + + /** + * How far the mouse has moved during this drag, in pixel units. + * (0, 0) is at this.mouseDownXY_. + * @type {!Blockly.utils.Coordinate} + * @private + */ + this.currentDragDeltaXY_ = new Blockly.utils.Coordinate(0, 0); + + /** + * The bubble that the gesture started on, or null if it did not start on a + * bubble. + * @type {Blockly.IBubble} + * @private + */ + this.startBubble_ = null; + + /** + * The field that the gesture started on, or null if it did not start on a + * field. + * @type {Blockly.Field} + * @private + */ + this.startField_ = null; + + /** + * The block that the gesture started on, or null if it did not start on a + * block. + * @type {Blockly.BlockSvg} + * @private + */ + this.startBlock_ = null; + + /** + * The block that this gesture targets. If the gesture started on a + * shadow block, this is the first non-shadow parent of the block. If the + * gesture started in the flyout, this is the root block of the block group + * that was clicked or dragged. + * @type {Blockly.BlockSvg} + * @private + */ + this.targetBlock_ = null; + + /** + * 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 + */ + this.startWorkspace_ = null; + + /** + * The workspace that created this gesture. This workspace keeps a reference + * to the gesture, which will need to be cleared at deletion. + * This may be different from the start workspace. For instance, a flyout is + * a workspace, but its parent workspace manages gestures for it. + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.creatorWorkspace_ = creatorWorkspace; + + /** + * Whether the pointer has at any point moved out of the drag radius. + * A gesture that exceeds the drag radius is a drag even if it ends exactly + * at its start point. + * @type {boolean} + * @private + */ + this.hasExceededDragRadius_ = false; + + /** + * Whether the workspace is currently being dragged. + * @type {boolean} + * @private + */ + this.isDraggingWorkspace_ = false; + + /** + * Whether the block is currently being dragged. + * @type {boolean} + * @private + */ + this.isDraggingBlock_ = false; + + /** + * Whether the bubble is currently being dragged. + * @type {boolean} + * @private + */ + this.isDraggingBubble_ = false; + + /** + * The event that most recently updated this gesture. + * @type {!Event} + * @private + */ + this.mostRecentEvent_ = e; + + /** + * 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 + */ + this.onMoveWrapper_ = null; + + /** + * 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 + */ + this.onUpWrapper_ = null; + + /** + * The object tracking a bubble drag, or null if none is in progress. + * @type {Blockly.BubbleDragger} + * @private + */ + this.bubbleDragger_ = null; + + /** + * The object tracking a block drag, or null if none is in progress. + * @type {Blockly.BlockDragger} + * @private + */ + this.blockDragger_ = null; + + /** + * The object tracking a workspace or flyout workspace drag, or null if none + * is in progress. + * @type {Blockly.WorkspaceDragger} + * @private + */ + this.workspaceDragger_ = null; + + /** + * The flyout a gesture started in, if any. + * @type {Blockly.IFlyout} + * @private + */ + this.flyout_ = null; + + /** + * Boolean for sanity-checking that some code is only called once. + * @type {boolean} + * @private + */ + this.calledUpdateIsDragging_ = false; + + /** + * Boolean for sanity-checking that some code is only called once. + * @type {boolean} + * @private + */ + this.hasStarted_ = false; + + /** + * Boolean used internally to break a cycle in disposal. + * @type {boolean} + * @protected + */ + this.isEnding_ = false; + + /** + * Boolean used to indicate whether or not to heal the stack after + * disconnecting a block. + * @type {boolean} + * @private + */ + this.healStack_ = !Blockly.DRAG_STACK; +}; + +/** + * Sever all links from this object. + * @package + */ +Blockly.Gesture.prototype.dispose = function() { + Blockly.Touch.clearTouchIdentifier(); + Blockly.Tooltip.unblock(); + // Clear the owner's reference to this gesture. + this.creatorWorkspace_.clearGesture(); + + if (this.onMoveWrapper_) { + Blockly.unbindEvent_(this.onMoveWrapper_); + } + if (this.onUpWrapper_) { + Blockly.unbindEvent_(this.onUpWrapper_); + } + + if (this.blockDragger_) { + this.blockDragger_.dispose(); + } + if (this.workspaceDragger_) { + this.workspaceDragger_.dispose(); + } + if (this.bubbleDragger_) { + this.bubbleDragger_.dispose(); + } +}; + +/** + * Update internal state based on an event. + * @param {!Event} e The most recent mouse or touch event. + * @private + */ +Blockly.Gesture.prototype.updateFromEvent_ = function(e) { + var currentXY = new Blockly.utils.Coordinate(e.clientX, e.clientY); + var changed = this.updateDragDelta_(currentXY); + // Exceeded the drag radius for the first time. + if (changed) { + this.updateIsDragging_(); + Blockly.longStop_(); + } + this.mostRecentEvent_ = e; +}; + +/** + * DO MATH to set currentDragDeltaXY_ based on the most recent mouse position. + * @param {!Blockly.utils.Coordinate} currentXY The most recent mouse/pointer + * position, in pixel units, with (0, 0) at the window's top left corner. + * @return {boolean} True if the drag just exceeded the drag radius for the + * first time. + * @private + */ +Blockly.Gesture.prototype.updateDragDelta_ = function(currentXY) { + this.currentDragDeltaXY_ = Blockly.utils.Coordinate.difference( + currentXY, + /** @type {!Blockly.utils.Coordinate} */ (this.mouseDownXY_)); + + if (!this.hasExceededDragRadius_) { + var currentDragDelta = + Blockly.utils.Coordinate.magnitude(this.currentDragDeltaXY_); + + // The flyout has a different drag radius from the rest of Blockly. + var limitRadius = + this.flyout_ ? Blockly.FLYOUT_DRAG_RADIUS : Blockly.DRAG_RADIUS; + + this.hasExceededDragRadius_ = currentDragDelta > limitRadius; + return this.hasExceededDragRadius_; + } + return false; +}; + +/** + * Update this gesture to record whether a block is being dragged from the + * flyout. + * This function should be called on a mouse/touch move event the first time the + * drag radius is exceeded. It should be called no more than once per gesture. + * If a block should be dragged from the flyout this function creates the new + * block on the main workspace and updates targetBlock_ and startWorkspace_. + * @return {boolean} True if a block is being dragged from the flyout. + * @private + */ +Blockly.Gesture.prototype.updateIsDraggingFromFlyout_ = function() { + if (!this.targetBlock_) { + return false; + } + if (!this.flyout_.isBlockCreatable_(this.targetBlock_)) { + return false; + } + if (!this.flyout_.isScrollable() || + this.flyout_.isDragTowardWorkspace(this.currentDragDeltaXY_)) { + this.startWorkspace_ = this.flyout_.targetWorkspace; + this.startWorkspace_.updateScreenCalculationsIfScrolled(); + // Start the event group now, so that the same event group is used for block + // creation and block dragging. + if (!Blockly.Events.getGroup()) { + Blockly.Events.setGroup(true); + } + // The start block is no longer relevant, because this is a drag. + this.startBlock_ = null; + this.targetBlock_ = this.flyout_.createBlock(this.targetBlock_); + this.targetBlock_.select(); + return true; + } + return false; +}; + +/** + * Update this gesture to record whether a bubble is being dragged. + * This function should be called on a mouse/touch move event the first time the + * drag radius is exceeded. It should be called no more than once per gesture. + * If a bubble should be dragged this function creates the necessary + * BubbleDragger and starts the drag. + * @return {boolean} True if a bubble is being dragged. + * @private + */ +Blockly.Gesture.prototype.updateIsDraggingBubble_ = function() { + if (!this.startBubble_) { + return false; + } + + this.isDraggingBubble_ = true; + this.startDraggingBubble_(); + return true; +}; + +/** + * Update this gesture to record whether a block is being dragged. + * This function should be called on a mouse/touch move event the first time the + * drag radius is exceeded. It should be called no more than once per gesture. + * If a block should be dragged, either from the flyout or in the workspace, + * this function creates the necessary BlockDragger and starts the drag. + * @return {boolean} True if a block is being dragged. + * @private + */ +Blockly.Gesture.prototype.updateIsDraggingBlock_ = function() { + if (!this.targetBlock_) { + return false; + } + + if (this.flyout_) { + this.isDraggingBlock_ = this.updateIsDraggingFromFlyout_(); + } else if (this.targetBlock_.isMovable()) { + this.isDraggingBlock_ = true; + } + + if (this.isDraggingBlock_) { + this.startDraggingBlock_(); + return true; + } + return false; +}; + +/** + * Update this gesture to record whether a workspace is being dragged. + * This function should be called on a mouse/touch move event the first time the + * drag radius is exceeded. It should be called no more than once per gesture. + * If a workspace is being dragged this function creates the necessary + * WorkspaceDragger or FlyoutDragger and starts the drag. + * @private + */ +Blockly.Gesture.prototype.updateIsDraggingWorkspace_ = function() { + var wsMovable = this.flyout_ ? + this.flyout_.isScrollable() : + this.startWorkspace_ && this.startWorkspace_.isDraggable(); + + if (!wsMovable) { + return; + } + + if (this.flyout_) { + this.workspaceDragger_ = new Blockly.FlyoutDragger(this.flyout_); + } else { + this.workspaceDragger_ = new Blockly.WorkspaceDragger( + /** @type {!Blockly.WorkspaceSvg} */ (this.startWorkspace_)); + } + + this.isDraggingWorkspace_ = true; + this.workspaceDragger_.startDrag(); +}; + +/** + * Update this gesture to record whether anything is being dragged. + * This function should be called on a mouse/touch move event the first time the + * drag radius is exceeded. It should be called no more than once per gesture. + * @private + */ +Blockly.Gesture.prototype.updateIsDragging_ = function() { + // Sanity check. + if (this.calledUpdateIsDragging_) { + throw Error('updateIsDragging_ should only be called once per gesture.'); + } + this.calledUpdateIsDragging_ = true; + + // First check if it was a bubble drag. Bubbles always sit on top of blocks. + if (this.updateIsDraggingBubble_()) { + return; + } + // Then check if it was a block drag. + if (this.updateIsDraggingBlock_()) { + return; + } + // Then check if it's a workspace drag. + this.updateIsDraggingWorkspace_(); +}; + +/** + * Create a block dragger and start dragging the selected block. + * @private + */ +Blockly.Gesture.prototype.startDraggingBlock_ = function() { + this.blockDragger_ = new Blockly.BlockDragger( + /** @type {!Blockly.BlockSvg} */ (this.targetBlock_), + /** @type {!Blockly.WorkspaceSvg} */ (this.startWorkspace_)); + this.blockDragger_.startBlockDrag(this.currentDragDeltaXY_, this.healStack_); + this.blockDragger_.dragBlock(this.mostRecentEvent_, this.currentDragDeltaXY_); +}; + +/** + * Create a bubble dragger and start dragging the selected bubble. + * @private + */ +// TODO (fenichel): Possibly combine this and startDraggingBlock_. +Blockly.Gesture.prototype.startDraggingBubble_ = function() { + this.bubbleDragger_ = new Blockly.BubbleDragger( + /** @type {!Blockly.IBubble} */ (this.startBubble_), + /** @type {!Blockly.WorkspaceSvg} */ (this.startWorkspace_)); + this.bubbleDragger_.startBubbleDrag(); + this.bubbleDragger_.dragBubble( + this.mostRecentEvent_, this.currentDragDeltaXY_); +}; +/** + * 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 + */ +Blockly.Gesture.prototype.doStart = function(e) { + if (Blockly.utils.isTargetInput(e)) { + this.cancel(); + return; + } + this.hasStarted_ = true; + + Blockly.blockAnimations.disconnectUiStop(); + this.startWorkspace_.updateScreenCalculationsIfScrolled(); + if (this.startWorkspace_.isMutator) { + // Mutator's coordinate system could be out of date because the bubble was + // dragged, the block was moved, the parent workspace zoomed, etc. + this.startWorkspace_.resize(); + } + + // Hide chaff also hides the flyout, so don't do it if the click is in a + // flyout. + Blockly.hideChaff(!!this.flyout_); + + this.startWorkspace_.markFocused(); + this.mostRecentEvent_ = e; + + Blockly.Tooltip.block(); + + if (this.targetBlock_) { + if (!this.targetBlock_.isInFlyout && e.shiftKey && + this.targetBlock_.workspace.keyboardAccessibilityMode) { + this.creatorWorkspace_.getCursor().setCurNode( + Blockly.ASTNode.createTopNode(this.targetBlock_)); + } else { + this.targetBlock_.select(); + } + } + + if (Blockly.utils.isRightButton(e)) { + this.handleRightClick(e); + return; + } + + if ((e.type.toLowerCase() == 'touchstart' || + e.type.toLowerCase() == 'pointerdown') && + e.pointerType != 'mouse') { + Blockly.longStart(e, this); + } + + this.mouseDownXY_ = new Blockly.utils.Coordinate(e.clientX, e.clientY); + this.healStack_ = e.altKey || e.ctrlKey || e.metaKey; + + this.bindMouseEvents(e); +}; + +/** + * Bind gesture events. + * @param {!Event} e A mouse down or touch start event. + * @package + */ +Blockly.Gesture.prototype.bindMouseEvents = function(e) { + this.onMoveWrapper_ = Blockly.bindEventWithChecks_( + document, 'mousemove', null, this.handleMove.bind(this)); + this.onUpWrapper_ = Blockly.bindEventWithChecks_( + document, 'mouseup', null, this.handleUp.bind(this)); + + e.preventDefault(); + e.stopPropagation(); +}; + +/** + * Handle a mouse move or touch move event. + * @param {!Event} e A mouse move or touch move event. + * @package + */ +Blockly.Gesture.prototype.handleMove = function(e) { + this.updateFromEvent_(e); + if (this.isDraggingWorkspace_) { + this.workspaceDragger_.drag(this.currentDragDeltaXY_); + } else if (this.isDraggingBlock_) { + this.blockDragger_.dragBlock( + this.mostRecentEvent_, this.currentDragDeltaXY_); + } else if (this.isDraggingBubble_) { + this.bubbleDragger_.dragBubble( + this.mostRecentEvent_, this.currentDragDeltaXY_); + } + e.preventDefault(); + e.stopPropagation(); +}; + +/** + * Handle a mouse up or touch end event. + * @param {!Event} e A mouse up or touch end event. + * @package + */ +Blockly.Gesture.prototype.handleUp = function(e) { + this.updateFromEvent_(e); + Blockly.longStop_(); + + if (this.isEnding_) { + console.log('Trying to end a gesture recursively.'); + return; + } + this.isEnding_ = true; + // The ordering of these checks is important: drags have higher priority than + // clicks. Fields have higher priority than blocks; blocks have higher + // priority than workspaces. + // The ordering within drags does not matter, because the three types of + // dragging are exclusive. + if (this.isDraggingBubble_) { + this.bubbleDragger_.endBubbleDrag(e, this.currentDragDeltaXY_); + } else if (this.isDraggingBlock_) { + this.blockDragger_.endBlockDrag(e, this.currentDragDeltaXY_); + } else if (this.isDraggingWorkspace_) { + this.workspaceDragger_.endDrag(this.currentDragDeltaXY_); + } else if (this.isBubbleClick_()) { + // Bubbles are in front of all fields and blocks. + this.doBubbleClick_(); + } else if (this.isFieldClick_()) { + this.doFieldClick_(); + } else if (this.isBlockClick_()) { + this.doBlockClick_(); + } else if (this.isWorkspaceClick_()) { + this.doWorkspaceClick_(e); + } + + e.preventDefault(); + e.stopPropagation(); + + this.dispose(); +}; + +/** + * Cancel an in-progress gesture. If a workspace or block drag is in progress, + * end the drag at the most recent location. + * @package + */ +Blockly.Gesture.prototype.cancel = function() { + // Disposing of a block cancels in-progress drags, but dragging to a delete + // area disposes of a block and leads to recursive disposal. Break that cycle. + if (this.isEnding_) { + return; + } + Blockly.longStop_(); + if (this.isDraggingBubble_) { + this.bubbleDragger_.endBubbleDrag( + this.mostRecentEvent_, this.currentDragDeltaXY_); + } else if (this.isDraggingBlock_) { + this.blockDragger_.endBlockDrag( + this.mostRecentEvent_, this.currentDragDeltaXY_); + } else if (this.isDraggingWorkspace_) { + this.workspaceDragger_.endDrag(this.currentDragDeltaXY_); + } + this.dispose(); +}; + +/** + * Handle a real or faked right-click event by showing a context menu. + * @param {!Event} e A mouse move or touch move event. + * @package + */ +Blockly.Gesture.prototype.handleRightClick = function(e) { + if (this.targetBlock_) { + this.bringBlockToFront_(); + Blockly.hideChaff(!!this.flyout_); + this.targetBlock_.showContextMenu(e); + } else if (this.startBubble_) { + this.startBubble_.showContextMenu(e); + } else if (this.startWorkspace_ && !this.flyout_) { + Blockly.hideChaff(); + this.startWorkspace_.showContextMenu(e); + } + + // TODO: Handle right-click on a bubble. + e.preventDefault(); + e.stopPropagation(); + + this.dispose(); +}; + +/** + * 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 + */ +Blockly.Gesture.prototype.handleWsStart = function(e, ws) { + if (this.hasStarted_) { + throw Error( + 'Tried to call gesture.handleWsStart, ' + + 'but the gesture had already been started.'); + } + this.setStartWorkspace_(ws); + this.mostRecentEvent_ = e; + this.doStart(e); + if (this.startWorkspace_.keyboardAccessibilityMode) { + Blockly.navigation.setState(Blockly.navigation.STATE_WS); + } +}; + +/** + * Fires a workspace click event. + * @param {!Blockly.WorkspaceSvg} ws The workspace that a user clicks on. + * @private + */ +Blockly.Gesture.prototype.fireWorkspaceClick_ = function(ws) { + var clickEvent = new Blockly.Events.Click(null, ws.id, 'workspace'); + Blockly.Events.fire(clickEvent); +}; + +/** + * Handle a mousedown/touchstart event on a flyout. + * @param {!Event} e A mouse down or touch start event. + * @param {!Blockly.IFlyout} flyout The flyout the event hit. + * @package + */ +Blockly.Gesture.prototype.handleFlyoutStart = function(e, flyout) { + if (this.hasStarted_) { + throw Error( + 'Tried to call gesture.handleFlyoutStart, ' + + 'but the gesture had already been started.'); + } + this.setStartFlyout_(flyout); + this.handleWsStart(e, flyout.getWorkspace()); +}; + +/** + * 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 + */ +Blockly.Gesture.prototype.handleBlockStart = function(e, block) { + if (this.hasStarted_) { + throw Error( + 'Tried to call gesture.handleBlockStart, ' + + 'but the gesture had already been started.'); + } + this.setStartBlock(block); + this.mostRecentEvent_ = e; +}; + +/** + * Handle a mousedown/touchstart event on a bubble. + * @param {!Event} e A mouse down or touch start event. + * @param {!Blockly.IBubble} bubble The bubble the event hit. + * @package + */ +Blockly.Gesture.prototype.handleBubbleStart = function(e, bubble) { + if (this.hasStarted_) { + throw Error( + 'Tried to call gesture.handleBubbleStart, ' + + 'but the gesture had already been started.'); + } + this.setStartBubble(bubble); + this.mostRecentEvent_ = e; +}; + +/* Begin functions defining what actions to take to execute clicks on each type + * of target. Any developer wanting to add behaviour on clicks should modify + * only this code. */ + +/** + * Execute a bubble click. + * @private + */ +Blockly.Gesture.prototype.doBubbleClick_ = function() { + // TODO (#1673): Consistent handling of single clicks. + this.startBubble_.setFocus && this.startBubble_.setFocus(); + this.startBubble_.select && this.startBubble_.select(); +}; + +/** + * Execute a field click. + * @private + */ +Blockly.Gesture.prototype.doFieldClick_ = function() { + this.startField_.showEditor(this.mostRecentEvent_); + this.bringBlockToFront_(); +}; + +/** + * Execute a block click. + * @private + */ +Blockly.Gesture.prototype.doBlockClick_ = function() { + // Block click in an autoclosing flyout. + if (this.flyout_ && this.flyout_.autoClose) { + if (this.targetBlock_.isEnabled()) { + if (!Blockly.Events.getGroup()) { + Blockly.Events.setGroup(true); + } + var newBlock = this.flyout_.createBlock(this.targetBlock_); + newBlock.scheduleSnapAndBump(); + } + } else { + // Clicks events are on the start block, even if it was a shadow. + var event = new Blockly.Events.Click( + this.startBlock_, this.startWorkspace_.id, 'block'); + Blockly.Events.fire(event); + } + this.bringBlockToFront_(); + Blockly.Events.setGroup(false); +}; + +/** + * Execute a workspace click. When in accessibility mode shift clicking will + * move the cursor. + * @param {!Event} e A mouse up or touch end event. + * @private + */ +Blockly.Gesture.prototype.doWorkspaceClick_ = function(e) { + var ws = this.creatorWorkspace_; + if (e.shiftKey && ws.keyboardAccessibilityMode) { + var screenCoord = new Blockly.utils.Coordinate(e.clientX, e.clientY); + var wsCoord = Blockly.utils.screenToWsCoordinates(ws, screenCoord); + var wsNode = Blockly.ASTNode.createWorkspaceNode(ws, wsCoord); + ws.getCursor().setCurNode(wsNode); + } else if (Blockly.selected) { + Blockly.selected.unselect(); + } + this.fireWorkspaceClick_(this.startWorkspace_ || ws); +}; + +/* End functions defining what actions to take to execute clicks on each type + * of target. */ + +// TODO (fenichel): Move bubbles to the front. +/** + * Move the dragged/clicked block to the front of the workspace so that it is + * not occluded by other blocks. + * @private + */ +Blockly.Gesture.prototype.bringBlockToFront_ = function() { + // Blocks in the flyout don't overlap, so skip the work. + if (this.targetBlock_ && !this.flyout_) { + this.targetBlock_.bringToFront(); + } +}; + +/* Begin functions for populating a gesture at mouse down. */ + +/** + * Record the field that a gesture started on. + * @param {Blockly.Field} field The field the gesture started on. + * @package + */ +Blockly.Gesture.prototype.setStartField = function(field) { + if (this.hasStarted_) { + throw Error( + 'Tried to call gesture.setStartField, ' + + 'but the gesture had already been started.'); + } + if (!this.startField_) { + this.startField_ = field; + } +}; + +/** + * Record the bubble that a gesture started on + * @param {Blockly.IBubble} bubble The bubble the gesture started on. + * @package + */ +Blockly.Gesture.prototype.setStartBubble = function(bubble) { + if (!this.startBubble_) { + this.startBubble_ = bubble; + } +}; + +/** + * 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 + */ +Blockly.Gesture.prototype.setStartBlock = function(block) { + // If the gesture already went through a bubble, don't set the start block. + if (!this.startBlock_ && !this.startBubble_) { + this.startBlock_ = block; + if (block.isInFlyout && block != block.getRootBlock()) { + this.setTargetBlock_(block.getRootBlock()); + } else { + this.setTargetBlock_(block); + } + } +}; + +/** + * Record the block that a gesture targets, meaning the block that will be + * dragged if this turns into a drag. If this block is a shadow, that will be + * its first non-shadow parent. + * @param {Blockly.BlockSvg} block The block the gesture targets. + * @private + */ +Blockly.Gesture.prototype.setTargetBlock_ = function(block) { + if (block.isShadow()) { + this.setTargetBlock_(block.getParent()); + } else { + this.targetBlock_ = block; + } +}; + +/** + * Record the workspace that a gesture started on. + * @param {Blockly.WorkspaceSvg} ws The workspace the gesture started on. + * @private + */ +Blockly.Gesture.prototype.setStartWorkspace_ = function(ws) { + if (!this.startWorkspace_) { + this.startWorkspace_ = ws; + } +}; + +/** + * Record the flyout that a gesture started on. + * @param {Blockly.IFlyout} flyout The flyout the gesture started on. + * @private + */ +Blockly.Gesture.prototype.setStartFlyout_ = function(flyout) { + if (!this.flyout_) { + this.flyout_ = flyout; + } +}; + + +/* End functions for populating a gesture at mouse down. */ + +/* Begin helper functions defining types of clicks. Any developer wanting + * to change the definition of a click should modify only this code. */ + +/** + * Whether this gesture is a click on a bubble. This should only be called when + * ending a gesture (mouse up, touch end). + * @return {boolean} Whether this gesture was a click on a bubble. + * @private + */ +Blockly.Gesture.prototype.isBubbleClick_ = function() { + // A bubble click starts on a bubble and never escapes the drag radius. + var hasStartBubble = !!this.startBubble_; + return hasStartBubble && !this.hasExceededDragRadius_; +}; + +/** + * Whether this gesture is a click on a block. This should only be called when + * ending a gesture (mouse up, touch end). + * @return {boolean} Whether this gesture was a click on a block. + * @private + */ +Blockly.Gesture.prototype.isBlockClick_ = function() { + // A block click starts on a block, never escapes the drag radius, and is not + // a field click. + var hasStartBlock = !!this.startBlock_; + return hasStartBlock && !this.hasExceededDragRadius_ && !this.isFieldClick_(); +}; + +/** + * Whether this gesture is a click on a field. This should only be called when + * ending a gesture (mouse up, touch end). + * @return {boolean} Whether this gesture was a click on a field. + * @private + */ +Blockly.Gesture.prototype.isFieldClick_ = function() { + var fieldClickable = + this.startField_ ? this.startField_.isClickable() : false; + return fieldClickable && !this.hasExceededDragRadius_ && + (!this.flyout_ || !this.flyout_.autoClose); +}; + +/** + * Whether this gesture is a click on a workspace. This should only be called + * when ending a gesture (mouse up, touch end). + * @return {boolean} Whether this gesture was a click on a workspace. + * @private + */ +Blockly.Gesture.prototype.isWorkspaceClick_ = function() { + var onlyTouchedWorkspace = + !this.startBlock_ && !this.startBubble_ && !this.startField_; + return onlyTouchedWorkspace && !this.hasExceededDragRadius_; +}; + +/* End helper functions defining types of clicks. */ + +/** + * 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 + */ +Blockly.Gesture.prototype.isDragging = function() { + return this.isDraggingWorkspace_ || this.isDraggingBlock_ || + this.isDraggingBubble_; +}; + +/** + * 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 + */ +Blockly.Gesture.prototype.hasStarted = function() { + return this.hasStarted_; +}; + +/** + * 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 + */ +Blockly.Gesture.prototype.getInsertionMarkers = function() { + if (this.blockDragger_) { + return this.blockDragger_.getInsertionMarkers(); + } + return []; +}; + +/** + * Is a drag or other gesture currently in progress on any workspace? + * @return {boolean} True if gesture is occurring. + */ +Blockly.Gesture.inProgress = function() { + var workspaces = Blockly.Workspace.getAll(); + for (var i = 0, workspace; (workspace = workspaces[i]); i++) { + if (workspace.currentGesture_) { + return true; + } + } + return false; +}; diff --git a/static/js/dist/core/grid.js b/static/js/dist/core/grid.js new file mode 100644 index 0000000..e1b9c5d --- /dev/null +++ b/static/js/dist/core/grid.js @@ -0,0 +1,222 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object for configuring and updating a workspace grid in + * Blockly. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Grid'); + +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); + + +/** + * 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 + */ +Blockly.Grid = function(pattern, options) { + /** + * The grid's SVG pattern, created during injection. + * @type {!SVGElement} + * @private + */ + this.gridPattern_ = pattern; + + /** + * The spacing of the grid lines (in px). + * @type {number} + * @private + */ + this.spacing_ = options['spacing']; + + /** + * How long the grid lines should be (in px). + * @type {number} + * @private + */ + this.length_ = options['length']; + + /** + * The horizontal grid line, if it exists. + * @type {SVGElement} + * @private + */ + this.line1_ = /** @type {SVGElement} */ (pattern.firstChild); + + /** + * The vertical grid line, if it exists. + * @type {SVGElement} + * @private + */ + this.line2_ = this.line1_ && + (/** @type {SVGElement} */ (this.line1_.nextSibling)); + + /** + * Whether blocks should snap to the grid. + * @type {boolean} + * @private + */ + this.snapToGrid_ = options['snap']; +}; + +/** + * The scale of the grid, used to set stroke width on grid lines. + * This should always be the same as the workspace scale. + * @type {number} + * @private + */ +Blockly.Grid.prototype.scale_ = 1; + +/** + * Dispose of this grid and unlink from the DOM. + * @package + * @suppress {checkTypes} + */ +Blockly.Grid.prototype.dispose = function() { + this.gridPattern_ = null; +}; + +/** + * Whether blocks should snap to the grid, based on the initial configuration. + * @return {boolean} True if blocks should snap, false otherwise. + * @package + */ +Blockly.Grid.prototype.shouldSnap = function() { + return this.snapToGrid_; +}; + +/** + * Get the spacing of the grid points (in px). + * @return {number} The spacing of the grid points. + * @package + */ +Blockly.Grid.prototype.getSpacing = function() { + return this.spacing_; +}; + +/** + * 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 + */ +Blockly.Grid.prototype.getPatternId = function() { + return this.gridPattern_.id; +}; + +/** + * Update the grid with a new scale. + * @param {number} scale The new workspace scale. + * @package + */ +Blockly.Grid.prototype.update = function(scale) { + this.scale_ = scale; + // MSIE freaks if it sees a 0x0 pattern, so set empty patterns to 100x100. + var safeSpacing = (this.spacing_ * scale) || 100; + + this.gridPattern_.setAttribute('width', safeSpacing); + this.gridPattern_.setAttribute('height', safeSpacing); + + var half = Math.floor(this.spacing_ / 2) + 0.5; + var start = half - this.length_ / 2; + var end = half + this.length_ / 2; + + half *= scale; + start *= scale; + end *= scale; + + this.setLineAttributes_(this.line1_, scale, start, end, half, half); + this.setLineAttributes_(this.line2_, scale, half, half, start, end); +}; + +/** + * Set the attributes on one of the lines in the grid. Use this to update the + * length and stroke width of the grid lines. + * @param {SVGElement} line Which line to update. + * @param {number} width The new stroke size (in px). + * @param {number} x1 The new x start position of the line (in px). + * @param {number} x2 The new x end position of the line (in px). + * @param {number} y1 The new y start position of the line (in px). + * @param {number} y2 The new y end position of the line (in px). + * @private + */ +Blockly.Grid.prototype.setLineAttributes_ = function(line, width, + x1, x2, y1, y2) { + if (line) { + line.setAttribute('stroke-width', width); + line.setAttribute('x1', x1); + line.setAttribute('y1', y1); + line.setAttribute('x2', x2); + line.setAttribute('y2', y2); + } +}; + +/** + * 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 of the grid (in px). + * @package + */ +Blockly.Grid.prototype.moveTo = function(x, y) { + this.gridPattern_.setAttribute('x', x); + this.gridPattern_.setAttribute('y', y); + + if (Blockly.utils.userAgent.IE || Blockly.utils.userAgent.EDGE) { + // IE/Edge doesn't notice that the x/y offsets have changed. + // Force an update. + this.update(this.scale_); + } +}; + +/** + * 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 + */ +Blockly.Grid.createDom = function(rnd, gridOptions, defs) { + /* + + + + + */ + var gridPattern = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.PATTERN, + { + 'id': 'blocklyGridPattern' + rnd, + 'patternUnits': 'userSpaceOnUse' + }, defs); + if (gridOptions['length'] > 0 && gridOptions['spacing'] > 0) { + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, + {'stroke': gridOptions['colour']}, gridPattern); + if (gridOptions['length'] > 1) { + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, + {'stroke': gridOptions['colour']}, gridPattern); + } + // x1, y1, x1, x2 properties will be set later in update. + } else { + // Edge 16 doesn't handle empty patterns + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.LINE, {}, gridPattern); + } + return gridPattern; +}; diff --git a/static/js/dist/core/icon.js b/static/js/dist/core/icon.js new file mode 100644 index 0000000..506915f --- /dev/null +++ b/static/js/dist/core/icon.js @@ -0,0 +1,206 @@ +/** + * @license + * Copyright 2013 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object representing an icon on a block. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Icon'); + +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.utils.Svg'); + + +/** + * Class for an icon. + * @param {Blockly.BlockSvg} block The block associated with this icon. + * @constructor + * @abstract + */ +Blockly.Icon = function(block) { + /** + * The block this icon is attached to. + * @type {Blockly.BlockSvg} + * @protected + */ + this.block_ = block; + + /** + * The icon SVG group. + * @type {?SVGGElement} + */ + this.iconGroup_ = null; +}; + +/** + * Does this icon get hidden when the block is collapsed. + */ +Blockly.Icon.prototype.collapseHidden = true; + +/** + * Height and width of icons. + */ +Blockly.Icon.prototype.SIZE = 17; + +/** + * Bubble UI (if visible). + * @type {Blockly.Bubble} + * @protected + */ +Blockly.Icon.prototype.bubble_ = null; + +/** + * Absolute coordinate of icon's center. + * @type {Blockly.utils.Coordinate} + * @protected + */ +Blockly.Icon.prototype.iconXY_ = null; + +/** + * Create the icon on the block. + */ +Blockly.Icon.prototype.createIcon = function() { + if (this.iconGroup_) { + // Icon already exists. + return; + } + /* Here's the markup that will be generated: + + ... + + */ + this.iconGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, + {'class': 'blocklyIconGroup'}, null); + if (this.block_.isInFlyout) { + Blockly.utils.dom.addClass( + /** @type {!Element} */ (this.iconGroup_), 'blocklyIconGroupReadonly'); + } + this.drawIcon_(this.iconGroup_); + + this.block_.getSvgRoot().appendChild(this.iconGroup_); + Blockly.bindEventWithChecks_( + this.iconGroup_, 'mouseup', this, this.iconClick_); + this.updateEditable(); +}; + +/** + * Dispose of this icon. + */ +Blockly.Icon.prototype.dispose = function() { + // Dispose of and unlink the icon. + Blockly.utils.dom.removeNode(this.iconGroup_); + this.iconGroup_ = null; + // Dispose of and unlink the bubble. + this.setVisible(false); + this.block_ = null; +}; + +/** + * Add or remove the UI indicating if this icon may be clicked or not. + */ +Blockly.Icon.prototype.updateEditable = function() { + // No-op on the base class. +}; + +/** + * Is the associated bubble visible? + * @return {boolean} True if the bubble is visible. + */ +Blockly.Icon.prototype.isVisible = function() { + return !!this.bubble_; +}; + +/** + * Clicking on the icon toggles if the bubble is visible. + * @param {!Event} e Mouse click event. + * @protected + */ +Blockly.Icon.prototype.iconClick_ = function(e) { + if (this.block_.workspace.isDragging()) { + // Drag operation is concluding. Don't open the editor. + return; + } + if (!this.block_.isInFlyout && !Blockly.utils.isRightButton(e)) { + this.setVisible(!this.isVisible()); + } +}; + +/** + * Change the colour of the associated bubble to match its block. + */ +Blockly.Icon.prototype.applyColour = function() { + if (this.isVisible()) { + this.bubble_.setColour(this.block_.style.colourPrimary); + } +}; + +/** + * Notification that the icon has moved. Update the arrow accordingly. + * @param {!Blockly.utils.Coordinate} xy Absolute location in workspace coordinates. + */ +Blockly.Icon.prototype.setIconLocation = function(xy) { + this.iconXY_ = xy; + if (this.isVisible()) { + this.bubble_.setAnchorLocation(xy); + } +}; + +/** + * Notification that the icon has moved, but we don't really know where. + * Recompute the icon's location from scratch. + */ +Blockly.Icon.prototype.computeIconLocation = function() { + // Find coordinates for the centre of the icon and update the arrow. + var blockXY = this.block_.getRelativeToSurfaceXY(); + var iconXY = Blockly.utils.getRelativeXY( + /** @type {!SVGElement} */ (this.iconGroup_)); + var newXY = new Blockly.utils.Coordinate( + blockXY.x + iconXY.x + this.SIZE / 2, + blockXY.y + iconXY.y + this.SIZE / 2); + if (!Blockly.utils.Coordinate.equals(this.getIconLocation(), newXY)) { + this.setIconLocation(newXY); + } +}; + +/** + * 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. + */ +Blockly.Icon.prototype.getIconLocation = function() { + return this.iconXY_; +}; + +/** + * 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. + */ +// TODO (#2562): Remove getCorrectedSize. +Blockly.Icon.prototype.getCorrectedSize = function() { + return new Blockly.utils.Size( + Blockly.Icon.prototype.SIZE, Blockly.Icon.prototype.SIZE - 2); +}; + +/** + * Draw the icon. + * @param {!Element} group The icon group. + * @protected + */ +Blockly.Icon.prototype.drawIcon_; + +/** + * Show or hide the icon. + * @param {boolean} visible True if the icon should be visible. + */ +Blockly.Icon.prototype.setVisible; diff --git a/static/js/dist/core/inject.js b/static/js/dist/core/inject.js new file mode 100644 index 0000000..812ddcd --- /dev/null +++ b/static/js/dist/core/inject.js @@ -0,0 +1,482 @@ +/** + * @license + * Copyright 2011 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Functions for injecting Blockly into a web page. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.inject'); + +goog.require('Blockly.BlockDragSurfaceSvg'); +goog.require('Blockly.Css'); +goog.require('Blockly.DropDownDiv'); +goog.require('Blockly.Events'); +goog.require('Blockly.Grid'); +goog.require('Blockly.Msg'); +goog.require('Blockly.Options'); +goog.require('Blockly.ScrollbarPair'); +goog.require('Blockly.Tooltip'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.WorkspaceDragSurfaceSvg'); +goog.require('Blockly.WorkspaceSvg'); + +goog.requireType('Blockly.utils.Metrics'); + + +/** + * 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. + */ +Blockly.inject = function(container, opt_options) { + Blockly.checkBlockColourConstants(); + + if (typeof container == 'string') { + container = document.getElementById(container) || + document.querySelector(container); + } + // Verify that the container is in document. + if (!container || !Blockly.utils.dom.containsNode(document, container)) { + throw Error('Error: container is not in current document.'); + } + var options = new Blockly.Options(opt_options || + (/** @type {!Blockly.BlocklyOptions} */ ({}))); + var subContainer = document.createElement('div'); + subContainer.className = 'injectionDiv'; + subContainer.tabIndex = 0; + Blockly.utils.aria.setState(subContainer, + Blockly.utils.aria.State.LABEL, Blockly.Msg['WORKSPACE_ARIA_LABEL']); + + container.appendChild(subContainer); + var svg = Blockly.createDom_(subContainer, options); + + // Create surfaces for dragging things. These are optimizations + // so that the browser does not repaint during the drag. + var blockDragSurface = new Blockly.BlockDragSurfaceSvg(subContainer); + var workspaceDragSurface = new Blockly.WorkspaceDragSurfaceSvg(subContainer); + + var workspace = Blockly.createMainWorkspace_(svg, options, blockDragSurface, + workspaceDragSurface); + + Blockly.init_(workspace); + + // Keep focus on the first workspace so entering keyboard navigation looks correct. + Blockly.mainWorkspace = workspace; + + Blockly.svgResize(workspace); + + subContainer.addEventListener('focusin', function() { + Blockly.mainWorkspace = workspace; + }); + + return workspace; +}; + +/** + * Create the SVG image. + * @param {!Element} container Containing element. + * @param {!Blockly.Options} options Dictionary of options. + * @return {!Element} Newly created SVG image. + * @private + */ +Blockly.createDom_ = function(container, options) { + // Sadly browsers (Chrome vs Firefox) are currently inconsistent in laying + // out content in RTL mode. Therefore Blockly forces the use of LTR, + // then manually positions content in RTL as needed. + container.setAttribute('dir', 'LTR'); + + // Load CSS. + Blockly.Css.inject(options.hasCss, options.pathToMedia); + + // Build the SVG DOM. + /* + + ... + + */ + var svg = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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': 'blocklySvg', + 'tabindex': '0' + }, container); + /* + + ... filters go here ... + + */ + var defs = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.DEFS, {}, svg); + // Each filter/pattern needs a unique ID for the case of multiple Blockly + // instances on a page. Browser behaviour becomes undefined otherwise. + // https://neil.fraser.name/news/2015/11/01/ + var rnd = String(Math.random()).substring(2); + + options.gridPattern = Blockly.Grid.createDom(rnd, options.gridOptions, defs); + return svg; +}; + +/** + * Create a main workspace and add it to the SVG. + * @param {!Element} svg SVG element with pattern defined. + * @param {!Blockly.Options} options Dictionary of options. + * @param {!Blockly.BlockDragSurfaceSvg} blockDragSurface Drag surface SVG + * for the blocks. + * @param {!Blockly.WorkspaceDragSurfaceSvg} workspaceDragSurface Drag surface + * SVG for the workspace. + * @return {!Blockly.WorkspaceSvg} Newly created main workspace. + * @private + */ +Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, + workspaceDragSurface) { + options.parentWorkspace = null; + var mainWorkspace = + new Blockly.WorkspaceSvg(options, blockDragSurface, workspaceDragSurface); + var wsOptions = mainWorkspace.options; + mainWorkspace.scale = wsOptions.zoomOptions.startScale; + svg.appendChild(mainWorkspace.createDom('blocklyMainBackground')); + + // Set the theme name and renderer name onto the injection div. + Blockly.utils.dom.addClass(mainWorkspace.getInjectionDiv(), + mainWorkspace.getRenderer().getClassName()); + Blockly.utils.dom.addClass(mainWorkspace.getInjectionDiv(), + mainWorkspace.getTheme().getClassName()); + + if (!wsOptions.hasCategories && wsOptions.languageTree) { + // Add flyout as an that is a sibling of the workspace svg. + var flyout = mainWorkspace.addFlyout(Blockly.utils.Svg.SVG); + Blockly.utils.dom.insertAfter(flyout, svg); + } + if (wsOptions.hasTrashcan) { + mainWorkspace.addTrashcan(); + } + if (wsOptions.zoomOptions && wsOptions.zoomOptions.controls) { + mainWorkspace.addZoomControls(); + } + // Register the workspace svg as a UI component. + mainWorkspace.getThemeManager().subscribe(svg, 'workspaceBackgroundColour', + 'background-color'); + + // A null translation will also apply the correct initial scale. + mainWorkspace.translate(0, 0); + + if (!wsOptions.readOnly && !mainWorkspace.isMovable()) { + // Helper function for the workspaceChanged callback. + // TODO (#2300): Move metrics math back to the WorkspaceSvg. + var getWorkspaceMetrics = function() { + var workspaceMetrics = Object.create(null); + var defaultMetrics = mainWorkspace.getMetrics(); + var scale = mainWorkspace.scale; + + workspaceMetrics.RTL = mainWorkspace.RTL; + + // Get the view metrics in workspace units. + workspaceMetrics.viewLeft = defaultMetrics.viewLeft / scale; + workspaceMetrics.viewTop = defaultMetrics.viewTop / scale; + workspaceMetrics.viewRight = + (defaultMetrics.viewLeft + defaultMetrics.viewWidth) / scale; + workspaceMetrics.viewBottom = + (defaultMetrics.viewTop + defaultMetrics.viewHeight) / scale; + + // Get the exact content metrics (in workspace units), even if the + // content is bounded. + if (mainWorkspace.isContentBounded()) { + // Already in workspace units, no need to divide by scale. + var blocksBoundingBox = mainWorkspace.getBlocksBoundingBox(); + workspaceMetrics.contentLeft = blocksBoundingBox.left; + workspaceMetrics.contentTop = blocksBoundingBox.top; + workspaceMetrics.contentRight = blocksBoundingBox.right; + workspaceMetrics.contentBottom = blocksBoundingBox.bottom; + } else { + workspaceMetrics.contentLeft = defaultMetrics.contentLeft / scale; + workspaceMetrics.contentTop = defaultMetrics.contentTop / scale; + workspaceMetrics.contentRight = + (defaultMetrics.contentLeft + defaultMetrics.contentWidth) / scale; + workspaceMetrics.contentBottom = + (defaultMetrics.contentTop + defaultMetrics.contentHeight) / scale; + } + + return workspaceMetrics; + }; + + var getObjectMetrics = function(object) { + var objectMetrics = object.getBoundingRectangle(); + objectMetrics.height = objectMetrics.bottom - objectMetrics.top; + objectMetrics.width = objectMetrics.right - objectMetrics.left; + return objectMetrics; + }; + + var bumpObjects = function(e) { + // We always check isMovable_ again because the original + // "not movable" state of isMovable_ could have been changed. + if (!mainWorkspace.isDragging() && !mainWorkspace.isMovable() && + (Blockly.Events.BUMP_EVENTS.indexOf(e.type) != -1)) { + var metrics = getWorkspaceMetrics(); + if (metrics.contentTop < metrics.viewTop || + metrics.contentBottom > metrics.viewBottom || + metrics.contentLeft < metrics.viewLeft || + metrics.contentRight > metrics.viewRight) { + + // Handle undo. + var oldGroup = null; + if (e) { + oldGroup = Blockly.Events.getGroup(); + Blockly.Events.setGroup(e.group); + } + + switch (e.type) { + case Blockly.Events.BLOCK_CREATE: + case Blockly.Events.BLOCK_MOVE: + var object = mainWorkspace.getBlockById(e.blockId); + if (object) { + object = object.getRootBlock(); + } + break; + case Blockly.Events.COMMENT_CREATE: + case Blockly.Events.COMMENT_MOVE: + var object = mainWorkspace.getCommentById(e.commentId); + break; + } + if (object) { + var objectMetrics = getObjectMetrics(object); + + // The idea is to find the region of valid coordinates for the top + // left corner of the object, and then clamp the object's + // top left corner within that region. + + // The top of the object should always be at or below the top of + // the workspace. + var topClamp = metrics.viewTop; + // The top of the object should ideally be positioned so that + // the bottom of the object is not below the bottom of the + // workspace. + var bottomClamp = metrics.viewBottom - objectMetrics.height; + // If the object is taller than the workspace we want to + // top-align the block, which means setting the bottom clamp to + // match. + bottomClamp = Math.max(topClamp, bottomClamp); + + var newYPosition = Blockly.utils.math.clamp( + topClamp, objectMetrics.top, bottomClamp); + var deltaY = newYPosition - objectMetrics.top; + + // Note: Even in RTL mode the "anchor" of the object is the + // top-left corner of the object. + + // The left edge of the object should ideally be positioned at + // or to the right of the left edge of the workspace. + var leftClamp = metrics.viewLeft; + // The left edge of the object should ideally be positioned so + // that the right of the object is not outside the workspace bounds. + var rightClamp = metrics.viewRight - objectMetrics.width; + if (metrics.RTL) { + // If the object is wider than the workspace and we're in RTL + // mode we want to right-align the block, which means setting + // the left clamp to match. + leftClamp = Math.min(rightClamp, leftClamp); + } else { + // If the object is wider than the workspace and we're in LTR + // mode we want to left-align the block, which means setting + // the right clamp to match. + rightClamp = Math.max(leftClamp, rightClamp); + } + + var newXPosition = Blockly.utils.math.clamp( + leftClamp, objectMetrics.left, rightClamp); + var deltaX = newXPosition - objectMetrics.left; + + object.moveBy(deltaX, deltaY); + } + if (e) { + if (!e.group && object) { + console.warn('Moved object in bounds but there was no' + + ' event group. This may break undo.'); + } + if (oldGroup !== null) { + Blockly.Events.setGroup(oldGroup); + } + } + } + } + }; + mainWorkspace.addChangeListener(bumpObjects); + } + + // The SVG is now fully assembled. + Blockly.svgResize(mainWorkspace); + Blockly.WidgetDiv.createDom(); + Blockly.DropDownDiv.createDom(); + Blockly.Tooltip.createDom(); + return mainWorkspace; +}; + +/** + * Initialize Blockly with various handlers. + * @param {!Blockly.WorkspaceSvg} mainWorkspace Newly created main workspace. + * @private + */ +Blockly.init_ = function(mainWorkspace) { + var options = mainWorkspace.options; + var svg = mainWorkspace.getParentSvg(); + + // Suppress the browser's context menu. + Blockly.bindEventWithChecks_( + /** @type {!Element} */ (svg.parentNode), 'contextmenu', null, + function(e) { + if (!Blockly.utils.isTargetInput(e)) { + e.preventDefault(); + } + }); + + var workspaceResizeHandler = Blockly.bindEventWithChecks_(window, 'resize', + null, + function() { + Blockly.hideChaff(true); + Blockly.svgResize(mainWorkspace); + }); + mainWorkspace.setResizeHandlerWrapper(workspaceResizeHandler); + + Blockly.inject.bindDocumentEvents_(); + + if (options.languageTree) { + var toolbox = mainWorkspace.getToolbox(); + var flyout = mainWorkspace.getFlyout(true); + if (toolbox) { + toolbox.init(); + } else if (flyout) { + // Build a fixed flyout with the root blocks. + flyout.init(mainWorkspace); + flyout.show(options.languageTree); + if (typeof flyout.scrollToStart == 'function') { + flyout.scrollToStart(); + } + } + } + + var verticalSpacing = Blockly.Scrollbar.scrollbarThickness; + if (options.hasTrashcan) { + verticalSpacing = mainWorkspace.trashcan.init(verticalSpacing); + } + if (options.zoomOptions && options.zoomOptions.controls) { + mainWorkspace.zoomControls_.init(verticalSpacing); + } + + if (options.moveOptions && options.moveOptions.scrollbars) { + mainWorkspace.scrollbar = new Blockly.ScrollbarPair(mainWorkspace); + mainWorkspace.scrollbar.resize(); + } else { + mainWorkspace.setMetrics({x: 0.5, y: 0.5}); + } + + // Load the sounds. + if (options.hasSounds) { + Blockly.inject.loadSounds_(options.pathToMedia, mainWorkspace); + } +}; + +/** + * Bind document events, but only once. Destroying and reinjecting Blockly + * should not bind again. + * Bind events for scrolling the workspace. + * Most of these events should be bound to the SVG's surface. + * However, 'mouseup' has to be on the whole document so that a block dragged + * out of bounds and released will know that it has been released. + * Also, 'keydown' has to be on the whole document since the browser doesn't + * understand a concept of focus on the SVG image. + * @private + */ +Blockly.inject.bindDocumentEvents_ = function() { + if (!Blockly.documentEventsBound_) { + Blockly.bindEventWithChecks_(document, 'scroll', null, function() { + var workspaces = Blockly.Workspace.getAll(); + for (var i = 0, workspace; (workspace = workspaces[i]); i++) { + if (workspace.updateInverseScreenCTM) { + workspace.updateInverseScreenCTM(); + } + } + }); + Blockly.bindEventWithChecks_(document, 'keydown', null, Blockly.onKeyDown); + // longStop needs to run to stop the context menu from showing up. It + // should run regardless of what other touch event handlers have run. + Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); + Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); + // Some iPad versions don't fire resize after portrait to landscape change. + if (Blockly.utils.userAgent.IPAD) { + Blockly.bindEventWithChecks_(window, 'orientationchange', document, + function() { + // TODO (#397): Fix for multiple Blockly workspaces. + Blockly.svgResize(/** @type {!Blockly.WorkspaceSvg} */ + (Blockly.getMainWorkspace())); + }); + } + } + Blockly.documentEventsBound_ = true; +}; + +/** + * Load sounds for the given workspace. + * @param {string} pathToMedia The path to the media directory. + * @param {!Blockly.Workspace} workspace The workspace to load sounds for. + * @private + */ +Blockly.inject.loadSounds_ = function(pathToMedia, workspace) { + var audioMgr = workspace.getAudioManager(); + audioMgr.load( + [ + pathToMedia + 'click.mp3', + pathToMedia + 'click.wav', + pathToMedia + 'click.ogg' + ], 'click'); + audioMgr.load( + [ + pathToMedia + 'disconnect.wav', + pathToMedia + 'disconnect.mp3', + pathToMedia + 'disconnect.ogg' + ], 'disconnect'); + audioMgr.load( + [ + pathToMedia + 'delete.mp3', + pathToMedia + 'delete.ogg', + pathToMedia + 'delete.wav' + ], 'delete'); + + // Bind temporary hooks that preload the sounds. + var soundBinds = []; + var unbindSounds = function() { + while (soundBinds.length) { + Blockly.unbindEvent_(soundBinds.pop()); + } + audioMgr.preload(); + }; + + // These are bound on mouse/touch events with Blockly.bindEventWithChecks_, so + // they restrict the touch identifier that will be recognized. But this is + // really something that happens on a click, not a drag, so that's not + // necessary. + + // Android ignores any sound not loaded as a result of a user action. + soundBinds.push( + Blockly.bindEventWithChecks_(document, 'mousemove', null, unbindSounds, + true)); + soundBinds.push( + Blockly.bindEventWithChecks_(document, 'touchstart', null, unbindSounds, + true)); +}; diff --git a/static/js/dist/core/input.js b/static/js/dist/core/input.js new file mode 100644 index 0000000..253160a --- /dev/null +++ b/static/js/dist/core/input.js @@ -0,0 +1,297 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object representing an input (value, statement, or dummy). + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Input'); + +goog.require('Blockly.Connection'); +goog.require('Blockly.constants'); +goog.require('Blockly.FieldLabel'); + + +/** + * 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 + */ +Blockly.Input = function(type, name, block, connection) { + if (type != Blockly.DUMMY_INPUT && !name) { + throw Error('Value inputs and statement inputs must have non-empty name.'); + } + /** @type {number} */ + this.type = type; + /** @type {string} */ + this.name = name; + /** + * @type {!Blockly.Block} + * @private + */ + this.sourceBlock_ = block; + /** @type {Blockly.Connection} */ + this.connection = connection; + /** @type {!Array.} */ + this.fieldRow = []; +}; + +/** + * Alignment of input's fields (left, right or centre). + * @type {number} + */ +Blockly.Input.prototype.align = Blockly.ALIGN_LEFT; + +/** + * Is the input visible? + * @type {boolean} + * @private + */ +Blockly.Input.prototype.visible_ = true; + +/** + * Get the source block for this input. + * @return {Blockly.Block} The source block, or null if there is none. + */ +Blockly.Input.prototype.getSourceBlock = function() { + return this.sourceBlock_; +}; + +/** + * 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). + */ +Blockly.Input.prototype.appendField = function(field, opt_name) { + this.insertFieldAt(this.fieldRow.length, field, opt_name); + return this; +}; + +/** + * 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. + */ +Blockly.Input.prototype.insertFieldAt = function(index, field, opt_name) { + if (index < 0 || index > this.fieldRow.length) { + throw Error('index ' + index + ' out of bounds.'); + } + // Falsy field values don't generate a field, unless the field is an empty + // string and named. + if (!field && !(field == '' && opt_name)) { + return index; + } + + // Generate a FieldLabel when given a plain text field. + if (typeof field == 'string') { + field = new Blockly.FieldLabel(/** @type {string} */ (field)); + } + + field.setSourceBlock(this.sourceBlock_); + if (this.sourceBlock_.rendered) { + field.init(); + field.applyColour(); + } + field.name = opt_name; + field.setVisible(this.isVisible()); + + var fieldDropdown = /** @type {Blockly.FieldDropdown} */ (field); + if (fieldDropdown.prefixField) { + // Add any prefix. + index = this.insertFieldAt(index, fieldDropdown.prefixField); + } + // Add the field to the field row. + this.fieldRow.splice(index, 0, field); + ++index; + if (fieldDropdown.suffixField) { + // Add any suffix. + index = this.insertFieldAt(index, fieldDropdown.suffixField); + } + + if (this.sourceBlock_.rendered) { + this.sourceBlock_ = /** @type {!Blockly.BlockSvg} */ (this.sourceBlock_); + this.sourceBlock_.render(); + // Adding a field will cause the block to change shape. + this.sourceBlock_.bumpNeighbours(); + } + return index; +}; + +/** + * Remove a field from this input. + * @param {string} name The name of the field. + * @param {boolean=} opt_quiet True to prevent an error if field is not present. + * @return {boolean} True if operation succeeds, false if field is not present + * and opt_quiet is true. + * @throws {Error} if the field is not present and opt_quiet is false. + */ +Blockly.Input.prototype.removeField = function(name, opt_quiet) { + for (var i = 0, field; (field = this.fieldRow[i]); i++) { + if (field.name === name) { + field.dispose(); + this.fieldRow.splice(i, 1); + if (this.sourceBlock_.rendered) { + this.sourceBlock_ = /** @type {!Blockly.BlockSvg} */ (this.sourceBlock_); + this.sourceBlock_.render(); + // Removing a field will cause the block to change shape. + this.sourceBlock_.bumpNeighbours(); + } + return true; + } + } + if (opt_quiet) { + return false; + } else { + throw Error('Field "' + name + '" not found.'); + } +}; + +/** + * Gets whether this input is visible or not. + * @return {boolean} True if visible. + */ +Blockly.Input.prototype.isVisible = function() { + return this.visible_; +}; + +/** + * 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 + */ +Blockly.Input.prototype.setVisible = function(visible) { + // Note: Currently there are only unit tests for block.setCollapsed() + // because this function is package. If this function goes back to being a + // public API tests (lots of tests) should be added. + var renderList = []; + if (this.visible_ == visible) { + return renderList; + } + this.visible_ = visible; + + for (var y = 0, field; (field = this.fieldRow[y]); y++) { + field.setVisible(visible); + } + if (this.connection) { + this.connection = + /** @type {!Blockly.RenderedConnection} */ (this.connection); + // Has a connection. + if (visible) { + renderList = this.connection.startTrackingAll(); + } else { + this.connection.stopTrackingAll(); + } + var child = this.connection.targetBlock(); + if (child) { + child.getSvgRoot().style.display = visible ? 'block' : 'none'; + } + } + return renderList; +}; + +/** + * Mark all fields on this input as dirty. + * @package + */ +Blockly.Input.prototype.markDirty = function() { + for (var y = 0, field; (field = this.fieldRow[y]); y++) { + field.markDirty(); + } +}; + +/** + * 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). + */ +Blockly.Input.prototype.setCheck = function(check) { + if (!this.connection) { + throw Error('This input does not have a connection.'); + } + this.connection.setCheck(check); + return this; +}; + +/** + * 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). + */ +Blockly.Input.prototype.setAlign = function(align) { + this.align = align; + if (this.sourceBlock_.rendered) { + this.sourceBlock_ = /** @type {!Blockly.BlockSvg} */ (this.sourceBlock_); + this.sourceBlock_.render(); + } + return this; +}; + +/** + * Changes the connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + * @return {Blockly.Input} The input being modified (to allow chaining). + */ +Blockly.Input.prototype.setShadowDom = function(shadow) { + if (!this.connection) { + throw Error('This input does not have a connection.'); + } + this.connection.setShadowDom(shadow); + return this; +}; + +/** + * Returns the xml representation of the connection's shadow block. + * @return {Element} Shadow DOM representation of a block or null. + */ +Blockly.Input.prototype.getShadowDom = function() { + if (!this.connection) { + throw Error('This input does not have a connection.'); + } + return this.connection.getShadowDom(); +}; + +/** + * Initialize the fields on this input. + */ +Blockly.Input.prototype.init = function() { + if (!this.sourceBlock_.workspace.rendered) { + return; // Headless blocks don't need fields initialized. + } + for (var i = 0; i < this.fieldRow.length; i++) { + this.fieldRow[i].init(); + } +}; + +/** + * Sever all links to this input. + * @suppress {checkTypes} + */ +Blockly.Input.prototype.dispose = function() { + for (var i = 0, field; (field = this.fieldRow[i]); i++) { + field.dispose(); + } + if (this.connection) { + this.connection.dispose(); + } + this.sourceBlock_ = null; +}; diff --git a/static/js/dist/core/insertion_marker_manager.js b/static/js/dist/core/insertion_marker_manager.js new file mode 100644 index 0000000..661aa5f --- /dev/null +++ b/static/js/dist/core/insertion_marker_manager.js @@ -0,0 +1,701 @@ +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Class that controls updates to connections during drags. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.InsertionMarkerManager'); + +goog.require('Blockly.blockAnimations'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); + + +/** + * 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 + */ +Blockly.InsertionMarkerManager = function(block) { + Blockly.selected = block; + + /** + * The top block in the stack being dragged. + * Does not change during a drag. + * @type {!Blockly.BlockSvg} + * @private + */ + this.topBlock_ = block; + + /** + * The workspace on which these connections are being dragged. + * Does not change during a drag. + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = block.workspace; + + /** + * The last connection on the stack, if it's not the last connection on the + * first block. + * Set in initAvailableConnections, if at all. + * @type {Blockly.RenderedConnection} + * @private + */ + this.lastOnStack_ = null; + + /** + * The insertion marker corresponding to the last block in the stack, if + * that's not the same as the first block in the stack. + * Set in initAvailableConnections, if at all + * @type {Blockly.BlockSvg} + * @private + */ + this.lastMarker_ = null; + + /** + * The insertion marker that shows up between blocks to show where a block + * would go if dropped immediately. + * @type {Blockly.BlockSvg} + * @private + */ + this.firstMarker_ = this.createMarkerBlock_(this.topBlock_); + + /** + * The connection that this block would connect to if released immediately. + * Updated on every mouse move. + * This is not on any of the blocks that are being dragged. + * @type {Blockly.RenderedConnection} + * @private + */ + this.closestConnection_ = null; + + /** + * The connection that would connect to this.closestConnection_ if this block + * were released immediately. + * Updated on every mouse move. + * This is on the top block that is being dragged or the last block in the + * dragging stack. + * @type {Blockly.RenderedConnection} + * @private + */ + this.localConnection_ = null; + + /** + * Whether the block would be deleted if it were dropped immediately. + * Updated on every mouse move. + * @type {boolean} + * @private + */ + this.wouldDeleteBlock_ = false; + + /** + * Connection on the insertion marker block that corresponds to + * this.localConnection_ on the currently dragged block. + * @type {Blockly.RenderedConnection} + * @private + */ + this.markerConnection_ = null; + + /** + * The block that currently has an input being highlighted, or null. + * @type {Blockly.BlockSvg} + * @private + */ + this.highlightedBlock_ = null; + + /** + * The block being faded to indicate replacement, or null. + * @type {Blockly.BlockSvg} + * @private + */ + this.fadedBlock_ = null; + + /** + * The connections on the dragging blocks that are available to connect to + * other blocks. This includes all open connections on the top block, as well + * as the last connection on the block stack. + * Does not change during a drag. + * @type {!Array.} + * @private + */ + this.availableConnections_ = this.initAvailableConnections_(); +}; + +/** + * An enum describing different kinds of previews the InsertionMarkerManager + * could display. + * @enum {number} + */ +Blockly.InsertionMarkerManager.PREVIEW_TYPE = { + INSERTION_MARKER: 0, + INPUT_OUTLINE: 1, + REPLACEMENT_FADE: 2, +}; + +/** + * Sever all links from this object. + * @package + */ +Blockly.InsertionMarkerManager.prototype.dispose = function() { + this.availableConnections_.length = 0; + + Blockly.Events.disable(); + try { + if (this.firstMarker_) { + this.firstMarker_.dispose(); + } + if (this.lastMarker_) { + this.lastMarker_.dispose(); + } + } finally { + Blockly.Events.enable(); + } +}; + +/** + * Update the available connections for the top block. These connections can + * change if a block is unplugged and the stack is healed. + * @package + */ +Blockly.InsertionMarkerManager.prototype.updateAvailableConnections = function() { + this.availableConnections_ = this.initAvailableConnections_(); +}; + +/** + * 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 + */ +Blockly.InsertionMarkerManager.prototype.wouldDeleteBlock = function() { + return this.wouldDeleteBlock_; +}; + +/** + * 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 + */ +Blockly.InsertionMarkerManager.prototype.wouldConnectBlock = function() { + return !!this.closestConnection_; +}; + +/** + * Connect to the closest connection and render the results. + * This should be called at the end of a drag. + * @package + */ +Blockly.InsertionMarkerManager.prototype.applyConnections = function() { + if (this.closestConnection_) { + // Don't fire events for insertion markers. + Blockly.Events.disable(); + this.hidePreview_(); + Blockly.Events.enable(); + // Connect two blocks together. + this.localConnection_.connect(this.closestConnection_); + if (this.topBlock_.rendered) { + // Trigger a connection animation. + // Determine which connection is inferior (lower in the source stack). + var inferiorConnection = this.localConnection_.isSuperior() ? + this.closestConnection_ : this.localConnection_; + Blockly.blockAnimations.connectionUiEffect( + inferiorConnection.getSourceBlock()); + // Bring the just-edited stack to the front. + var rootBlock = this.topBlock_.getRootBlock(); + rootBlock.bringToFront(); + } + } +}; + +/** + * Update 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 + */ +Blockly.InsertionMarkerManager.prototype.update = function(dxy, deleteArea) { + var candidate = this.getCandidate_(dxy); + + this.wouldDeleteBlock_ = this.shouldDelete_(candidate, deleteArea); + var shouldUpdate = this.wouldDeleteBlock_ || + this.shouldUpdatePreviews_(candidate, dxy); + + if (shouldUpdate) { + // Don't fire events for insertion marker creation or movement. + Blockly.Events.disable(); + this.maybeHidePreview_(candidate); + this.maybeShowPreview_(candidate); + Blockly.Events.enable(); + } +}; + +/** + * Create an insertion marker that represents the given block. + * @param {!Blockly.BlockSvg} sourceBlock The block that the insertion marker + * will represent. + * @return {!Blockly.BlockSvg} The insertion marker that represents the given + * block. + * @private + */ +Blockly.InsertionMarkerManager.prototype.createMarkerBlock_ = function(sourceBlock) { + var imType = sourceBlock.type; + + Blockly.Events.disable(); + try { + var result = this.workspace_.newBlock(imType); + result.setInsertionMarker(true); + if (sourceBlock.mutationToDom) { + var oldMutationDom = sourceBlock.mutationToDom(); + if (oldMutationDom) { + result.domToMutation(oldMutationDom); + } + } + // Copy field values from the other block. These values may impact the + // rendered size of the insertion marker. Note that we do not care about + // child blocks here. + for (var i = 0; i < sourceBlock.inputList.length; i++) { + var sourceInput = sourceBlock.inputList[i]; + if (sourceInput.name == Blockly.Block.COLLAPSED_INPUT_NAME) { + continue; // Ignore the collapsed input. + } + var resultInput = result.inputList[i]; + for (var j = 0; j < sourceInput.fieldRow.length; j++) { + var sourceField = sourceInput.fieldRow[j]; + var resultField = resultInput.fieldRow[j]; + resultField.setValue(sourceField.getValue()); + } + } + + result.setCollapsed(sourceBlock.isCollapsed()); + result.setInputsInline(sourceBlock.getInputsInline()); + + result.initSvg(); + result.getSvgRoot().setAttribute('visibility', 'hidden'); + } finally { + Blockly.Events.enable(); + } + + return result; +}; + +/** + * Populate the list of available connections on this block stack. This should + * only be called once, at the beginning of a drag. + * If the stack has more than one block, this function will populate + * lastOnStack_ and create the corresponding insertion marker. + * @return {!Array.} A list of available + * connections. + * @private + */ +Blockly.InsertionMarkerManager.prototype.initAvailableConnections_ = function() { + var available = this.topBlock_.getConnections_(false); + // Also check the last connection on this stack + var lastOnStack = this.topBlock_.lastConnectionInStack(); + if (lastOnStack && lastOnStack != this.topBlock_.nextConnection) { + available.push(lastOnStack); + this.lastOnStack_ = lastOnStack; + if (this.lastMarker_) { + Blockly.Events.disable(); + try { + this.lastMarker_.dispose(); + } finally { + Blockly.Events.enable(); + } + } + this.lastMarker_ = this.createMarkerBlock_(lastOnStack.getSourceBlock()); + } + return available; +}; + +/** + * Whether the previews (insertion marker and replacement marker) should be + * updated based on the closest candidate and the current drag distance. + * @param {!Object} candidate An object containing a local connection, a closest + * connection, and a radius. Returned by getCandidate_. + * @param {!Blockly.utils.Coordinate} dxy Position relative to drag start, + * in workspace units. + * @return {boolean} Whether the preview should be updated. + * @private + */ +Blockly.InsertionMarkerManager.prototype.shouldUpdatePreviews_ = function( + candidate, dxy) { + var candidateLocal = candidate.local; + var candidateClosest = candidate.closest; + var radius = candidate.radius; + + // Found a connection! + if (candidateLocal && candidateClosest) { + // We're already showing an insertion marker. + // Decide whether the new connection has higher priority. + if (this.localConnection_ && this.closestConnection_) { + // The connection was the same as the current connection. + if (this.closestConnection_ == candidateClosest && + this.localConnection_ == candidateLocal) { + return false; + } + var xDiff = this.localConnection_.x + dxy.x - this.closestConnection_.x; + var yDiff = this.localConnection_.y + dxy.y - this.closestConnection_.y; + var curDistance = Math.sqrt(xDiff * xDiff + yDiff * yDiff); + // Slightly prefer the existing preview over a new preview. + return !(candidateClosest && radius > curDistance - + Blockly.CURRENT_CONNECTION_PREFERENCE); + } else if (!this.localConnection_ && !this.closestConnection_) { + // We weren't showing a preview before, but we should now. + return true; + } else { + console.error('Only one of localConnection_ and closestConnection_ was set.'); + } + } else { // No connection found. + // Only need to update if we were showing a preview before. + return !!(this.localConnection_ && this.closestConnection_); + } + + console.error('Returning true from shouldUpdatePreviews, but it\'s not clear why.'); + return true; +}; + +/** + * Find the nearest valid connection, which may be the same as the current + * closest connection. + * @param {!Blockly.utils.Coordinate} dxy Position relative to drag start, + * in workspace units. + * @return {!Object} An object containing a local connection, a closest + * connection, and a radius. + * @private + */ +Blockly.InsertionMarkerManager.prototype.getCandidate_ = function(dxy) { + var radius = this.getStartRadius_(); + var candidateClosest = null; + var candidateLocal = null; + + for (var i = 0; i < this.availableConnections_.length; i++) { + var myConnection = this.availableConnections_[i]; + var neighbour = myConnection.closest(radius, dxy); + if (neighbour.connection) { + candidateClosest = neighbour.connection; + candidateLocal = myConnection; + radius = neighbour.radius; + } + } + return { + closest: candidateClosest, + local: candidateLocal, + radius: radius + }; +}; + +/** + * Decide the radius at which to start searching for the closest connection. + * @return {number} The radius at which to start the search for the closest + * connection. + * @private + */ +Blockly.InsertionMarkerManager.prototype.getStartRadius_ = function() { + // If there is already a connection highlighted, + // increase the radius we check for making new connections. + // Why? When a connection is highlighted, blocks move around when the insertion + // marker is created, which could cause the connection became out of range. + // By increasing radiusConnection when a connection already exists, + // we never "lose" the connection from the offset. + if (this.closestConnection_ && this.localConnection_) { + return Blockly.CONNECTING_SNAP_RADIUS; + } + return Blockly.SNAP_RADIUS; +}; + +/** + * Whether ending the drag would delete the block. + * @param {!Object} candidate An object containing a local connection, a closest + * connection, and a radius. + * @param {?number} deleteArea One of {@link Blockly.DELETE_AREA_TRASH}, + * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. + * @return {boolean} True if dropping the block immediately would replace + * delete the block. False otherwise. + * @private + */ +Blockly.InsertionMarkerManager.prototype.shouldDelete_ = function(candidate, + deleteArea) { + // Prefer connecting over dropping into the trash can, but prefer dragging to + // the toolbox over connecting to other blocks. + var wouldConnect = candidate && !!candidate.closest && + deleteArea != Blockly.DELETE_AREA_TOOLBOX; + var wouldDelete = !!deleteArea && !this.topBlock_.getParent() && + this.topBlock_.isDeletable(); + + return wouldDelete && !wouldConnect; +}; + +/** + * Show an insertion marker or replacement highlighting during a drag, if + * needed. + * At the beginning of this function, this.localConnection_ and + * this.closestConnection_ should both be null. + * @param {!Object} candidate An object containing a local connection, a closest + * connection, and a radius. + * @private + */ +Blockly.InsertionMarkerManager.prototype.maybeShowPreview_ = function(candidate) { + // Nope, don't add a marker. + if (this.wouldDeleteBlock_) { + return; + } + var closest = candidate.closest; + var local = candidate.local; + + // Nothing to connect to. + if (!closest) { + return; + } + + // Something went wrong and we're trying to connect to an invalid connection. + if (closest == this.closestConnection_ || + closest.getSourceBlock().isInsertionMarker()) { + console.log('Trying to connect to an insertion marker'); + return; + } + // Add an insertion marker or replacement marker. + this.closestConnection_ = closest; + this.localConnection_ = local; + this.showPreview_(); +}; + +/** + * A preview should be shown. This function figures out if it should be a block + * highlight or an insertion marker, and shows the appropriate one. + * @private + */ +Blockly.InsertionMarkerManager.prototype.showPreview_ = function() { + var closest = this.closestConnection_; + var renderer = this.workspace_.getRenderer(); + var method = renderer.getConnectionPreviewMethod( + /** @type {!Blockly.RenderedConnection} */ (closest), + /** @type {!Blockly.RenderedConnection} */ (this.localConnection_), + this.topBlock_); + + switch (method) { + case Blockly.InsertionMarkerManager.PREVIEW_TYPE.INPUT_OUTLINE: + this.showInsertionInputOutline_(); + break; + case Blockly.InsertionMarkerManager.PREVIEW_TYPE.INSERTION_MARKER: + this.showInsertionMarker_(); + break; + case Blockly.InsertionMarkerManager.PREVIEW_TYPE.REPLACEMENT_FADE: + this.showReplacementFade_(); + break; + } + + // Optionally highlight the actual connection, as a nod to previous behaviour. + if (closest && renderer.shouldHighlightConnection(closest)) { + closest.highlight(); + } +}; + +/** + * Show an insertion marker or replacement highlighting during a drag, if + * needed. + * At the end of this function, this.localConnection_ and + * this.closestConnection_ should both be null. + * @param {!Object} candidate An object containing a local connection, a closest + * connection, and a radius. + * @private + */ +Blockly.InsertionMarkerManager.prototype.maybeHidePreview_ = function(candidate) { + // If there's no new preview, remove the old one but don't bother deleting it. + // We might need it later, and this saves disposing of it and recreating it. + if (!candidate.closest) { + this.hidePreview_(); + } else { + // If there's a new preview and there was an preview before, and either + // connection has changed, remove the old preview. + var hadPreview = this.closestConnection_ && this.localConnection_; + var closestChanged = this.closestConnection_ != candidate.closest; + var localChanged = this.localConnection_ != candidate.local; + + // Also hide if we had a preview before but now we're going to delete instead. + if (hadPreview && (closestChanged || localChanged || this.wouldDeleteBlock_)) { + this.hidePreview_(); + } + } + + // Either way, clear out old state. + this.markerConnection_ = null; + this.closestConnection_ = null; + this.localConnection_ = null; +}; + +/** + * A preview should be hidden. This function figures out if it is a block + * highlight or an insertion marker, and hides the appropriate one. + * @private + */ +Blockly.InsertionMarkerManager.prototype.hidePreview_ = function() { + if (this.closestConnection_ && this.closestConnection_.targetBlock() && + this.workspace_.getRenderer() + .shouldHighlightConnection(this.closestConnection_)) { + this.closestConnection_.unhighlight(); + } + if (this.fadedBlock_) { + this.hideReplacementFade_(); + } else if (this.highlightedBlock_) { + this.hideInsertionInputOutline_(); + } else if (this.markerConnection_) { + this.hideInsertionMarker_(); + } +}; + +/** + * Shows an insertion marker connected to the appropriate blocks (based on + * manager state). + * @private + */ +Blockly.InsertionMarkerManager.prototype.showInsertionMarker_ = function() { + var local = this.localConnection_; + var closest = this.closestConnection_; + + var isLastInStack = this.lastOnStack_ && local == this.lastOnStack_; + var imBlock = isLastInStack ? this.lastMarker_ : this.firstMarker_; + var imConn = imBlock.getMatchingConnection(local.getSourceBlock(), local); + + if (imConn == this.markerConnection_) { + throw Error('Made it to showInsertionMarker_ even though the marker isn\'t ' + + 'changing'); + } + + // Render disconnected from everything else so that we have a valid + // connection location. + imBlock.render(); + imBlock.rendered = true; + imBlock.getSvgRoot().setAttribute('visibility', 'visible'); + + if (imConn && closest) { + // Position so that the existing block doesn't move. + imBlock.positionNearConnection(imConn, closest); + } + if (closest) { + // Connect() also renders the insertion marker. + imConn.connect(closest); + } + + this.markerConnection_ = imConn; +}; + +/** + * Disconnects and hides the current insertion marker. Should return the blocks + * to their original state. + * @private + */ +Blockly.InsertionMarkerManager.prototype.hideInsertionMarker_ = function() { + if (!this.markerConnection_) { + console.log('No insertion marker connection to disconnect'); + return; + } + + var imConn = this.markerConnection_; + var imBlock = imConn.getSourceBlock(); + var markerNext = imBlock.nextConnection; + var markerPrev = imBlock.previousConnection; + var markerOutput = imBlock.outputConnection; + + var isFirstInStatementStack = + (imConn == markerNext && !(markerPrev && markerPrev.targetConnection)); + + var isFirstInOutputStack = imConn.type == Blockly.INPUT_VALUE && + !(markerOutput && markerOutput.targetConnection); + // The insertion marker is the first block in a stack. Unplug won't do + // anything in that case. Instead, unplug the following block. + if (isFirstInStatementStack || isFirstInOutputStack) { + imConn.targetBlock().unplug(false); + } + // Inside of a C-block, first statement connection. + else if (imConn.type == Blockly.NEXT_STATEMENT && imConn != markerNext) { + var innerConnection = imConn.targetConnection; + innerConnection.getSourceBlock().unplug(false); + + var previousBlockNextConnection = + markerPrev ? markerPrev.targetConnection : null; + + imBlock.unplug(true); + if (previousBlockNextConnection) { + previousBlockNextConnection.connect(innerConnection); + } + } else { + imBlock.unplug(true /* healStack */); + } + + if (imConn.targetConnection) { + throw Error('markerConnection_ still connected at the end of ' + + 'disconnectInsertionMarker'); + } + + this.markerConnection_ = null; + imBlock.getSvgRoot().setAttribute('visibility', 'hidden'); +}; + +/** + * Shows an outline around the input the closest connection belongs to. + * @private + */ +Blockly.InsertionMarkerManager.prototype.showInsertionInputOutline_ = function() { + var closest = this.closestConnection_; + this.highlightedBlock_ = closest.getSourceBlock(); + this.highlightedBlock_.highlightShapeForInput(closest, true); +}; + +/** + * Hides any visible input outlines. + * @private + */ +Blockly.InsertionMarkerManager.prototype.hideInsertionInputOutline_ = function() { + this.highlightedBlock_.highlightShapeForInput(this.closestConnection_, false); + this.highlightedBlock_ = null; +}; + +/** + * Shows a replacement fade affect on the closest connection's target block + * (the block that is currently connected to it). + * @private + */ +Blockly.InsertionMarkerManager.prototype.showReplacementFade_ = function() { + this.fadedBlock_ = this.closestConnection_.targetBlock(); + this.fadedBlock_.fadeForReplacement(true); +}; + +/** + * Hides/Removes any visible fade affects. + * @private + */ +Blockly.InsertionMarkerManager.prototype.hideReplacementFade_ = function() { + this.fadedBlock_.fadeForReplacement(false); + this.fadedBlock_ = null; +}; + +/** + * 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 + */ +Blockly.InsertionMarkerManager.prototype.getInsertionMarkers = function() { + var result = []; + if (this.firstMarker_) { + result.push(this.firstMarker_); + } + if (this.lastMarker_) { + result.push(this.lastMarker_); + } + return result; +}; diff --git a/static/js/dist/core/interfaces/i_accessibility.js b/static/js/dist/core/interfaces/i_accessibility.js new file mode 100644 index 0000000..d127550 --- /dev/null +++ b/static/js/dist/core/interfaces/i_accessibility.js @@ -0,0 +1,73 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview AST Node and keyboard navigation interfaces. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IASTNodeLocation'); +goog.provide('Blockly.IASTNodeLocationSvg'); +goog.provide('Blockly.IASTNodeLocationWithBlock'); +goog.provide('Blockly.IBlocklyActionable'); +goog.requireType('Blockly.ShortcutRegistry'); + +/** + * An AST node location interface. + * @interface + */ +Blockly.IASTNodeLocation = function() {}; + +/** + * An AST node location SVG interface. + * @interface + * @extends {Blockly.IASTNodeLocation} + */ +Blockly.IASTNodeLocationSvg = function() {}; + +/** + * Add the marker svg to this node's svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * svg group. + */ +Blockly.IASTNodeLocationSvg.prototype.setMarkerSvg; + +/** + * Add the cursor svg to this node's svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * svg group. + */ +Blockly.IASTNodeLocationSvg.prototype.setCursorSvg; + +/** + * An AST node location that has an associated block. + * @interface + * @extends {Blockly.IASTNodeLocation} + */ +Blockly.IASTNodeLocationWithBlock = function() {}; + +/** + * Get the source block associated with this node. + * @return {Blockly.Block} The source block. + */ +Blockly.IASTNodeLocationWithBlock.prototype.getSourceBlock; + + +/** + * An interface for an object that handles Blockly actions when keyboard + * navigation is enabled. + * @interface + */ +Blockly.IBlocklyActionable = function() {}; + +/** + * Handles the given action. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ +Blockly.IBlocklyActionable.prototype.onBlocklyAction; diff --git a/static/js/dist/core/interfaces/i_bounded_element.js b/static/js/dist/core/interfaces/i_bounded_element.js new file mode 100644 index 0000000..34b72fb --- /dev/null +++ b/static/js/dist/core/interfaces/i_bounded_element.js @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a bounded element. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IBoundedElement'); + +goog.requireType('Blockly.utils.Rect'); + + +/** + * A bounded element interface. + * @interface + */ +Blockly.IBoundedElement = function() {}; + +/** + * Returns the coordinates of a bounded element describing the dimensions of the + * element. + * Coordinate system: workspace coordinates. + * @return {!Blockly.utils.Rect} Object with coordinates of the bounded element. + */ +Blockly.IBoundedElement.prototype.getBoundingRectangle; diff --git a/static/js/dist/core/interfaces/i_bubble.js b/static/js/dist/core/interfaces/i_bubble.js new file mode 100644 index 0000000..bbf9fda --- /dev/null +++ b/static/js/dist/core/interfaces/i_bubble.js @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a bubble. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IBubble'); + +goog.requireType('Blockly.IContextMenu'); +goog.requireType('Blockly.IDeletable'); + + +/** + * A bubble interface. + * @interface + * @extends {Blockly.IDeletable} + * @extends {Blockly.IContextMenu} + */ +Blockly.IBubble = function() {}; + +/** + * 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. + */ +Blockly.IBubble.prototype.getRelativeToSurfaceXY; + +/** + * Return the root node of the bubble's SVG group. + * @return {!SVGElement} The root SVG node of the bubble's group. + */ +Blockly.IBubble.prototype.getSvgRoot; + +/** + * 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. + */ +Blockly.IBubble.prototype.setAutoLayout; + +/** + * Triggers a move callback if one exists at the end of a drag. + * @param {boolean} adding True if adding, false if removing. + */ +Blockly.IBubble.prototype.setDragging; + +/** + * 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. + */ +Blockly.IBubble.prototype.moveDuringDrag; + +/** + * Move the bubble 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. + */ +Blockly.IBubble.prototype.moveTo; + +/** + * Update the style of this bubble when it is dragged over a delete area. + * @param {boolean} enable True if the bubble is about to be deleted, false + * otherwise. + */ +Blockly.IBubble.prototype.setDeleteStyle; + +/** + * Dispose of this bubble. + */ +Blockly.IBubble.prototype.dispose; diff --git a/static/js/dist/core/interfaces/i_connection_checker.js b/static/js/dist/core/interfaces/i_connection_checker.js new file mode 100644 index 0000000..5054016 --- /dev/null +++ b/static/js/dist/core/interfaces/i_connection_checker.js @@ -0,0 +1,94 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that encapsulates logic for + * checking whether a potential connection is safe and valid. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.IConnectionChecker'); + +goog.requireType('Blockly.Connection'); + + +/** + * Class for connection type checking logic. + * @interface + */ +Blockly.IConnectionChecker = function() {}; + +/** + * Check whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {boolean} Whether the connection is legal. + * @public + */ +Blockly.IConnectionChecker.prototype.canConnect; + +/** + * Checks whether the current connection can connect with the target + * connection, and return an error code if there are problems. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @public + */ +Blockly.IConnectionChecker.prototype.canConnectWithReason; + +/** + * Helper method that translates a connection error code into a string. + * @param {number} errorCode The error code. + * @param {Blockly.Connection} a One of the two connections being checked. + * @param {Blockly.Connection} b The second of the two connections being + * checked. + * @return {string} A developer-readable error string. + * @public + */ +Blockly.IConnectionChecker.prototype.getErrorMessage; + +/** + * Check that connecting the given connections is safe, meaning that it would + * not break any of Blockly's basic assumptions (e.g. no self connections). + * @param {Blockly.Connection} a The first of the connections to check. + * @param {Blockly.Connection} b The second of the connections to check. + * @return {number} An enum with the reason this connection is safe or unsafe. + * @public + */ +Blockly.IConnectionChecker.prototype.doSafetyChecks; + +/** + * Check whether this connection is compatible with another connection with + * respect to the value type system. E.g. square_root("Hello") is not + * compatible. + * @param {!Blockly.Connection} a Connection to compare. + * @param {!Blockly.Connection} b Connection to compare against. + * @return {boolean} True if the connections share a type. + * @public + */ +Blockly.IConnectionChecker.prototype.doTypeChecks; + +/** + * Check whether this connection can be made by dragging. + * @param {!Blockly.RenderedConnection} a Connection to compare. + * @param {!Blockly.RenderedConnection} b Connection to compare against. + * @param {number} distance The maximum allowable distance between connections. + * @return {boolean} True if the connection is allowed during a drag. + * @public + */ +Blockly.IConnectionChecker.prototype.doDragChecks; diff --git a/static/js/dist/core/interfaces/i_contextmenu.js b/static/js/dist/core/interfaces/i_contextmenu.js new file mode 100644 index 0000000..fcc406b --- /dev/null +++ b/static/js/dist/core/interfaces/i_contextmenu.js @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that supports a right-click. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IContextMenu'); + + +/** + * @interface + */ +Blockly.IContextMenu = function() {}; + +/** + * Show the context menu for this object. + * @param {!Event} e Mouse event. + */ +Blockly.IContextMenu.prototype.showContextMenu; diff --git a/static/js/dist/core/interfaces/i_copyable.js b/static/js/dist/core/interfaces/i_copyable.js new file mode 100644 index 0000000..4aeac97 --- /dev/null +++ b/static/js/dist/core/interfaces/i_copyable.js @@ -0,0 +1,40 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that is copyable. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.ICopyable'); + +goog.requireType('Blockly.ISelectable'); +goog.requireType('Blockly.WorkspaceSvg'); + + +/** + * @extends {Blockly.ISelectable} + * @interface + */ +Blockly.ICopyable = function() {}; + +/** + * Encode for copying. + * @return {?Blockly.ICopyable.CopyData} Copy metadata. + */ +Blockly.ICopyable.prototype.toCopyData; + +/** + * Copy Metadata. + * @typedef {{ + * xml:!Element, + * source:Blockly.WorkspaceSvg, + * typeCounts:?Object + * }} + */ +Blockly.ICopyable.CopyData; diff --git a/static/js/dist/core/interfaces/i_deletable.js b/static/js/dist/core/interfaces/i_deletable.js new file mode 100644 index 0000000..8e85248 --- /dev/null +++ b/static/js/dist/core/interfaces/i_deletable.js @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that is deletable. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IDeletable'); + + +/** + * The interface for an object that can be deleted. + * @interface + */ +Blockly.IDeletable = function() {}; + +/** + * Get whether this object is deletable or not. + * @return {boolean} True if deletable. + */ +Blockly.IDeletable.prototype.isDeletable; diff --git a/static/js/dist/core/interfaces/i_deletearea.js b/static/js/dist/core/interfaces/i_deletearea.js new file mode 100644 index 0000000..3ca0f08 --- /dev/null +++ b/static/js/dist/core/interfaces/i_deletearea.js @@ -0,0 +1,28 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a component that can delete a block that is + * dropped on top of it. + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.IDeleteArea'); + + +/** + * Interface for a component that can delete a block that is dropped on top of it. + * @interface + */ +Blockly.IDeleteArea = function() {}; + +/** + * Return the deletion rectangle. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ +Blockly.IDeleteArea.prototype.getClientRect; diff --git a/static/js/dist/core/interfaces/i_flyout.js b/static/js/dist/core/interfaces/i_flyout.js new file mode 100644 index 0000000..f3a91e5 --- /dev/null +++ b/static/js/dist/core/interfaces/i_flyout.js @@ -0,0 +1,190 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a flyout. + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.IFlyout'); + +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.IRegistrable'); +goog.requireType('Blockly.utils.dom'); +goog.requireType('Blockly.utils.Coordinate'); +goog.requireType('Blockly.utils.Svg'); +goog.requireType('Blockly.utils.toolbox'); +goog.requireType('Blockly.WorkspaceSvg'); + + +/** + * Interface for a flyout. + * @extends {Blockly.IRegistrable} + * @interface + */ +Blockly.IFlyout = function() {}; + +/** + * Whether the flyout is laid out horizontally or not. + * @type {boolean} + */ +Blockly.IFlyout.prototype.horizontalLayout; + +/** + * Is RTL vs LTR. + * @type {boolean} + */ +Blockly.IFlyout.prototype.RTL; + +/** + * The target workspace + * @type {?Blockly.WorkspaceSvg} + */ +Blockly.IFlyout.prototype.targetWorkspace; + +/** + * Margin around the edges of the blocks in the flyout. + * @type {number} + * @const + */ +Blockly.IFlyout.prototype.MARGIN; + +/** + * Does the flyout automatically close when a block is created? + * @type {boolean} + */ +Blockly.IFlyout.prototype.autoClose; + +/** + * Corner radius of the flyout background. + * @type {number} + * @const + */ +Blockly.IFlyout.prototype.CORNER_RADIUS; + +/** + * 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName The type of tag to + * put the flyout in. This should be or . + * @return {!SVGElement} The flyout's SVG group. + */ +Blockly.IFlyout.prototype.createDom; + +/** + * Initializes the flyout. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The workspace in which to + * create new blocks. + */ +Blockly.IFlyout.prototype.init; + +/** + * Dispose of this flyout. + * Unlink from all DOM elements to prevent memory leaks. + */ +Blockly.IFlyout.prototype.dispose; + +/** + * Get the width of the flyout. + * @return {number} The width of the flyout. + */ +Blockly.IFlyout.prototype.getWidth; + +/** + * Get the height of the flyout. + * @return {number} The width of the flyout. + */ +Blockly.IFlyout.prototype.getHeight; + +/** + * Get the workspace inside the flyout. + * @return {!Blockly.WorkspaceSvg} The workspace inside the flyout. + */ +Blockly.IFlyout.prototype.getWorkspace; + +/** + * Is the flyout visible? + * @return {boolean} True if visible. + */ +Blockly.IFlyout.prototype.isVisible; + +/** + * 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. + */ +Blockly.IFlyout.prototype.setVisible; + +/** + * Set whether this flyout's container is visible. + * @param {boolean} visible Whether the container is visible. + */ +Blockly.IFlyout.prototype.setContainerVisible; + +/** + * Hide and empty the flyout. + */ +Blockly.IFlyout.prototype.hide; + +/** + * Show and populate the flyout. + * @param {!Blockly.utils.toolbox.FlyoutDefinition|string} flyoutDef Contents to + * display in the flyout. This is either an array of Nodes, a NodeList, a + * toolbox definition, or a string with the name of the dynamic category. + */ +Blockly.IFlyout.prototype.show; + +/** + * 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. + * @throws {Error} if something went wrong with deserialization. + */ +Blockly.IFlyout.prototype.createBlock; + +/** + * Reflow blocks and their mats. + */ +Blockly.IFlyout.prototype.reflow; + +/** + * @return {boolean} True if this flyout may be scrolled with a scrollbar or by + * dragging. + */ +Blockly.IFlyout.prototype.isScrollable; + +/** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ +Blockly.IFlyout.prototype.getX; + +/** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ +Blockly.IFlyout.prototype.getY; + +/** + * Position the flyout. + * @return {void} + */ +Blockly.IFlyout.prototype.position; + +/** + * 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. + */ +Blockly.IFlyout.prototype.isDragTowardWorkspace; diff --git a/static/js/dist/core/interfaces/i_movable.js b/static/js/dist/core/interfaces/i_movable.js new file mode 100644 index 0000000..bc0c3bf --- /dev/null +++ b/static/js/dist/core/interfaces/i_movable.js @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that is movable. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IMovable'); + + +/** + * The interface for an object that is movable. + * @interface + */ +Blockly.IMovable = function() {}; + +/** + * Get whether this is movable or not. + * @return {boolean} True if movable. + */ +Blockly.IMovable.prototype.isMovable; diff --git a/static/js/dist/core/interfaces/i_registrable.js b/static/js/dist/core/interfaces/i_registrable.js new file mode 100644 index 0000000..f7b8ca7 --- /dev/null +++ b/static/js/dist/core/interfaces/i_registrable.js @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a Blockly component that can be registered. + * (Ex. Toolbox, Fields, Renderers) + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.IRegistrable'); + + +/** + * The interface for a Blockly component that can be registered. + * @interface + */ +Blockly.IRegistrable = function() {}; diff --git a/static/js/dist/core/interfaces/i_registrable_field.js b/static/js/dist/core/interfaces/i_registrable_field.js new file mode 100644 index 0000000..1d49eda --- /dev/null +++ b/static/js/dist/core/interfaces/i_registrable_field.js @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a Blockly field that can be registered. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.IRegistrableField'); + +goog.requireType('Blockly.Field'); + +/** + * A registrable field. + * Note: We are not using an interface here as we are interested in defining the + * static methods of a field rather than the instance methods. + * @typedef {{ + * fromJson:Blockly.IRegistrableField.fromJson + * }} + */ +Blockly.IRegistrableField; + +/** + * @typedef {function(!Object): Blockly.Field} + */ +Blockly.IRegistrableField.fromJson; diff --git a/static/js/dist/core/interfaces/i_selectable.js b/static/js/dist/core/interfaces/i_selectable.js new file mode 100644 index 0000000..e3d817f --- /dev/null +++ b/static/js/dist/core/interfaces/i_selectable.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that is selectable. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +goog.provide('Blockly.ISelectable'); + +goog.requireType('Blockly.IDeletable'); +goog.requireType('Blockly.IMovable'); + + +/** + * The interface for an object that is selectable. + * @extends {Blockly.IDeletable} + * @extends {Blockly.IMovable} + * @interface + */ +Blockly.ISelectable = function() {}; + +/** + * @type {string} + */ +Blockly.ISelectable.prototype.id; + +/** + * Select this. Highlight it visually. + * @return {void} + */ +Blockly.ISelectable.prototype.select; + +/** + * Unselect this. Unhighlight it visually. + * @return {void} + */ +Blockly.ISelectable.prototype.unselect; diff --git a/static/js/dist/core/interfaces/i_styleable.js b/static/js/dist/core/interfaces/i_styleable.js new file mode 100644 index 0000000..944ee9d --- /dev/null +++ b/static/js/dist/core/interfaces/i_styleable.js @@ -0,0 +1,33 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for an object that a style can be added to. + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.IStyleable'); + + +/** + * Interface for an object that a style can be added to. + * @interface + */ +Blockly.IStyleable = function() {}; + +/** + * Adds a style on the toolbox. Usually used to change the cursor. + * @param {string} style The name of the class to add. + */ +Blockly.IStyleable.prototype.addStyle; + +/** + * Removes a style from the toolbox. Usually used to change the cursor. + * @param {string} style The name of the class to remove. + */ +Blockly.IStyleable.prototype.removeStyle; diff --git a/static/js/dist/core/interfaces/i_toolbox.js b/static/js/dist/core/interfaces/i_toolbox.js new file mode 100644 index 0000000..208be48 --- /dev/null +++ b/static/js/dist/core/interfaces/i_toolbox.js @@ -0,0 +1,131 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a toolbox. + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.IToolbox'); + +goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IRegistrable'); +goog.requireType('Blockly.IToolboxItem'); +goog.requireType('Blockly.utils.toolbox'); +goog.requireType('Blockly.WorkspaceSvg'); + + +/** + * Interface for a toolbox. + * @extends {Blockly.IRegistrable} + * @interface + */ +Blockly.IToolbox = function() {}; + +/** + * Initializes the toolbox. + * @return {void} + */ +Blockly.IToolbox.prototype.init; + +/** + * Fills the toolbox with new toolbox items and removes any old contents. + * @param {!Blockly.utils.toolbox.ToolboxInfo} toolboxDef Object holding information + * for creating a toolbox. + */ +Blockly.IToolbox.prototype.render; + +/** + * Gets the width of the toolbox. + * @return {number} The width of the toolbox. + */ +Blockly.IToolbox.prototype.getWidth; + +/** + * Gets the height of the toolbox. + * @return {number} The width of the toolbox. + */ +Blockly.IToolbox.prototype.getHeight; + +/** + * Gets the toolbox flyout. + * @return {?Blockly.IFlyout} The toolbox flyout. + */ +Blockly.IToolbox.prototype.getFlyout; + +/** + * Gets the workspace for the toolbox. + * @return {!Blockly.WorkspaceSvg} The parent workspace for the toolbox. + */ +Blockly.IToolbox.prototype.getWorkspace; + +/** + * Gets whether or not the toolbox is horizontal. + * @return {boolean} True if the toolbox is horizontal, false if the toolbox is + * vertical. + */ +Blockly.IToolbox.prototype.isHorizontal; + +/** + * Positions the toolbox based on whether it is a horizontal toolbox and whether + * the workspace is in rtl. + * @return {void} + */ +Blockly.IToolbox.prototype.position; + +/** + * Handles resizing the toolbox when a toolbox item resizes. + * @return {void} + */ +Blockly.IToolbox.prototype.handleToolboxItemResize; + +/** + * Unhighlights any previously selected item. + * @return {void} + */ +Blockly.IToolbox.prototype.clearSelection; + +/** + * Updates the category colours and background colour of selected categories. + * @return {void} + */ +Blockly.IToolbox.prototype.refreshTheme; + +/** + * Updates the flyout's content without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + * @return {void} + */ +Blockly.IToolbox.prototype.refreshSelection; + +/** + * Sets the visibility of the toolbox. + * @param {boolean} isVisible True if toolbox should be visible. + */ +Blockly.IToolbox.prototype.setVisible; + +/** + * Selects the toolbox item by it's position in the list of toolbox items. + * @param {number} position The position of the item to select. + * @return {void} + */ +Blockly.IToolbox.prototype.selectItemByPosition; + +/** + * Gets the selected item. + * @return {?Blockly.IToolboxItem} The selected item, or null if no item is + * currently selected. + */ +Blockly.IToolbox.prototype.getSelectedItem; + +/** + * Disposes of this toolbox. + * @return {void} + */ +Blockly.IToolbox.prototype.dispose; diff --git a/static/js/dist/core/interfaces/i_toolbox_item.js b/static/js/dist/core/interfaces/i_toolbox_item.js new file mode 100644 index 0000000..b6e302d --- /dev/null +++ b/static/js/dist/core/interfaces/i_toolbox_item.js @@ -0,0 +1,157 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a toolbox item. + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.ICollapsibleToolboxItem'); +goog.provide('Blockly.ISelectableToolboxItem'); +goog.provide('Blockly.IToolboxItem'); + +goog.requireType('Blockly.utils.toolbox'); + + +/** + * Interface for an item in the toolbox. + * @interface + */ +Blockly.IToolboxItem = function() {}; + +/** + * Initializes the toolbox item. + * This includes creating the dom and updating the state of any items based + * on the info object. + * @return {void} + * @public + */ +Blockly.IToolboxItem.prototype.init; + +/** + * Gets the div for the toolbox item. + * @return {?Element} The div for the toolbox item. + * @public + */ +Blockly.IToolboxItem.prototype.getDiv; + +/** + * Gets a unique identifier for this toolbox item. + * @return {string} The id for the toolbox item. + * @public + */ +Blockly.IToolboxItem.prototype.getId; + +/** + * Gets the parent if the toolbox item is nested. + * @return {?Blockly.IToolboxItem} The parent toolbox item, or null if + * this toolbox item is not nested. + * @public + */ +Blockly.IToolboxItem.prototype.getParent; + +/** + * Gets the nested level of the category. + * @return {number} The nested level of the category. + * @package + */ +Blockly.IToolboxItem.prototype.getLevel; + +/** + * Whether the toolbox item is selectable. + * @return {boolean} True if the toolbox item can be selected. + * @public + */ +Blockly.IToolboxItem.prototype.isSelectable; + +/** + * Whether the toolbox item is collapsible. + * @return {boolean} True if the toolbox item is collapsible. + * @public + */ +Blockly.IToolboxItem.prototype.isCollapsible; + +/** + * Dispose of this toolbox item. No-op by default. + * @public + */ +Blockly.IToolboxItem.prototype.dispose; + +/** + * Interface for an item in the toolbox that can be selected. + * @extends {Blockly.IToolboxItem} + * @interface + */ +Blockly.ISelectableToolboxItem = function() {}; + +/** + * Gets the name of the toolbox item. Used for emitting events. + * @return {string} The name of the toolbox item. + * @public + */ +Blockly.ISelectableToolboxItem.prototype.getName; + +/** + * Gets the contents of the toolbox item. These are items that are meant to be + * displayed in the flyout. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray|string} The definition + * of items to be displayed in the flyout. + * @public + */ +Blockly.ISelectableToolboxItem.prototype.getContents; + +/** + * Sets the current toolbox item as selected. + * @param {boolean} _isSelected True if this category is selected, false + * otherwise. + * @public + */ +Blockly.ISelectableToolboxItem.prototype.setSelected; + +/** + * Gets the html element that is clickable. + * The parent toolbox element receives clicks. The parent toolbox will add an id to this element so + * it can pass the onClick event to the correct toolboxItem. + * @return {!Element} The html element that receives clicks. + * @public + */ +Blockly.ISelectableToolboxItem.prototype.getClickTarget; + +/** + * Handles when the toolbox item is clicked. + * @param {!Event} _e Click event to handle. + * @public + */ +Blockly.ISelectableToolboxItem.prototype.onClick; + +/** + * Interface for an item in the toolbox that can be collapsed. + * @extends {Blockly.ISelectableToolboxItem} + * @interface + */ +Blockly.ICollapsibleToolboxItem = function() {}; + +/** + * Gets any children toolbox items. (ex. Gets the subcategories) + * @return {!Array} The child toolbox items. + */ +Blockly.ICollapsibleToolboxItem.prototype.getChildToolboxItems; + +/** + * Whether the toolbox item is expanded to show its child subcategories. + * @return {boolean} True if the toolbox item shows its children, false if it + * is collapsed. + * @public + */ +Blockly.ICollapsibleToolboxItem.prototype.isExpanded; + +/** + * Toggles whether or not the toolbox item is expanded. + * @public + */ +Blockly.ICollapsibleToolboxItem.prototype.toggleExpanded; diff --git a/static/js/dist/core/keyboard_nav/ast_node.js b/static/js/dist/core/keyboard_nav/ast_node.js new file mode 100644 index 0000000..ced720f --- /dev/null +++ b/static/js/dist/core/keyboard_nav/ast_node.js @@ -0,0 +1,685 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing an AST node. + * Used to traverse the Blockly AST. + */ +'use strict'; + +goog.provide('Blockly.ASTNode'); + +goog.require('Blockly.constants'); +goog.require('Blockly.utils.Coordinate'); + +goog.requireType('Blockly.IASTNodeLocation'); +goog.requireType('Blockly.IASTNodeLocationWithBlock'); + + +/** + * 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 Blockly.ASTNode.types. + * @param {!Blockly.IASTNodeLocation} location The position in the AST. + * @param {!Blockly.ASTNode.Params=} opt_params Optional dictionary of options. + * @constructor + */ +Blockly.ASTNode = function(type, location, opt_params) { + if (!location) { + throw Error('Cannot create a node without a location.'); + } + + /** + * The type of the location. + * One of Blockly.ASTNode.types + * @type {string} + * @private + */ + this.type_ = type; + + /** + * Whether the location points to a connection. + * @type {boolean} + * @private + */ + this.isConnection_ = Blockly.ASTNode.isConnectionType_(type); + + /** + * The location of the AST node. + * @type {!Blockly.IASTNodeLocation} + * @private + */ + this.location_ = location; + + /** + * The coordinate on the workspace. + * @type {Blockly.utils.Coordinate} + * @private + */ + this.wsCoordinate_ = null; + + this.processParams_(opt_params || null); +}; + +/** + * @typedef {{ + * wsCoordinate: Blockly.utils.Coordinate + * }} + */ +Blockly.ASTNode.Params; + +/** + * Object holding different types for an AST node. + * @enum {string} + */ +Blockly.ASTNode.types = { + FIELD: 'field', + BLOCK: 'block', + INPUT: 'input', + OUTPUT: 'output', + NEXT: 'next', + PREVIOUS: 'previous', + STACK: 'stack', + WORKSPACE: 'workspace' +}; + +/** + * True to navigate to all fields. False to only navigate to clickable fields. + * @type {boolean} + */ +Blockly.ASTNode.NAVIGATE_ALL_FIELDS = false; + +/** + * The default y offset to use when moving the cursor from a stack to the + * workspace. + * @type {number} + * @private + */ +Blockly.ASTNode.DEFAULT_OFFSET_Y = -20; + +/** + * Whether an AST node of the given type points to a connection. + * @param {string} type The type to check. One of Blockly.ASTNode.types. + * @return {boolean} True if a node of the given type points to a connection. + * @private + */ +Blockly.ASTNode.isConnectionType_ = function(type) { + switch (type) { + case Blockly.ASTNode.types.PREVIOUS: + case Blockly.ASTNode.types.NEXT: + case Blockly.ASTNode.types.INPUT: + case Blockly.ASTNode.types.OUTPUT: + return true; + } + return false; +}; + +/** + * 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. + */ +Blockly.ASTNode.createFieldNode = function(field) { + if (!field) { + return null; + } + return new Blockly.ASTNode(Blockly.ASTNode.types.FIELD, field); +}; + +/** + * 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. + */ +Blockly.ASTNode.createConnectionNode = function(connection) { + if (!connection) { + return null; + } + if (connection.type == Blockly.INPUT_VALUE) { + return Blockly.ASTNode.createInputNode(connection.getParentInput()); + } else if (connection.type == Blockly.NEXT_STATEMENT && + connection.getParentInput()) { + return Blockly.ASTNode.createInputNode(connection.getParentInput()); + } else if (connection.type == Blockly.NEXT_STATEMENT) { + return new Blockly.ASTNode(Blockly.ASTNode.types.NEXT, connection); + } else if (connection.type == Blockly.OUTPUT_VALUE) { + return new Blockly.ASTNode(Blockly.ASTNode.types.OUTPUT, connection); + } else if (connection.type == Blockly.PREVIOUS_STATEMENT) { + return new Blockly.ASTNode(Blockly.ASTNode.types.PREVIOUS, connection); + } + return null; +}; + +/** + * 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. + */ +Blockly.ASTNode.createInputNode = function(input) { + if (!input || !input.connection) { + return null; + } + return new Blockly.ASTNode(Blockly.ASTNode.types.INPUT, input.connection); +}; + +/** + * 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. + */ +Blockly.ASTNode.createBlockNode = function(block) { + if (!block) { + return null; + } + return new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, block); +}; + +/** + * 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. + */ +Blockly.ASTNode.createStackNode = function(topBlock) { + if (!topBlock) { + return null; + } + return new Blockly.ASTNode(Blockly.ASTNode.types.STACK, topBlock); +}; + +/** + * 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. + */ +Blockly.ASTNode.createWorkspaceNode = function(workspace, wsCoordinate) { + if (!wsCoordinate || !workspace) { + return null; + } + var params = { + wsCoordinate: wsCoordinate + }; + return new Blockly.ASTNode( + Blockly.ASTNode.types.WORKSPACE, workspace, params); +}; + +/** + * Creates an AST node for the top position on a block. + * This is either an output connection, previous connection, or 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 position on the + * block. + */ +Blockly.ASTNode.createTopNode = function(block) { + var astNode; + var topConnection = block.previousConnection || block.outputConnection; + if (topConnection) { + astNode = Blockly.ASTNode.createConnectionNode(topConnection); + } else { + astNode = Blockly.ASTNode.createBlockNode(block); + } + return astNode; +}; + +/** + * Parse the optional parameters. + * @param {?Blockly.ASTNode.Params} params The user specified parameters. + * @private + */ +Blockly.ASTNode.prototype.processParams_ = function(params) { + if (!params) { + return; + } + if (params.wsCoordinate) { + this.wsCoordinate_ = params.wsCoordinate; + } +}; + +/** + * 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.IASTNodeLocation} The current field, connection, workspace, or + * block the cursor is on. + */ +Blockly.ASTNode.prototype.getLocation = function() { + return this.location_; +}; + +/** + * The type of the current location. + * One of Blockly.ASTNode.types + * @return {string} The type of the location. + */ +Blockly.ASTNode.prototype.getType = function() { + return this.type_; +}; + +/** + * The coordinate on the workspace. + * @return {Blockly.utils.Coordinate} The workspace coordinate or null if the + * location is not a workspace. + */ +Blockly.ASTNode.prototype.getWsCoordinate = function() { + return this.wsCoordinate_; +}; + +/** + * Whether the node points to a connection. + * @return {boolean} [description] + * @package + */ +Blockly.ASTNode.prototype.isConnection = function() { + return this.isConnection_; +}; + +/** + * Given an input find the next editable field or an input with a non null + * connection in the same block. The current location must be an input + * connection. + * @return {Blockly.ASTNode} The AST node holding the next field or connection + * or null if there is no editable field or input connection after the given + * input. + * @private + */ +Blockly.ASTNode.prototype.findNextForInput_ = function() { + var location = /** @type {!Blockly.Connection} */ (this.location_); + var parentInput = location.getParentInput(); + var block = parentInput.getSourceBlock(); + var curIdx = block.inputList.indexOf(parentInput); + for (var i = curIdx + 1, input; (input = block.inputList[i]); i++) { + var fieldRow = input.fieldRow; + for (var j = 0, field; (field = fieldRow[j]); j++) { + if (field.isClickable() || Blockly.ASTNode.NAVIGATE_ALL_FIELDS) { + return Blockly.ASTNode.createFieldNode(field); + } + } + if (input.connection) { + return Blockly.ASTNode.createInputNode(input); + } + } + return null; +}; + +/** + * Given a field find the next editable field or an input with a non null + * connection in the same block. The current location must be a field. + * @return {Blockly.ASTNode} The AST node pointing to the next field or + * connection or null if there is no editable field or input connection + * after the given input. + * @private + */ +Blockly.ASTNode.prototype.findNextForField_ = function() { + var location = /** @type {!Blockly.Field} */ (this.location_); + var input = location.getParentInput(); + var block = location.getSourceBlock(); + var curIdx = block.inputList.indexOf(/** @type {!Blockly.Input} */ (input)); + var fieldIdx = input.fieldRow.indexOf(location) + 1; + for (var i = curIdx, newInput; (newInput = block.inputList[i]); i++) { + var fieldRow = newInput.fieldRow; + while (fieldIdx < fieldRow.length) { + if (fieldRow[fieldIdx].isClickable() || Blockly.ASTNode.NAVIGATE_ALL_FIELDS) { + return Blockly.ASTNode.createFieldNode(fieldRow[fieldIdx]); + } + fieldIdx++; + } + fieldIdx = 0; + if (newInput.connection) { + return Blockly.ASTNode.createInputNode(newInput); + } + } + return null; +}; + +/** + * Given an input find the previous editable field or an input with a non null + * connection in the same block. The current location must be an input + * connection. + * @return {Blockly.ASTNode} The AST node holding the previous field or + * connection. + * @private + */ +Blockly.ASTNode.prototype.findPrevForInput_ = function() { + var location = /** @type {!Blockly.Connection} */ (this.location_); + var parentInput = location.getParentInput(); + var block = parentInput.getSourceBlock(); + var curIdx = block.inputList.indexOf(parentInput); + for (var i = curIdx, input; (input = block.inputList[i]); i--) { + if (input.connection && input !== parentInput) { + return Blockly.ASTNode.createInputNode(input); + } + var fieldRow = input.fieldRow; + for (var j = fieldRow.length - 1, field; (field = fieldRow[j]); j--) { + if (field.isClickable() || Blockly.ASTNode.NAVIGATE_ALL_FIELDS) { + return Blockly.ASTNode.createFieldNode(field); + } + } + } + return null; +}; + +/** + * Given a field find the previous editable field or an input with a non null + * connection in the same block. The current location must be a field. + * @return {Blockly.ASTNode} The AST node holding the previous input or field. + * @private + */ +Blockly.ASTNode.prototype.findPrevForField_ = function() { + var location = /** @type {!Blockly.Field} */ (this.location_); + var parentInput = location.getParentInput(); + var block = location.getSourceBlock(); + var curIdx = block.inputList.indexOf( + /** @type {!Blockly.Input} */ (parentInput)); + var fieldIdx = parentInput.fieldRow.indexOf(location) - 1; + for (var i = curIdx, input; (input = block.inputList[i]); i--) { + if (input.connection && input !== parentInput) { + return Blockly.ASTNode.createInputNode(input); + } + var fieldRow = input.fieldRow; + while (fieldIdx > -1) { + if (fieldRow[fieldIdx].isClickable() || Blockly.ASTNode.NAVIGATE_ALL_FIELDS) { + return Blockly.ASTNode.createFieldNode(fieldRow[fieldIdx]); + } + fieldIdx--; + } + // Reset the fieldIdx to the length of the field row of the previous input. + if (i - 1 >= 0) { + fieldIdx = block.inputList[i - 1].fieldRow.length - 1; + } + } + return null; +}; + +/** + * Navigate between stacks of blocks on the workspace. + * @param {boolean} forward True to go forward. False to go backwards. + * @return {Blockly.ASTNode} The first block of the next stack or null if there + * are no blocks on the workspace. + * @private + */ +Blockly.ASTNode.prototype.navigateBetweenStacks_ = function(forward) { + var curLocation = this.getLocation(); + if (!(curLocation instanceof Blockly.Block)) { + curLocation = /** @type {!Blockly.IASTNodeLocationWithBlock} */ ( + curLocation).getSourceBlock(); + } + if (!curLocation || !curLocation.workspace) { + return null; + } + var curRoot = curLocation.getRootBlock(); + var topBlocks = curRoot.workspace.getTopBlocks(true); + for (var i = 0, topBlock; (topBlock = topBlocks[i]); i++) { + if (curRoot.id == topBlock.id) { + var offset = forward ? 1 : -1; + var resultIndex = i + offset; + if (resultIndex == -1 || resultIndex == topBlocks.length) { + return null; + } + return Blockly.ASTNode.createStackNode(topBlocks[resultIndex]); + } + } + throw Error('Couldn\'t find ' + (forward ? 'next' : 'previous') + ' stack?!'); +}; + +/** + * Finds the top most AST node for a given block. + * This is either the previous connection, output connection or block depending + * on what kind of connections the block has. + * @param {!Blockly.Block} block The block that we want to find the top + * connection on. + * @return {!Blockly.ASTNode} The AST node containing the top connection. + * @private + */ +Blockly.ASTNode.prototype.findTopASTNodeForBlock_ = function(block) { + var topConnection = block.previousConnection || block.outputConnection; + if (topConnection) { + return /** @type {!Blockly.ASTNode} */ (Blockly.ASTNode.createConnectionNode( + topConnection)); + } else { + return /** @type {!Blockly.ASTNode} */ (Blockly.ASTNode.createBlockNode( + block)); + } +}; + +/** + * Get the AST node pointing to the input that the block is nested under or if + * the block is not nested then get the stack AST node. + * @param {Blockly.Block} block The source block of the current location. + * @return {Blockly.ASTNode} The AST node pointing to the input connection or + * the top block of the stack this block is in. + * @private + */ +Blockly.ASTNode.prototype.getOutAstNodeForBlock_ = function(block) { + if (!block) { + return null; + } + var topBlock; + // If the block doesn't have a previous connection then it is the top of the + // substack. + topBlock = block.getTopStackBlock(); + var topConnection = topBlock.previousConnection || topBlock.outputConnection; + // If the top connection has a parentInput, create an AST node pointing to + // that input. + if (topConnection && topConnection.targetConnection && + topConnection.targetConnection.getParentInput()) { + return Blockly.ASTNode.createInputNode( + topConnection.targetConnection.getParentInput()); + } else { + // Go to stack level if you are not underneath an input. + return Blockly.ASTNode.createStackNode(topBlock); + } +}; + +/** + * Find the first editable field or input with a connection on a given block. + * @param {!Blockly.Block} block The source block of the current location. + * @return {Blockly.ASTNode} An AST node pointing to the first field or input. + * Null if there are no editable fields or inputs with connections on the block. + * @private + */ +Blockly.ASTNode.prototype.findFirstFieldOrInput_ = function(block) { + var inputs = block.inputList; + for (var i = 0, input; (input = inputs[i]); i++) { + var fieldRow = input.fieldRow; + for (var j = 0, field; (field = fieldRow[j]); j++) { + if (field.isClickable() || Blockly.ASTNode.NAVIGATE_ALL_FIELDS) { + return Blockly.ASTNode.createFieldNode(field); + } + } + if (input.connection) { + return Blockly.ASTNode.createInputNode(input); + } + } + return null; +}; + +/** + * 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. + */ +Blockly.ASTNode.prototype.getSourceBlock = function() { + if (this.getType() === Blockly.ASTNode.types.BLOCK) { + return /** @type {Blockly.Block} */ (this.getLocation()); + } else if (this.getType() === Blockly.ASTNode.types.STACK) { + return /** @type {Blockly.Block} */ (this.getLocation()); + } else if (this.getType() === Blockly.ASTNode.types.WORKSPACE) { + return null; + } else { + return /** @type {Blockly.IASTNodeLocationWithBlock} */ ( + this.getLocation()).getSourceBlock(); + } +}; + +/** + * 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. + */ +Blockly.ASTNode.prototype.next = function() { + switch (this.type_) { + case Blockly.ASTNode.types.STACK: + return this.navigateBetweenStacks_(true); + + case Blockly.ASTNode.types.OUTPUT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + return Blockly.ASTNode.createBlockNode(connection.getSourceBlock()); + + case Blockly.ASTNode.types.FIELD: + return this.findNextForField_(); + + case Blockly.ASTNode.types.INPUT: + return this.findNextForInput_(); + + case Blockly.ASTNode.types.BLOCK: + var block = /** @type {!Blockly.Block} */ (this.location_); + var nextConnection = block.nextConnection; + return Blockly.ASTNode.createConnectionNode(nextConnection); + + case Blockly.ASTNode.types.PREVIOUS: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + return Blockly.ASTNode.createBlockNode(connection.getSourceBlock()); + + case Blockly.ASTNode.types.NEXT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + var targetConnection = connection.targetConnection; + return Blockly.ASTNode.createConnectionNode(targetConnection); + } + + return null; +}; + +/** + * 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. + */ +Blockly.ASTNode.prototype.in = function() { + switch (this.type_) { + case Blockly.ASTNode.types.WORKSPACE: + var workspace = /** @type {!Blockly.Workspace} */ (this.location_); + var topBlocks = workspace.getTopBlocks(true); + if (topBlocks.length > 0) { + return Blockly.ASTNode.createStackNode(topBlocks[0]); + } + break; + + case Blockly.ASTNode.types.STACK: + var block = /** @type {!Blockly.Block} */ (this.location_); + return this.findTopASTNodeForBlock_(block); + + case Blockly.ASTNode.types.BLOCK: + var block = /** @type {!Blockly.Block} */ (this.location_); + return this.findFirstFieldOrInput_(block); + + case Blockly.ASTNode.types.INPUT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + var targetConnection = connection.targetConnection; + return Blockly.ASTNode.createConnectionNode(targetConnection); + } + + return null; +}; + +/** + * 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. + */ +Blockly.ASTNode.prototype.prev = function() { + switch (this.type_) { + case Blockly.ASTNode.types.STACK: + return this.navigateBetweenStacks_(false); + + case Blockly.ASTNode.types.OUTPUT: + return null; + + case Blockly.ASTNode.types.FIELD: + return this.findPrevForField_(); + + case Blockly.ASTNode.types.INPUT: + return this.findPrevForInput_(); + + case Blockly.ASTNode.types.BLOCK: + var block = /** @type {!Blockly.Block} */ (this.location_); + var topConnection = block.previousConnection || block.outputConnection; + return Blockly.ASTNode.createConnectionNode(topConnection); + + case Blockly.ASTNode.types.PREVIOUS: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + var targetConnection = connection.targetConnection; + if (targetConnection && !targetConnection.getParentInput()) { + return Blockly.ASTNode.createConnectionNode(targetConnection); + } + break; + + case Blockly.ASTNode.types.NEXT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + return Blockly.ASTNode.createBlockNode(connection.getSourceBlock()); + } + + return null; +}; + +/** + * 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. + */ +Blockly.ASTNode.prototype.out = function() { + switch (this.type_) { + case Blockly.ASTNode.types.STACK: + var block = /** @type {!Blockly.Block} */ (this.location_); + var blockPos = block.getRelativeToSurfaceXY(); + // TODO: Make sure this is in the bounds of the workspace. + var wsCoordinate = new Blockly.utils.Coordinate( + blockPos.x, blockPos.y + Blockly.ASTNode.DEFAULT_OFFSET_Y); + return Blockly.ASTNode.createWorkspaceNode(block.workspace, wsCoordinate); + + case Blockly.ASTNode.types.OUTPUT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + var target = connection.targetConnection; + if (target) { + return Blockly.ASTNode.createConnectionNode(target); + } + return Blockly.ASTNode.createStackNode(connection.getSourceBlock()); + + case Blockly.ASTNode.types.FIELD: + var field = /** @type {!Blockly.Field} */ (this.location_); + return Blockly.ASTNode.createBlockNode(field.getSourceBlock()); + + case Blockly.ASTNode.types.INPUT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + return Blockly.ASTNode.createBlockNode(connection.getSourceBlock()); + + case Blockly.ASTNode.types.BLOCK: + var block = /** @type {!Blockly.Block} */ (this.location_); + return this.getOutAstNodeForBlock_(block); + + case Blockly.ASTNode.types.PREVIOUS: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + return this.getOutAstNodeForBlock_(connection.getSourceBlock()); + + case Blockly.ASTNode.types.NEXT: + var connection = /** @type {!Blockly.Connection} */ (this.location_); + return this.getOutAstNodeForBlock_(connection.getSourceBlock()); + } + + return null; +}; diff --git a/static/js/dist/core/keyboard_nav/basic_cursor.js b/static/js/dist/core/keyboard_nav/basic_cursor.js new file mode 100644 index 0000000..dca5087 --- /dev/null +++ b/static/js/dist/core/keyboard_nav/basic_cursor.js @@ -0,0 +1,208 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing a basic cursor. + * Used to demo switching between different cursors. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.BasicCursor'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.Cursor'); + + +/** + * 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} + */ +Blockly.BasicCursor = function() { + Blockly.BasicCursor.superClass_.constructor.call(this); +}; +Blockly.utils.object.inherits(Blockly.BasicCursor, Blockly.Cursor); + +/** + * 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.BasicCursor.prototype.next = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = this.getNextNode_(curNode, this.validNode_); + + 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.BasicCursor.prototype.in = function() { + return this.next(); +}; + +/** + * 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.BasicCursor.prototype.prev = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = this.getPreviousNode_(curNode, this.validNode_); + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * For a basic cursor we only have the ability to go next and previous, 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.BasicCursor.prototype.out = function() { + return this.prev(); +}; + +/** + * 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 + */ +Blockly.BasicCursor.prototype.getNextNode_ = function(node, isValid) { + if (!node) { + return null; + } + var newNode = node.in() || node.next(); + if (isValid(newNode)) { + return newNode; + } else if (newNode) { + return this.getNextNode_(newNode, isValid); + } + var siblingOrParent = this.findSiblingOrParent_(node.out()); + if (isValid(siblingOrParent)) { + return siblingOrParent; + } else if (siblingOrParent) { + return this.getNextNode_(siblingOrParent, isValid); + } + return null; +}; + +/** + * 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 + */ +Blockly.BasicCursor.prototype.getPreviousNode_ = function(node, isValid) { + if (!node) { + return null; + } + var newNode = node.prev(); + + if (newNode) { + newNode = this.getRightMostChild_(newNode); + } else { + newNode = node.out(); + } + if (isValid(newNode)) { + return newNode; + } else if (newNode) { + return this.getPreviousNode_(newNode, isValid); + } + return null; +}; + +/** + * 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 + */ +Blockly.BasicCursor.prototype.validNode_ = function(node) { + var isValid = false; + var type = node && node.getType(); + if (type == Blockly.ASTNode.types.OUTPUT || + type == Blockly.ASTNode.types.INPUT || + type == Blockly.ASTNode.types.FIELD || + type == Blockly.ASTNode.types.NEXT || + type == Blockly.ASTNode.types.PREVIOUS || + type == Blockly.ASTNode.types.WORKSPACE) { + isValid = true; + } + return isValid; +}; + +/** + * From the given node find either the next valid sibling or parent. + * @param {Blockly.ASTNode} node The current position in the AST. + * @return {Blockly.ASTNode} The parent AST node or null if there are no + * valid parents. + * @private + */ +Blockly.BasicCursor.prototype.findSiblingOrParent_ = function(node) { + if (!node) { + return null; + } + var nextNode = node.next(); + if (nextNode) { + return nextNode; + } + return this.findSiblingOrParent_(node.out()); +}; + + +/** + * Get the right most child of a node. + * @param {Blockly.ASTNode} node The node to find the right most child of. + * @return {Blockly.ASTNode} The right most child of the given node, or the node + * if no child exists. + * @private + */ +Blockly.BasicCursor.prototype.getRightMostChild_ = function(node) { + if (!node.in()) { + return node; + } + var newNode = node.in(); + while (newNode.next()) { + newNode = newNode.next(); + } + return this.getRightMostChild_(newNode); + +}; diff --git a/static/js/dist/core/keyboard_nav/cursor.js b/static/js/dist/core/keyboard_nav/cursor.js new file mode 100644 index 0000000..8a2a3e9 --- /dev/null +++ b/static/js/dist/core/keyboard_nav/cursor.js @@ -0,0 +1,170 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing a cursor. + * Used primarily for keyboard navigation. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.Cursor'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.Marker'); +goog.require('Blockly.navigation'); +goog.require('Blockly.utils.object'); + +goog.requireType('Blockly.IBlocklyActionable'); +goog.requireType('Blockly.ShortcutRegistry'); + + +/** + * Class for a cursor. + * A cursor controls how a user navigates the Blockly AST. + * @constructor + * @extends {Blockly.Marker} + * @implements {Blockly.IBlocklyActionable} + */ +Blockly.Cursor = function() { + Blockly.Cursor.superClass_.constructor.call(this); + + /** + * @override + */ + this.type = 'cursor'; +}; +Blockly.utils.object.inherits(Blockly.Cursor, Blockly.Marker); + +/** + * 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 + */ +Blockly.Cursor.prototype.next = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + + var newNode = curNode.next(); + while (newNode && newNode.next() && + (newNode.getType() == Blockly.ASTNode.types.NEXT || + newNode.getType() == Blockly.ASTNode.types.BLOCK)) { + newNode = newNode.next(); + } + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * 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 + */ +Blockly.Cursor.prototype.in = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + // If we are on a previous or output connection, go to the block level before + // performing next operation. + if (curNode.getType() == Blockly.ASTNode.types.PREVIOUS || + curNode.getType() == Blockly.ASTNode.types.OUTPUT) { + curNode = curNode.next(); + } + var newNode = curNode.in(); + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * 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 + */ +Blockly.Cursor.prototype.prev = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = curNode.prev(); + + while (newNode && newNode.prev() && + (newNode.getType() == Blockly.ASTNode.types.NEXT || + newNode.getType() == Blockly.ASTNode.types.BLOCK)) { + newNode = newNode.prev(); + } + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * 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 + */ +Blockly.Cursor.prototype.out = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = curNode.out(); + + if (newNode && newNode.getType() == Blockly.ASTNode.types.BLOCK) { + newNode = newNode.prev() || newNode; + } + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * Handles the given action. + * This is only triggered when keyboard navigation is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ +Blockly.Cursor.prototype.onBlocklyAction = function(action) { + // If we are on a field give it the option to handle the action + if (this.getCurNode() && + this.getCurNode().getType() === Blockly.ASTNode.types.FIELD && + (/** @type {!Blockly.Field} */ (this.getCurNode().getLocation())) + .onBlocklyAction(action)) { + return true; + } + switch (action.name) { + case Blockly.navigation.actionNames.PREVIOUS: + this.prev(); + return true; + case Blockly.navigation.actionNames.OUT: + this.out(); + return true; + case Blockly.navigation.actionNames.NEXT: + this.next(); + return true; + case Blockly.navigation.actionNames.IN: + this.in(); + return true; + default: + return false; + } +}; diff --git a/static/js/dist/core/keyboard_nav/flyout_cursor.js b/static/js/dist/core/keyboard_nav/flyout_cursor.js new file mode 100644 index 0000000..3db0a52 --- /dev/null +++ b/static/js/dist/core/keyboard_nav/flyout_cursor.js @@ -0,0 +1,108 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing a cursor used to navigate the flyout. + * Used primarily for keyboard navigation. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.FlyoutCursor'); + +goog.require('Blockly.Cursor'); +goog.require('Blockly.navigation'); +goog.require('Blockly.utils.object'); + +goog.requireType('Blockly.ShortcutRegistry'); + + +/** + * Class for a flyout cursor. + * This controls how a user navigates blocks in the flyout. + * @constructor + * @extends {Blockly.Cursor} + */ +Blockly.FlyoutCursor = function() { + Blockly.FlyoutCursor.superClass_.constructor.call(this); +}; +Blockly.utils.object.inherits(Blockly.FlyoutCursor, Blockly.Cursor); + +/** + * Handles the given action. + * This is only triggered when keyboard navigation is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + * @override + */ +Blockly.FlyoutCursor.prototype.onBlocklyAction = function(action) { + switch (action.name) { + case Blockly.navigation.actionNames.PREVIOUS: + this.prev(); + return true; + case Blockly.navigation.actionNames.NEXT: + this.next(); + return true; + default: + return false; + } +}; + +/** + * 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. + * @override + */ +Blockly.FlyoutCursor.prototype.next = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = curNode.next(); + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * This is a no-op since a flyout cursor can not go in. + * @return {null} Always null. + * @override + */ +Blockly.FlyoutCursor.prototype.in = function() { + return null; +}; + +/** + * 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. + * @override + */ +Blockly.FlyoutCursor.prototype.prev = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = curNode.prev(); + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * This is a no-op since a flyout cursor can not go out. + * @return {null} Always null. + * @override + */ +Blockly.FlyoutCursor.prototype.out = function() { + return null; +}; diff --git a/static/js/dist/core/keyboard_nav/marker.js b/static/js/dist/core/keyboard_nav/marker.js new file mode 100644 index 0000000..2394e39 --- /dev/null +++ b/static/js/dist/core/keyboard_nav/marker.js @@ -0,0 +1,120 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing a marker. + * Used primarily for keyboard navigation to show a marked location. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.Marker'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.navigation'); + + +/** + * Class for a marker. + * This is used in keyboard navigation to save a location in the Blockly AST. + * @constructor + */ +Blockly.Marker = function() { + /** + * The colour of the marker. + * @type {?string} + */ + this.colour = null; + + /** + * The current location of the marker. + * @type {Blockly.ASTNode} + * @private + */ + this.curNode_ = null; + + /** + * The object in charge of drawing the visual representation of the current node. + * @type {Blockly.blockRendering.MarkerSvg} + * @private + */ + this.drawer_ = null; + + /** + * The type of the marker. + * @type {string} + */ + this.type = 'marker'; +}; + +/** + * Sets the object in charge of drawing the marker. + * @param {Blockly.blockRendering.MarkerSvg} drawer The object in charge of + * drawing the marker. + */ +Blockly.Marker.prototype.setDrawer = function(drawer) { + this.drawer_ = drawer; +}; + +/** + * Get the current drawer for the marker. + * @return {Blockly.blockRendering.MarkerSvg} The object in charge of drawing + * the marker. + */ +Blockly.Marker.prototype.getDrawer = function() { + return this.drawer_; +}; + +/** + * Gets the current location of the marker. + * @return {Blockly.ASTNode} The current field, connection, or block the marker + * is on. + */ +Blockly.Marker.prototype.getCurNode = function() { + return this.curNode_; +}; + +/** + * 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. + */ +Blockly.Marker.prototype.setCurNode = function(newNode) { + var oldNode = this.curNode_; + this.curNode_ = newNode; + if (this.drawer_) { + this.drawer_.draw(oldNode, this.curNode_); + } +}; + +/** + * Redraw the current marker. + * @package + */ +Blockly.Marker.prototype.draw = function() { + if (this.drawer_) { + this.drawer_.draw(this.curNode_, this.curNode_); + } +}; + +/** + * Hide the marker SVG. + */ +Blockly.Marker.prototype.hide = function() { + if (this.drawer_) { + this.drawer_.hide(); + } +}; + +/** + * Dispose of this marker. + */ +Blockly.Marker.prototype.dispose = function() { + if (this.getDrawer()) { + this.getDrawer().dispose(); + } +}; diff --git a/static/js/dist/core/keyboard_nav/navigation.js b/static/js/dist/core/keyboard_nav/navigation.js new file mode 100644 index 0000000..774544b --- /dev/null +++ b/static/js/dist/core/keyboard_nav/navigation.js @@ -0,0 +1,1224 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class in charge of handling actions related to keyboard + * navigation. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.navigation'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.constants'); +goog.require('Blockly.utils.Coordinate'); + + +/** + * 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 + */ +Blockly.navigation.loggingCallback = null; + +/** + * State indicating focus is currently on the flyout. + * @type {number} + * @const + */ +Blockly.navigation.STATE_FLYOUT = 1; + +/** + * State indicating focus is currently on the workspace. + * @type {number} + * @const + */ +Blockly.navigation.STATE_WS = 2; + +/** + * State indicating focus is currently on the toolbox. + * @type {number} + * @const + */ +Blockly.navigation.STATE_TOOLBOX = 3; + +/** + * The distance to move the cursor on the workspace. + * @type {number} + * @const + */ +Blockly.navigation.WS_MOVE_DISTANCE = 40; + +/** + * The current state the user is in. + * Initialized to workspace state since a user enters navigation mode by shift + * clicking on a block or workspace. + * @type {number} + * @private + */ +Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; + +/** + * Object holding default action names. + * @enum {string} + */ +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' +}; + +/** + * The name of the marker reserved for internal use. + * @type {string} + * @const + */ +Blockly.navigation.MARKER_NAME = 'local_marker_1'; + +/** ****** */ +/** Focus */ +/** ****** */ + +/** + * Get the local marker. + * @return {Blockly.Marker} The local marker for the main workspace. + */ +Blockly.navigation.getMarker = function() { + return Blockly.navigation.getNavigationWorkspace() + .getMarker(Blockly.navigation.MARKER_NAME); +}; + +/** + * Get the workspace that is being navigated. + * @return {!Blockly.WorkspaceSvg} The workspace being navigated. + * TODO: Remove this in favor or using passed in workspaces. + */ +Blockly.navigation.getNavigationWorkspace = function() { + return /** @type {!Blockly.WorkspaceSvg} */ (Blockly.getMainWorkspace()); +}; + +/** + * If a toolbox exists, set the navigation state to toolbox and select the first + * category in the toolbox. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + * @private + */ +Blockly.navigation.focusToolbox_ = function(workspace) { + var toolbox = workspace.getToolbox(); + if (toolbox) { + Blockly.navigation.currentState_ = Blockly.navigation.STATE_TOOLBOX; + Blockly.navigation.resetFlyout_(false /* shouldHide */); + + if (!Blockly.navigation.getMarker().getCurNode()) { + Blockly.navigation.markAtCursor_(); + } + if (!toolbox.getSelectedItem()) { + toolbox.selectItemByPosition(0); + } + } +}; + +/** + * Change focus to the flyout. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + * @private + */ +Blockly.navigation.focusFlyout_ = function(workspace) { + var topBlock = null; + Blockly.navigation.currentState_ = Blockly.navigation.STATE_FLYOUT; + var toolbox = workspace.getToolbox(); + var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); + + if (!Blockly.navigation.getMarker().getCurNode()) { + Blockly.navigation.markAtCursor_(); + } + + if (flyout && flyout.getWorkspace()) { + var topBlocks = flyout.getWorkspace().getTopBlocks(true); + if (topBlocks.length > 0) { + topBlock = topBlocks[0]; + var astNode = Blockly.ASTNode.createStackNode(topBlock); + Blockly.navigation.getFlyoutCursor_().setCurNode(astNode); + } + } +}; + +/** + * Finds where the cursor should go on the workspace. This is either the top + * block or a set position on the workspace. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + * @private + */ +Blockly.navigation.focusWorkspace_ = function(workspace) { + Blockly.hideChaff(); + var cursor = workspace.getCursor(); + var reset = !!workspace.getToolbox(); + var topBlocks = workspace.getTopBlocks(true); + + Blockly.navigation.resetFlyout_(reset); + Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; + if (topBlocks.length > 0) { + cursor.setCurNode(Blockly.ASTNode.createTopNode(topBlocks[0])); + } else { + // TODO: Find the center of the visible workspace. + var wsCoord = new Blockly.utils.Coordinate(100, 100); + var wsNode = Blockly.ASTNode.createWorkspaceNode(workspace, wsCoord); + cursor.setCurNode(wsNode); + } +}; + +/** ****************** */ +/** Flyout Navigation */ +/** ****************** */ + +/** + * Get the cursor from the flyouts workspace. + * @return {Blockly.FlyoutCursor} The flyouts cursor or null if no flyout exists. + * @private + */ +Blockly.navigation.getFlyoutCursor_ = function() { + var workspace = Blockly.navigation.getNavigationWorkspace(); + var cursor = null; + if (workspace.rendered) { + var toolbox = workspace.getToolbox(); + var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); + cursor = flyout ? flyout.getWorkspace().getCursor() : null; + } + return /** @type {Blockly.FlyoutCursor} */ (cursor); +}; + +/** + * 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. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + */ +Blockly.navigation.insertFromFlyout = function(workspace) { + var flyout = workspace.getFlyout(); + if (!flyout || !flyout.isVisible()) { + Blockly.navigation.warn_('Trying to insert from the flyout when the flyout does not ' + + ' exist or is not visible'); + return; + } + + var curBlock = /** @type {!Blockly.BlockSvg} */ ( + Blockly.navigation.getFlyoutCursor_().getCurNode().getLocation()); + if (!curBlock.isEnabled()) { + Blockly.navigation.warn_('Can\'t insert a disabled block.'); + return; + } + + var newBlock = flyout.createBlock(curBlock); + // Render to get the sizing right. + newBlock.render(); + // Connections are not tracked when the block is first created. Normally + // there's enough time for them to become tracked in the user's mouse + // movements, but not here. + newBlock.setConnectionTracking(true); + workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode(newBlock)); + if (!Blockly.navigation.modify_()) { + Blockly.navigation.warn_('Something went wrong while inserting a block from the flyout.'); + } + + Blockly.navigation.focusWorkspace_(workspace); + workspace.getCursor().setCurNode(Blockly.ASTNode.createTopNode(newBlock)); + Blockly.navigation.removeMark_(); +}; + +/** + * Reset flyout information, and optionally close the flyout. + * @param {boolean} shouldHide True if the flyout should be hidden. + * @private + */ +Blockly.navigation.resetFlyout_ = function(shouldHide) { + if (Blockly.navigation.getFlyoutCursor_()) { + Blockly.navigation.getFlyoutCursor_().hide(); + if (shouldHide) { + Blockly.navigation.getNavigationWorkspace().getFlyout().hide(); + } + } +}; + +/** **************** */ +/** Modify Workspace */ +/** **************** */ + +/** + * Warns the user if the cursor or marker is on a type that can not be connected. + * @return {boolean} True if the marker and cursor are valid types, false + * otherwise. + * @private + */ +Blockly.navigation.modifyWarn_ = function() { + var markerNode = Blockly.navigation.getMarker().getCurNode(); + var cursorNode = Blockly.navigation.getNavigationWorkspace() + .getCursor().getCurNode(); + + if (!markerNode) { + Blockly.navigation.warn_('Cannot insert with no marked node.'); + return false; + } + + if (!cursorNode) { + Blockly.navigation.warn_('Cannot insert with no cursor node.'); + return false; + } + var markerType = markerNode.getType(); + var cursorType = cursorNode.getType(); + + // Check the marker for invalid types. + if (markerType == Blockly.ASTNode.types.FIELD) { + Blockly.navigation.warn_('Should not have been able to mark a field.'); + return false; + } else if (markerType == Blockly.ASTNode.types.BLOCK) { + Blockly.navigation.warn_('Should not have been able to mark a block.'); + return false; + } else if (markerType == Blockly.ASTNode.types.STACK) { + Blockly.navigation.warn_('Should not have been able to mark a stack.'); + return false; + } + + // Check the cursor for invalid types. + if (cursorType == Blockly.ASTNode.types.FIELD) { + Blockly.navigation.warn_('Cannot attach a field to anything else.'); + return false; + } else if (cursorType == Blockly.ASTNode.types.WORKSPACE) { + Blockly.navigation.warn_('Cannot attach a workspace to anything else.'); + return false; + } + return true; +}; + +/** + * Disconnect the block from its parent and move to the position of the + * workspace node. + * @param {Blockly.BlockSvg} block The block to be moved to the workspace. + * @param {!Blockly.ASTNode} wsNode The workspace node holding the position the + * block will be moved to. + * @return {boolean} True if the block can be moved to the workspace, + * false otherwise. + * @private + */ +Blockly.navigation.moveBlockToWorkspace_ = function(block, wsNode) { + if (!block) { + return false; + } + if (block.isShadow()) { + Blockly.navigation.warn_('Cannot move a shadow block to the workspace.'); + return false; + } + if (block.getParent()) { + block.unplug(false); + } + block.moveTo(wsNode.getWsCoordinate()); + return true; +}; + +/** + * Handle the modifier key (currently I for Insert). + * Tries to connect the current marker and cursor location. Warns the user if + * the two locations can not be connected. + * @return {boolean} True if the key was handled; false if something went wrong. + * @private + */ +Blockly.navigation.modify_ = function() { + var markerNode = Blockly.navigation.getMarker().getCurNode(); + var cursorNode = Blockly.navigation.getNavigationWorkspace() + .getCursor().getCurNode(); + if (!Blockly.navigation.modifyWarn_()) { + return false; + } + + var markerType = markerNode.getType(); + var cursorType = cursorNode.getType(); + + var cursorLoc = cursorNode.getLocation(); + var markerLoc = markerNode.getLocation(); + + if (markerNode.isConnection() && cursorNode.isConnection()) { + cursorLoc = /** @type {!Blockly.RenderedConnection} */ (cursorLoc); + markerLoc = /** @type {!Blockly.RenderedConnection} */ (markerLoc); + return Blockly.navigation.connect_(cursorLoc, markerLoc); + } else if (markerNode.isConnection() && + (cursorType == Blockly.ASTNode.types.BLOCK || + cursorType == Blockly.ASTNode.types.STACK)) { + cursorLoc = /** @type {!Blockly.BlockSvg} */ (cursorLoc); + markerLoc = /** @type {!Blockly.RenderedConnection} */ (markerLoc); + return Blockly.navigation.insertBlock(cursorLoc, markerLoc); + } else if (markerType == Blockly.ASTNode.types.WORKSPACE) { + var block = cursorNode ? cursorNode.getSourceBlock() : null; + return Blockly.navigation.moveBlockToWorkspace_( + /** @type {Blockly.BlockSvg} */ (block), markerNode); + } + Blockly.navigation.warn_('Unexpected state in Blockly.navigation.modify_.'); + return false; +}; + +/** + * If one of the connections source blocks is a child of the other, disconnect + * the child. + * @param {!Blockly.RenderedConnection} movingConnection The connection that is + * being moved. + * @param {!Blockly.RenderedConnection} destConnection The connection to be + * moved to. + * @private + */ +Blockly.navigation.disconnectChild_ = function(movingConnection, destConnection) { + var movingBlock = movingConnection.getSourceBlock(); + var destBlock = destConnection.getSourceBlock(); + + if (movingBlock.getRootBlock() == destBlock.getRootBlock()) { + if (movingBlock.getDescendants(false).indexOf(destBlock) > -1) { + Blockly.navigation.getInferiorConnection_(destConnection).disconnect(); + } else { + Blockly.navigation.getInferiorConnection_(movingConnection).disconnect(); + } + } +}; + +/** + * If the two blocks are compatible move the moving connection to the target + * connection and connect them. + * @param {Blockly.RenderedConnection} movingConnection The connection that is + * being moved. + * @param {Blockly.RenderedConnection} destConnection The connection to be moved + * to. + * @return {boolean} True if the connections were connected, false otherwise. + * @private + */ +Blockly.navigation.moveAndConnect_ = function(movingConnection, destConnection) { + if (!movingConnection || !destConnection) { + return false; + } + var movingBlock = movingConnection.getSourceBlock(); + + var checker = movingConnection.getConnectionChecker(); + + if (checker.canConnect(movingConnection, destConnection, false)) { + Blockly.navigation.disconnectChild_(movingConnection, destConnection); + + if (!destConnection.isSuperior()) { + var rootBlock = movingBlock.getRootBlock(); + rootBlock.positionNearConnection(movingConnection, destConnection); + } + destConnection.connect(movingConnection); + return true; + } + return false; +}; + +/** + * If the given connection is superior find the inferior connection on the + * source block. + * @param {Blockly.RenderedConnection} connection The connection trying to be + * connected. + * @return {Blockly.RenderedConnection} The inferior connection or null if none + * exists. + * @private + */ +Blockly.navigation.getInferiorConnection_ = function(connection) { + var block = connection.getSourceBlock(); + if (!connection.isSuperior()) { + return connection; + } else if (block.previousConnection) { + return block.previousConnection; + } else if (block.outputConnection) { + return block.outputConnection; + } else { + return null; + } +}; + +/** + * If the given connection is inferior tries to find a superior connection to + * connect to. + * @param {Blockly.RenderedConnection} connection The connection trying to be + * connected. + * @return {Blockly.RenderedConnection} The superior connection or null if none + * exists. + * @private + */ +Blockly.navigation.getSuperiorConnection_ = function(connection) { + if (connection.isSuperior()) { + return connection; + } else if (connection.targetConnection) { + return connection.targetConnection; + } + return null; +}; + +/** + * Tries to connect the given connections. + * + * If the given connections are not compatible try finding compatible connections + * on the source blocks of the given connections. + * + * @param {Blockly.RenderedConnection} movingConnection The connection that is + * being moved. + * @param {Blockly.RenderedConnection} destConnection The connection to be moved + * to. + * @return {boolean} True if the two connections or their target connections + * were connected, false otherwise. + * @private + */ +Blockly.navigation.connect_ = function(movingConnection, destConnection) { + if (!movingConnection || !destConnection) { + return false; + } + + var movingInferior = Blockly.navigation.getInferiorConnection_(movingConnection); + var destSuperior = Blockly.navigation.getSuperiorConnection_(destConnection); + + var movingSuperior = Blockly.navigation.getSuperiorConnection_(movingConnection); + var destInferior = Blockly.navigation.getInferiorConnection_(destConnection); + + if (movingInferior && destSuperior && + Blockly.navigation.moveAndConnect_(movingInferior, destSuperior)) { + return true; + // Try swapping the inferior and superior connections on the blocks. + } else if (movingSuperior && destInferior && + Blockly.navigation.moveAndConnect_(movingSuperior, destInferior)) { + return true; + } else if (Blockly.navigation.moveAndConnect_(movingConnection, destConnection)){ + return true; + } else { + var checker = movingConnection.getConnectionChecker(); + var reason = checker.canConnectWithReason( + movingConnection, destConnection, false); + Blockly.navigation.warn_('Connection failed with error: ' + + checker.getErrorMessage(reason, movingConnection, destConnection)); + return false; + } +}; + +/** + * 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.BlockSvg} block The block to move. + * @param {!Blockly.RenderedConnection} destConnection The connection to connect + * to. + * @return {boolean} Whether the connection was successful. + */ +Blockly.navigation.insertBlock = function(block, destConnection) { + switch (destConnection.type) { + case Blockly.PREVIOUS_STATEMENT: + if (Blockly.navigation.connect_(block.nextConnection, destConnection)) { + return true; + } + break; + case Blockly.NEXT_STATEMENT: + if (Blockly.navigation.connect_(block.previousConnection, destConnection)) { + return true; + } + break; + case Blockly.INPUT_VALUE: + if (Blockly.navigation.connect_(block.outputConnection, destConnection)) { + return true; + } + break; + case Blockly.OUTPUT_VALUE: + for (var i = 0; i < block.inputList.length; i++) { + var inputConnection = /** @type {Blockly.RenderedConnection} */ ( + block.inputList[i].connection); + if (inputConnection && inputConnection.type === Blockly.INPUT_VALUE && + Blockly.navigation.connect_(inputConnection, destConnection)) { + return true; + } + } + // If there are no input values pass the output and destination connections + // to connect_ to find a way to connect the two. + if (block.outputConnection && + Blockly.navigation.connect_(block.outputConnection, destConnection)) { + return true; + } + break; + } + Blockly.navigation.warn_('This block can not be inserted at the marked location.'); + return false; +}; + +/** + * Disconnect the connection that the cursor is pointing to, and bump blocks. + * This is a no-op if the connection cannot be broken or if the cursor is not + * pointing to a connection. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + * @private + */ +Blockly.navigation.disconnectBlocks_ = function(workspace) { + var curNode = workspace.getCursor().getCurNode(); + if (!curNode.isConnection()) { + Blockly.navigation.log_('Cannot disconnect blocks when the cursor is not on a connection'); + return; + } + var curConnection = + /** @type {!Blockly.RenderedConnection} */ (curNode.getLocation()); + if (!curConnection.isConnected()) { + Blockly.navigation.log_('Cannot disconnect unconnected connection'); + return; + } + var superiorConnection = + curConnection.isSuperior() ? curConnection : curConnection.targetConnection; + + var inferiorConnection = + curConnection.isSuperior() ? curConnection.targetConnection : curConnection; + + if (inferiorConnection.getSourceBlock().isShadow()) { + Blockly.navigation.log_('Cannot disconnect a shadow block'); + return; + } + superiorConnection.disconnect(); + inferiorConnection.bumpAwayFrom(superiorConnection); + + var rootBlock = superiorConnection.getSourceBlock().getRootBlock(); + rootBlock.bringToFront(); + + var connectionNode = Blockly.ASTNode.createConnectionNode(superiorConnection); + workspace.getCursor().setCurNode(connectionNode); +}; + +/** ***************** */ +/** Helper Functions */ +/** ***************** */ + +/** + * Move the marker to the cursor's current location. + * @private + */ +Blockly.navigation.markAtCursor_ = function() { + Blockly.navigation.getMarker().setCurNode( + Blockly.navigation.getNavigationWorkspace().getCursor().getCurNode()); +}; + +/** + * Remove the marker from its current location and hide it. + * @private + */ +Blockly.navigation.removeMark_ = function() { + var marker = Blockly.navigation.getMarker(); + marker.setCurNode(null); + marker.hide(); +}; + +/** + * Set the current navigation state. + * @param {number} newState The new navigation state. + * @package + */ +Blockly.navigation.setState = function(newState) { + Blockly.navigation.currentState_ = newState; +}; + +/** + * Before a block is deleted move the cursor to the appropriate position. + * @param {!Blockly.BlockSvg} deletedBlock The block that is being deleted. + */ +Blockly.navigation.moveCursorOnBlockDelete = function(deletedBlock) { + var workspace = Blockly.navigation.getNavigationWorkspace(); + if (!workspace) { + return; + } + var cursor = workspace.getCursor(); + if (cursor) { + var curNode = cursor.getCurNode(); + var block = curNode ? curNode.getSourceBlock() : null; + + if (block === deletedBlock) { + // If the block has a parent move the cursor to their connection point. + if (block.getParent()) { + var topConnection = block.previousConnection || block.outputConnection; + if (topConnection) { + cursor.setCurNode( + Blockly.ASTNode.createConnectionNode(topConnection.targetConnection)); + } + } else { + // If the block is by itself move the cursor to the workspace. + cursor.setCurNode(Blockly.ASTNode.createWorkspaceNode(block.workspace, + block.getRelativeToSurfaceXY())); + } + // If the cursor is on a block whose parent is being deleted, move the + // cursor to the workspace. + } else if (block && deletedBlock.getChildren(false).indexOf(block) > -1) { + cursor.setCurNode(Blockly.ASTNode.createWorkspaceNode(block.workspace, + block.getRelativeToSurfaceXY())); + } + } +}; + +/** + * When a block that the cursor is on is mutated move the cursor to the block + * level. + * @param {!Blockly.BlockSvg} mutatedBlock The block that is being mutated. + * @package + */ +Blockly.navigation.moveCursorOnBlockMutation = function(mutatedBlock) { + var cursor = Blockly.navigation.getNavigationWorkspace().getCursor(); + if (cursor) { + var curNode = cursor.getCurNode(); + var block = curNode ? curNode.getSourceBlock() : null; + + if (block === mutatedBlock) { + cursor.setCurNode(Blockly.ASTNode.createBlockNode(block)); + } + } +}; + +/** + * Enable accessibility mode. + */ +Blockly.navigation.enableKeyboardAccessibility = function() { + var workspace = Blockly.navigation.getNavigationWorkspace(); + if (!workspace.keyboardAccessibilityMode) { + workspace.keyboardAccessibilityMode = true; + Blockly.navigation.focusWorkspace_(workspace); + } +}; + +/** + * Disable accessibility mode. + */ +Blockly.navigation.disableKeyboardAccessibility = function() { + var workspace = Blockly.navigation.getNavigationWorkspace(); + if (workspace.keyboardAccessibilityMode) { + workspace.keyboardAccessibilityMode = false; + workspace.getCursor().hide(); + Blockly.navigation.getMarker().hide(); + if (Blockly.navigation.getFlyoutCursor_()) { + Blockly.navigation.getFlyoutCursor_().hide(); + } + } +}; + +/** + * Navigation log handler. If loggingCallback is defined, use it. + * Otherwise just log to the console. + * @param {string} msg The message to log. + * @private + */ +Blockly.navigation.log_ = function(msg) { + if (Blockly.navigation.loggingCallback) { + Blockly.navigation.loggingCallback('log', msg); + } else { + console.log(msg); + } +}; + +/** + * Navigation warning handler. If loggingCallback is defined, use it. + * Otherwise call Blockly.navigation.warn_. + * @param {string} msg The warning message. + * @private + */ +Blockly.navigation.warn_ = function(msg) { + if (Blockly.navigation.loggingCallback) { + Blockly.navigation.loggingCallback('warn', msg); + } else { + console.warn(msg); + } +}; + +/** + * Navigation error handler. If loggingCallback is defined, use it. + * Otherwise call console.error. + * @param {string} msg The error message. + * @private + */ +Blockly.navigation.error_ = function(msg) { + if (Blockly.navigation.loggingCallback) { + Blockly.navigation.loggingCallback('error', msg); + } else { + console.error(msg); + } +}; + +/** ***************** */ +/** Handle Key Press */ +/** ***************** */ + +/** + * Move the workspace cursor in the given direction. + * @param {!Blockly.WorkspaceSvg} workspace The workspace the cursor is on. + * @param {number} xDirection -1 to move cursor left. 1 to move cursor right. + * @param {number} yDirection -1 to move cursor up. 1 to move cursor down. + * @return {boolean} True if the current node is a workspace, false otherwise. + * @private + */ +Blockly.navigation.moveWSCursor_ = function(workspace, xDirection, yDirection) { + var cursor = workspace.getCursor(); + var curNode = workspace.getCursor().getCurNode(); + + if (curNode.getType() !== Blockly.ASTNode.types.WORKSPACE) { + return false; + } + + var wsCoord = curNode.getWsCoordinate(); + var newX = xDirection * Blockly.navigation.WS_MOVE_DISTANCE + wsCoord.x; + var newY = yDirection * Blockly.navigation.WS_MOVE_DISTANCE + wsCoord.y; + + cursor.setCurNode(Blockly.ASTNode.createWorkspaceNode( + workspace, new Blockly.utils.Coordinate(newX, newY))); + return true; +}; + +/** + * Handles hitting the enter key on the workspace. + * @param {!Blockly.WorkspaceSvg} workspace The workspace the enter event + * originated from. + * @private + */ +Blockly.navigation.handleEnterForWS_ = function(workspace) { + var cursor = workspace.getCursor(); + var curNode = cursor.getCurNode(); + var nodeType = curNode.getType(); + if (nodeType == Blockly.ASTNode.types.FIELD) { + (/** @type {!Blockly.Field} */(curNode.getLocation())).showEditor(); + } else if (curNode.isConnection() || + nodeType == Blockly.ASTNode.types.WORKSPACE) { + Blockly.navigation.markAtCursor_(); + } else if (nodeType == Blockly.ASTNode.types.BLOCK) { + Blockly.navigation.warn_('Cannot mark a block.'); + } else if (nodeType == Blockly.ASTNode.types.STACK) { + Blockly.navigation.warn_('Cannot mark a stack.'); + } +}; + +/** ***************** */ +/** Register Items */ +/** ***************** */ + +/** + * Keyboard shortcut to go to the previous location when in keyboard navigation + * mode. + */ +Blockly.navigation.registerPrevious = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var previousShortcut = { + name: Blockly.navigation.actionNames.PREVIOUS, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode; + }, + callback: function(workspace, e, action) { + var toolbox = workspace.getToolbox(); + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + return workspace.getCursor().onBlocklyAction(action); + case Blockly.navigation.STATE_FLYOUT: + var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); + return !!(flyout && flyout.onBlocklyAction(action)); + case Blockly.navigation.STATE_TOOLBOX: + return toolbox && typeof toolbox.onBlocklyAction == 'function' ? + toolbox.onBlocklyAction(action) : + false; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(previousShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.W, previousShortcut.name); +}; + +/** + * Keyboard shortcut to go to the out location when in keyboard navigation + * mode. + */ +Blockly.navigation.registerOut = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var outShortcut = { + name: Blockly.navigation.actionNames.OUT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode; + }, + callback: function(workspace, e, action) { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + return workspace.getCursor().onBlocklyAction(action); + case Blockly.navigation.STATE_FLYOUT: + Blockly.navigation.focusToolbox_(workspace); + return true; + case Blockly.navigation.STATE_TOOLBOX: + var toolbox = workspace.getToolbox(); + return toolbox && typeof toolbox.onBlocklyAction == 'function' ? + toolbox.onBlocklyAction(action) : + false; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(outShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.A, outShortcut.name); +}; + +/** + * Keyboard shortcut to go to the next location when in keyboard navigation + * mode. + */ +Blockly.navigation.registerNext = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var nextShortcut = { + name: Blockly.navigation.actionNames.NEXT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode; + }, + callback: function(workspace, e, action) { + var toolbox = workspace.getToolbox(); + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + return workspace.getCursor().onBlocklyAction(action); + case Blockly.navigation.STATE_FLYOUT: + var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); + return !!(flyout && flyout.onBlocklyAction(action)); + case Blockly.navigation.STATE_TOOLBOX: + return toolbox && typeof toolbox.onBlocklyAction == 'function' ? + toolbox.onBlocklyAction(action) : + false; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(nextShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.S, nextShortcut.name); +}; + +/** + * Keyboard shortcut to go to the in location when in keyboard navigation mode. + */ +Blockly.navigation.registerIn = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var inShortcut = { + name: Blockly.navigation.actionNames.IN, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode; + }, + callback: function(workspace, e, action) { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + return workspace.getCursor().onBlocklyAction(action); + case Blockly.navigation.STATE_TOOLBOX: + var toolbox = workspace.getToolbox(); + var isHandled = + toolbox && typeof toolbox.onBlocklyAction == 'function' ? + toolbox.onBlocklyAction(action) : + false; + if (!isHandled) { + Blockly.navigation.focusFlyout_(workspace); + } + return true; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(inShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.D, inShortcut.name); +}; + +/** + * Keyboard shortcut to connect a block to a marked location when in keyboard + * navigation mode. + */ +Blockly.navigation.registerInsert = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var insertShortcut = { + name: Blockly.navigation.actionNames.INSERT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function() { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + return Blockly.navigation.modify_(); + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(insertShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.I, insertShortcut.name); +}; + +/** Keyboard shortcut to mark a location when in keyboard navigation mode. */ +Blockly.navigation.registerMark = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var markShortcut = { + name: Blockly.navigation.actionNames.MARK, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + Blockly.navigation.handleEnterForWS_(workspace); + return true; + case Blockly.navigation.STATE_FLYOUT: + Blockly.navigation.insertFromFlyout(workspace); + return true; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(markShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.ENTER, markShortcut.name); +}; + +/** + * Keyboard shortcut to disconnect two blocks when in keyboard navigation mode. + */ +Blockly.navigation.registerDisconnect = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var disconnectShortcut = { + name: Blockly.navigation.actionNames.DISCONNECT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + Blockly.navigation.disconnectBlocks_(workspace); + return true; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(disconnectShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.X, disconnectShortcut.name); +}; + +/** + * Keyboard shortcut to focus on the toolbox when in keyboard navigation mode. + */ +Blockly.navigation.registerToolboxFocus = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var focusToolboxShortcut = { + name: Blockly.navigation.actionNames.TOOLBOX, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_WS: + if (!workspace.getToolbox()) { + Blockly.navigation.focusFlyout_(workspace); + } else { + Blockly.navigation.focusToolbox_(workspace); + } + return true; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(focusToolboxShortcut); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.T, focusToolboxShortcut.name); +}; + +/** + * Keyboard shortcut to exit the current location and focus on the workspace + * when in keyboard navigation mode. + */ +Blockly.navigation.registerExit = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var exitShortcut = { + name: Blockly.navigation.actionNames.EXIT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode; + }, + callback: function(workspace) { + switch (Blockly.navigation.currentState_) { + case Blockly.navigation.STATE_FLYOUT: + Blockly.navigation.focusWorkspace_(workspace); + return true; + case Blockly.navigation.STATE_TOOLBOX: + Blockly.navigation.focusWorkspace_(workspace); + return true; + default: + return false; + } + } + }; + + Blockly.ShortcutRegistry.registry.register(exitShortcut, true); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.ESC, exitShortcut.name, true); + Blockly.ShortcutRegistry.registry.addKeyMapping( + Blockly.utils.KeyCodes.E, exitShortcut.name, true); +}; + +/** Keyboard shortcut to turn keyboard navigation on or off. */ +Blockly.navigation.registerToggleKeyboardNav = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var toggleKeyboardNavShortcut = { + name: Blockly.navigation.actionNames.TOGGLE_KEYBOARD_NAV, + callback: function(workspace) { + if (workspace.keyboardAccessibilityMode) { + Blockly.navigation.disableKeyboardAccessibility(); + } else { + Blockly.navigation.enableKeyboardAccessibility(); + } + return true; + } + }; + + Blockly.ShortcutRegistry.registry.register(toggleKeyboardNavShortcut); + var ctrlShiftK = Blockly.ShortcutRegistry.registry.createSerializedKey( + Blockly.utils.KeyCodes.K, + [Blockly.utils.KeyCodes.CTRL, Blockly.utils.KeyCodes.SHIFT]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + ctrlShiftK, toggleKeyboardNavShortcut.name); +}; + +/** + * Keyboard shortcut to move the cursor on the workspace to the left when in + * keyboard navigation mode. + */ +Blockly.navigation.registerWorkspaceMoveLeft = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var wsMoveLeftShortcut = { + name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_LEFT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + return Blockly.navigation.moveWSCursor_(workspace, -1, 0); + } + }; + + Blockly.ShortcutRegistry.registry.register(wsMoveLeftShortcut); + var shiftA = Blockly.ShortcutRegistry.registry.createSerializedKey( + Blockly.utils.KeyCodes.A, [Blockly.utils.KeyCodes.SHIFT]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + shiftA, wsMoveLeftShortcut.name); +}; + +/** + * Keyboard shortcut to move the cursor on the workspace to the right when in + * keyboard navigation mode. + */ +Blockly.navigation.registerWorkspaceMoveRight = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var wsMoveRightShortcut = { + name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_RIGHT, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + return Blockly.navigation.moveWSCursor_(workspace, 1, 0); + } + }; + + Blockly.ShortcutRegistry.registry.register(wsMoveRightShortcut); + var shiftD = Blockly.ShortcutRegistry.registry.createSerializedKey( + Blockly.utils.KeyCodes.D, [Blockly.utils.KeyCodes.SHIFT]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + shiftD, wsMoveRightShortcut.name); +}; + +/** + * Keyboard shortcut to move the cursor on the workspace up when in keyboard + * navigation mode. + */ +Blockly.navigation.registerWorkspaceMoveUp = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var wsMoveUpShortcut = { + name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_UP, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + return Blockly.navigation.moveWSCursor_(workspace, 0, -1); + } + }; + + Blockly.ShortcutRegistry.registry.register(wsMoveUpShortcut); + var shiftW = Blockly.ShortcutRegistry.registry.createSerializedKey( + Blockly.utils.KeyCodes.W, [Blockly.utils.KeyCodes.SHIFT]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + shiftW, wsMoveUpShortcut.name); +}; + +/** + * Keyboard shortcut to move the cursor on the workspace down when in keyboard + * navigation mode. + */ +Blockly.navigation.registerWorkspaceMoveDown = function() { + /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ + var wsMoveDownShortcut = { + name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_DOWN, + preconditionFn: function(workspace) { + return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; + }, + callback: function(workspace) { + return Blockly.navigation.moveWSCursor_(workspace, 0, 1); + } + }; + + Blockly.ShortcutRegistry.registry.register(wsMoveDownShortcut); + var shiftW = Blockly.ShortcutRegistry.registry.createSerializedKey( + Blockly.utils.KeyCodes.S, [Blockly.utils.KeyCodes.SHIFT]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + shiftW, wsMoveDownShortcut.name); +}; + +/** + * Registers all default keyboard shortcut items for keyboard navigation. This + * should be called once per instance of KeyboardShortcutRegistry. + * @package + */ +Blockly.navigation.registerNavigationShortcuts = function() { + Blockly.navigation.registerIn(); + Blockly.navigation.registerNext(); + Blockly.navigation.registerOut(); + Blockly.navigation.registerPrevious(); + + Blockly.navigation.registerWorkspaceMoveDown(); + Blockly.navigation.registerWorkspaceMoveLeft(); + Blockly.navigation.registerWorkspaceMoveRight(); + Blockly.navigation.registerWorkspaceMoveUp(); + + Blockly.navigation.registerDisconnect(); + Blockly.navigation.registerExit(); + Blockly.navigation.registerInsert(); + Blockly.navigation.registerMark(); + Blockly.navigation.registerToggleKeyboardNav(); + Blockly.navigation.registerToolboxFocus(); +}; diff --git a/static/js/dist/core/keyboard_nav/tab_navigate_cursor.js b/static/js/dist/core/keyboard_nav/tab_navigate_cursor.js new file mode 100644 index 0000000..9b403bd --- /dev/null +++ b/static/js/dist/core/keyboard_nav/tab_navigate_cursor.js @@ -0,0 +1,48 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The class representing a cursor that is used to navigate + * between tab navigable fields. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +goog.provide('Blockly.TabNavigateCursor'); + +goog.require('Blockly.ASTNode'); +goog.require('Blockly.BasicCursor'); +goog.require('Blockly.utils.object'); + + +/** + * A cursor for navigating between tab navigable fields. + * @constructor + * @extends {Blockly.BasicCursor} + */ +Blockly.TabNavigateCursor = function() { + Blockly.TabNavigateCursor.superClass_.constructor.call(this); +}; +Blockly.utils.object.inherits(Blockly.TabNavigateCursor, Blockly.BasicCursor); + +/** + * Skip all nodes except for tab navigable fields. + * @param {Blockly.ASTNode} node The AST node to check whether it is valid. + * @return {boolean} True if the node should be visited, false otherwise. + * @override + */ +Blockly.TabNavigateCursor.prototype.validNode_ = function(node) { + var isValid = false; + var type = node && node.getType(); + if (node) { + var location = /** @type {Blockly.Field} */ (node.getLocation()); + if (type == Blockly.ASTNode.types.FIELD && + location && location.isTabNavigable() && location.isClickable()) { + isValid = true; + } + } + return isValid; +}; diff --git a/static/js/dist/core/marker_manager.js b/static/js/dist/core/marker_manager.js new file mode 100644 index 0000000..d808171 --- /dev/null +++ b/static/js/dist/core/marker_manager.js @@ -0,0 +1,183 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object in charge of managing markers and the cursor. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.MarkerManager'); + +goog.require('Blockly.Cursor'); +goog.require('Blockly.Marker'); + + +/** + * Class to manage the multiple markers and the cursor on a workspace. + * @param {!Blockly.WorkspaceSvg} workspace The workspace for the marker manager. + * @constructor + * @package + */ +Blockly.MarkerManager = function(workspace){ + /** + * The cursor. + * @type {Blockly.Cursor} + * @private + */ + this.cursor_ = null; + + /** + * The cursor's svg element. + * @type {SVGElement} + * @private + */ + this.cursorSvg_ = null; + + /** + * The map of markers for the workspace. + * @type {!Object} + * @private + */ + this.markers_ = {}; + + /** + * The workspace this marker manager is associated with. + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = workspace; +}; + +/** + * 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. + */ +Blockly.MarkerManager.prototype.registerMarker = function(id, marker) { + if (this.markers_[id]) { + this.unregisterMarker(id); + } + marker.setDrawer(this.workspace_.getRenderer() + .makeMarkerDrawer(this.workspace_, marker)); + this.setMarkerSvg(marker.getDrawer().createDom()); + this.markers_[id] = marker; +}; + +/** + * Unregister the marker by removing it from the map of markers. + * @param {string} id The id of the marker to unregister. + */ +Blockly.MarkerManager.prototype.unregisterMarker = function(id) { + var marker = this.markers_[id]; + if (marker) { + marker.dispose(); + delete this.markers_[id]; + } else { + throw Error('Marker with id ' + id + ' does not exist. Can only unregister' + + 'markers that exist.'); + } +}; + +/** + * Get the cursor for the workspace. + * @return {Blockly.Cursor} The cursor for this workspace. + */ +Blockly.MarkerManager.prototype.getCursor = function() { + return this.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. + */ +Blockly.MarkerManager.prototype.getMarker = function(id) { + return this.markers_[id]; +}; + +/** + * Sets the cursor and initializes the drawer for use with keyboard navigation. + * @param {Blockly.Cursor} cursor The cursor used to move around this workspace. + */ +Blockly.MarkerManager.prototype.setCursor = function(cursor) { + if (this.cursor_ && this.cursor_.getDrawer()) { + this.cursor_.getDrawer().dispose(); + } + this.cursor_ = cursor; + if (this.cursor_) { + var drawer = this.workspace_.getRenderer() + .makeMarkerDrawer(this.workspace_, this.cursor_); + this.cursor_.setDrawer(drawer); + this.setCursorSvg(this.cursor_.getDrawer().createDom()); + } +}; + +/** + * 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 + */ +Blockly.MarkerManager.prototype.setCursorSvg = function(cursorSvg) { + if (!cursorSvg) { + this.cursorSvg_ = null; + return; + } + + this.workspace_.getBlockCanvas().appendChild(cursorSvg); + this.cursorSvg_ = cursorSvg; +}; + +/** + * 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 + */ +Blockly.MarkerManager.prototype.setMarkerSvg = function(markerSvg) { + if (!markerSvg) { + this.markerSvg_ = null; + return; + } + + if (this.workspace_.getBlockCanvas()) { + if (this.cursorSvg_) { + this.workspace_.getBlockCanvas().insertBefore(markerSvg, this.cursorSvg_); + } else { + this.workspace_.getBlockCanvas().appendChild(markerSvg); + } + } +}; + +/** + * Redraw the attached cursor svg if needed. + * @package + */ +Blockly.MarkerManager.prototype.updateMarkers = function() { + if (this.workspace_.keyboardAccessibilityMode && this.cursorSvg_) { + this.workspace_.getCursor().draw(); + } +}; + +/** + * Dispose of the marker manager. + * Go through and delete all markers associated with this marker manager. + * @suppress {checkTypes} + * @package + */ +Blockly.MarkerManager.prototype.dispose = function() { + var markerIds = Object.keys(this.markers_); + for (var i = 0, markerId; (markerId = markerIds[i]); i++) { + this.unregisterMarker(markerId); + } + this.markers_ = null; + if (this.cursor_) { + this.cursor_.dispose(); + this.cursor_ = null; + } +}; diff --git a/static/js/dist/core/menu.js b/static/js/dist/core/menu.js new file mode 100644 index 0000000..a1621e8 --- /dev/null +++ b/static/js/dist/core/menu.js @@ -0,0 +1,465 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly menu similar to Closure's goog.ui.Menu + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +goog.provide('Blockly.Menu'); + +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.KeyCodes'); +goog.require('Blockly.utils.style'); + + +/** + * A basic menu class. + * @constructor + */ +Blockly.Menu = function() { + /** + * Array of menu items. + * (Nulls are never in the array, but typing the array as nullable prevents + * the compiler from objecting to .indexOf(null)) + * @type {!Array.} + * @private + */ + this.menuItems_ = []; + + /** + * 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 + */ + this.openingCoords = null; + + /** + * This is the element that we will listen to the real focus events on. + * A value of null means no menu item is highlighted. + * @type {Blockly.MenuItem} + * @private + */ + this.highlightedItem_ = null; + + /** + * Mouse over event data. + * @type {?Blockly.EventData} + * @private + */ + this.mouseOverHandler_ = null; + + /** + * Click event data. + * @type {?Blockly.EventData} + * @private + */ + this.clickHandler_ = null; + + /** + * Mouse enter event data. + * @type {?Blockly.EventData} + * @private + */ + this.mouseEnterHandler_ = null; + + /** + * Mouse leave event data. + * @type {?Blockly.EventData} + * @private + */ + this.mouseLeaveHandler_ = null; + + /** + * Key down event data. + * @type {?Blockly.EventData} + * @private + */ + this.onKeyDownHandler_ = null; + + /** + * The menu's root DOM element. + * @type {Element} + * @private + */ + this.element_ = null; + + /** + * ARIA name for this menu. + * @type {?Blockly.utils.aria.Role} + * @private + */ + this.roleName_ = null; +}; + + +/** + * Add a new menu item to the bottom of this menu. + * @param {!Blockly.MenuItem} menuItem Menu item to append. + */ +Blockly.Menu.prototype.addChild = function(menuItem) { + this.menuItems_.push(menuItem); +}; + +/** + * Creates the menu DOM. + * @param {!Element} container Element upon which to append this menu. + */ +Blockly.Menu.prototype.render = function(container) { + var element = /** @type {!HTMLDivElement} */ (document.createElement('div')); + // goog-menu is deprecated, use blocklyMenu. May 2020. + element.className = 'blocklyMenu goog-menu blocklyNonSelectable'; + element.tabIndex = 0; + if (this.roleName_) { + Blockly.utils.aria.setRole(element, this.roleName_); + } + this.element_ = element; + + // Add menu items. + for (var i = 0, menuItem; (menuItem = this.menuItems_[i]); i++) { + element.appendChild(menuItem.createDom()); + } + + // Add event handlers. + this.mouseOverHandler_ = Blockly.bindEventWithChecks_(element, + 'mouseover', this, this.handleMouseOver_, true); + this.clickHandler_ = Blockly.bindEventWithChecks_(element, + 'click', this, this.handleClick_, true); + this.mouseEnterHandler_ = Blockly.bindEventWithChecks_(element, + 'mouseenter', this, this.handleMouseEnter_, true); + this.mouseLeaveHandler_ = Blockly.bindEventWithChecks_(element, + 'mouseleave', this, this.handleMouseLeave_, true); + this.onKeyDownHandler_ = Blockly.bindEventWithChecks_(element, + 'keydown', this, this.handleKeyEvent_); + + container.appendChild(element); +}; + +/** + * Gets the menu's element. + * @return {Element} The DOM element. + * @package + */ +Blockly.Menu.prototype.getElement = function() { + return this.element_; +}; + +/** + * Focus the menu element. + * @package + */ +Blockly.Menu.prototype.focus = function() { + var el = this.getElement(); + if (el) { + el.focus({preventScroll:true}); + Blockly.utils.dom.addClass(el, 'blocklyFocused'); + } +}; + +/** + * Blur the menu element. + * @private + */ +Blockly.Menu.prototype.blur_ = function() { + var el = this.getElement(); + if (el) { + el.blur(); + Blockly.utils.dom.removeClass(el, 'blocklyFocused'); + } +}; + +/** + * Set the menu accessibility role. + * @param {!Blockly.utils.aria.Role} roleName role name. + * @package + */ +Blockly.Menu.prototype.setRole = function(roleName) { + this.roleName_ = roleName; +}; + +/** + * Dispose of this menu. + */ +Blockly.Menu.prototype.dispose = function() { + // Remove event handlers. + if (this.mouseOverHandler_) { + Blockly.unbindEvent_(this.mouseOverHandler_); + this.mouseOverHandler_ = null; + } + if (this.clickHandler_) { + Blockly.unbindEvent_(this.clickHandler_); + this.clickHandler_ = null; + } + if (this.mouseEnterHandler_) { + Blockly.unbindEvent_(this.mouseEnterHandler_); + this.mouseEnterHandler_ = null; + } + if (this.mouseLeaveHandler_) { + Blockly.unbindEvent_(this.mouseLeaveHandler_); + this.mouseLeaveHandler_ = null; + } + if (this.onKeyDownHandler_) { + Blockly.unbindEvent_(this.onKeyDownHandler_); + this.onKeyDownHandler_ = null; + } + + // Remove menu items. + for (var i = 0, menuItem; (menuItem = this.menuItems_[i]); i++) { + menuItem.dispose(); + } + this.element_ = null; +}; + +// Child component management. + +/** + * Returns the child menu item that owns the given DOM element, + * or null if no such menu item is found. + * @param {Element} elem DOM element whose owner is to be returned. + * @return {?Blockly.MenuItem} Menu item for which the DOM element belongs to. + * @private + */ +Blockly.Menu.prototype.getMenuItem_ = function(elem) { + var menuElem = this.getElement(); + // Node might be the menu border (resulting in no associated menu item), or + // a menu item's div, or some element within the menu item. + // Walk up parents until one meets either the menu's root element, or + // a menu item's div. + while (elem && elem != menuElem) { + if (Blockly.utils.dom.hasClass(elem, 'blocklyMenuItem')) { + // Having found a menu item's div, locate that menu item in this menu. + for (var i = 0, menuItem; (menuItem = this.menuItems_[i]); i++) { + if (menuItem.getElement() == elem) { + return menuItem; + } + } + } + elem = elem.parentElement; + } + return null; +}; + +// Highlight management. + +/** + * Highlights the given menu item, or clears highlighting if null. + * @param {Blockly.MenuItem} item Item to highlight, or null. + * @package + */ +Blockly.Menu.prototype.setHighlighted = function(item) { + var currentHighlighted = this.highlightedItem_; + if (currentHighlighted) { + currentHighlighted.setHighlighted(false); + this.highlightedItem_ = null; + } + if (item) { + item.setHighlighted(true); + this.highlightedItem_ = item; + // Bring the highlighted item into view. This has no effect if the menu is + // not scrollable. + var el = /** @type {!Element} */ (this.getElement()); + Blockly.utils.style.scrollIntoContainerView( + /** @type {!Element} */ (item.getElement()), el); + + Blockly.utils.aria.setState(el, Blockly.utils.aria.State.ACTIVEDESCENDANT, + item.getId()); + } +}; + +/** + * Highlights the next highlightable item (or the first if nothing is currently + * highlighted). + * @package + */ +Blockly.Menu.prototype.highlightNext = function() { + var index = this.menuItems_.indexOf(this.highlightedItem_); + this.highlightHelper_(index, 1); +}; + +/** + * Highlights the previous highlightable item (or the last if nothing is + * currently highlighted). + * @package + */ +Blockly.Menu.prototype.highlightPrevious = function() { + var index = this.menuItems_.indexOf(this.highlightedItem_); + this.highlightHelper_(index < 0 ? this.menuItems_.length : index, -1); +}; + +/** + * Highlights the first highlightable item. + * @private + */ +Blockly.Menu.prototype.highlightFirst_ = function() { + this.highlightHelper_(-1, 1); +}; + +/** + * Highlights the last highlightable item. + * @private + */ +Blockly.Menu.prototype.highlightLast_ = function() { + this.highlightHelper_(this.menuItems_.length, -1); +}; + +/** + * Helper function that manages the details of moving the highlight among + * child menuitems in response to keyboard events. + * @param {number} startIndex Start index. + * @param {number} delta Step direction: 1 to go down, -1 to go up. + * @private + */ +Blockly.Menu.prototype.highlightHelper_ = function(startIndex, delta) { + var index = startIndex + delta; + var menuItem; + while ((menuItem = this.menuItems_[index])) { + if (menuItem.isEnabled()) { + this.setHighlighted(menuItem); + break; + } + index += delta; + } +}; + +// Mouse events. + +/** + * Handles mouseover events. Highlight menuitems as the user hovers over them. + * @param {!Event} e Mouse event to handle. + * @private + */ +Blockly.Menu.prototype.handleMouseOver_ = function(e) { + var menuItem = this.getMenuItem_(/** @type {Element} */ (e.target)); + + if (menuItem) { + if (menuItem.isEnabled()) { + if (this.highlightedItem_ != menuItem) { + this.setHighlighted(menuItem); + } + } else { + this.setHighlighted(null); + } + } +}; + +/** + * Handles click events. Pass the event onto the child menuitem to handle. + * @param {!Event} e Click event to handle. + * @private + */ +Blockly.Menu.prototype.handleClick_ = function(e) { + var oldCoords = this.openingCoords; + // Clear out the saved opening coords immediately so they're not used twice. + this.openingCoords = null; + if (oldCoords && typeof e.clientX == 'number') { + var newCoords = new Blockly.utils.Coordinate(e.clientX, e.clientY); + if (Blockly.utils.Coordinate.distance(oldCoords, newCoords) < 1) { + // This menu was opened by a mousedown and we're handling the consequent + // click event. The coords haven't changed, meaning this was the same + // opening event. Don't do the usual behavior because the menu just popped + // up under the mouse and the user didn't mean to activate this item. + return; + } + } + + var menuItem = this.getMenuItem_(/** @type {Element} */ (e.target)); + if (menuItem) { + menuItem.performAction(); + } +}; + +/** + * Handles mouse enter events. Focus the element. + * @param {Event} _e Mouse event to handle. + * @private + */ +Blockly.Menu.prototype.handleMouseEnter_ = function(_e) { + this.focus(); +}; + +/** + * Handles mouse leave events. Blur and clear highlight. + * @param {Event} _e Mouse event to handle. + * @private + */ +Blockly.Menu.prototype.handleMouseLeave_ = function(_e) { + if (this.getElement()) { + this.blur_(); + this.setHighlighted(null); + } +}; + +// Keyboard events. + +/** + * Attempts to handle a keyboard event, if the menu item is enabled, by calling + * {@link handleKeyEventInternal_}. + * @param {!Event} e Key event to handle. + * @private + */ +Blockly.Menu.prototype.handleKeyEvent_ = function(e) { + if (!this.menuItems_.length) { + // Empty menu. + return; + } + if (e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) { + // Do not handle the key event if any modifier key is pressed. + return; + } + + var highlighted = this.highlightedItem_; + switch (e.keyCode) { + case Blockly.utils.KeyCodes.ENTER: + case Blockly.utils.KeyCodes.SPACE: + if (highlighted) { + highlighted.performAction(); + } + break; + + case Blockly.utils.KeyCodes.UP: + this.highlightPrevious(); + break; + + case Blockly.utils.KeyCodes.DOWN: + this.highlightNext(); + break; + + case Blockly.utils.KeyCodes.PAGE_UP: + case Blockly.utils.KeyCodes.HOME: + this.highlightFirst_(); + break; + + case Blockly.utils.KeyCodes.PAGE_DOWN: + case Blockly.utils.KeyCodes.END: + this.highlightLast_(); + break; + + default: + // Not a key the menu is interested in. + return; + } + // The menu used this key, don't let it have secondary effects. + e.preventDefault(); + e.stopPropagation(); +}; + +/** + * Get the size of a rendered menu. + * @return {!Blockly.utils.Size} Object with width and height properties. + * @package + */ +Blockly.Menu.prototype.getSize = function() { + var menuDom = this.getElement(); + var menuSize = Blockly.utils.style.getSize(/** @type {!Element} */ (menuDom)); + // Recalculate height for the total content, not only box height. + menuSize.height = menuDom.scrollHeight; + return menuSize; +}; diff --git a/static/js/dist/core/menuitem.js b/static/js/dist/core/menuitem.js new file mode 100644 index 0000000..8ff6cfc --- /dev/null +++ b/static/js/dist/core/menuitem.js @@ -0,0 +1,280 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly menu item similar to Closure's goog.ui.MenuItem + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +goog.provide('Blockly.MenuItem'); + +goog.require('Blockly.utils.aria'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.IdGenerator'); + + +/** + * Class representing an item in a menu. + * + * @param {string|!HTMLElement} content Text caption to display as the content + * of the item, or a HTML element to display. + * @param {string=} opt_value Data/model associated with the menu item. + * @constructor + */ +Blockly.MenuItem = function(content, opt_value) { + /** + * Human-readable text of this menu item, or the HTML element to display. + * @type {string|!HTMLElement} + * @private + */ + this.content_ = content; + + /** + * Machine-readable value of this menu item. + * @type {string|undefined} + * @private + */ + this.value_ = opt_value; + + /** + * Is the menu item clickable, as opposed to greyed-out. + * @type {boolean} + * @private + */ + this.enabled_ = true; + + /** + * The DOM element for the menu item. + * @type {?Element} + * @private + */ + this.element_ = null; + + /** + * Whether the menu item is rendered right-to-left. + * @type {boolean} + * @private + */ + this.rightToLeft_ = false; + + /** + * ARIA name for this menu. + * @type {?Blockly.utils.aria.Role} + * @private + */ + this.roleName_ = null; + + /** + * Is this menu item checkable. + * @type {boolean} + * @private + */ + this.checkable_ = false; + + /** + * Is this menu item currently checked. + * @type {boolean} + * @private + */ + this.checked_ = false; + + /** + * Is this menu item currently highlighted. + * @type {boolean} + * @private + */ + this.highlight_ = false; + + /** + * Bound function to call when this menu item is clicked. + * @type {Function} + * @private + */ + this.actionHandler_ = null; +}; + + +/** + * Creates the menuitem's DOM. + * @return {!Element} Completed DOM. + */ +Blockly.MenuItem.prototype.createDom = function() { + var element = document.createElement('div'); + element.id = Blockly.utils.IdGenerator.getNextUniqueId(); + this.element_ = element; + + // Set class and style + // goog-menuitem* is deprecated, use blocklyMenuItem*. May 2020. + element.className = 'blocklyMenuItem goog-menuitem ' + + (this.enabled_ ? '' : 'blocklyMenuItemDisabled goog-menuitem-disabled ') + + (this.checked_ ? 'blocklyMenuItemSelected goog-option-selected ' : '') + + (this.highlight_ ? + 'blocklyMenuItemHighlight goog-menuitem-highlight ' : '') + + (this.rightToLeft_ ? 'blocklyMenuItemRtl goog-menuitem-rtl ' : ''); + + var content = document.createElement('div'); + content.className = 'blocklyMenuItemContent goog-menuitem-content'; + // Add a checkbox for checkable menu items. + if (this.checkable_) { + var checkbox = document.createElement('div'); + checkbox.className = 'blocklyMenuItemCheckbox goog-menuitem-checkbox'; + content.appendChild(checkbox); + } + + var contentDom = /** @type {!HTMLElement} */ (this.content_); + if (typeof this.content_ == 'string') { + contentDom = document.createTextNode(this.content_); + } + content.appendChild(contentDom); + element.appendChild(content); + + // Initialize ARIA role and state. + if (this.roleName_) { + Blockly.utils.aria.setRole(element, this.roleName_); + } + Blockly.utils.aria.setState(element, Blockly.utils.aria.State.SELECTED, + (this.checkable_ && this.checked_) || false); + Blockly.utils.aria.setState(element, Blockly.utils.aria.State.DISABLED, + !this.enabled_); + + return element; +}; + +/** + * Dispose of this menu item. + */ +Blockly.MenuItem.prototype.dispose = function() { + this.element_ = null; +}; + +/** + * Gets the menu item's element. + * @return {Element} The DOM element. + * @package + */ +Blockly.MenuItem.prototype.getElement = function() { + return this.element_; +}; + +/** + * Gets the unique ID for this menu item. + * @return {string} Unique component ID. + * @package + */ +Blockly.MenuItem.prototype.getId = function() { + return this.element_.id; +}; + +/** + * Gets the value associated with the menu item. + * @return {*} value Value associated with the menu item. + * @package + */ +Blockly.MenuItem.prototype.getValue = function() { + return this.value_; +}; + +/** + * Set menu item's rendering direction. + * @param {boolean} rtl True if RTL, false if LTR. + * @package + */ +Blockly.MenuItem.prototype.setRightToLeft = function(rtl) { + this.rightToLeft_ = rtl; +}; + +/** + * Set the menu item's accessibility role. + * @param {!Blockly.utils.aria.Role} roleName Role name. + * @package + */ +Blockly.MenuItem.prototype.setRole = function(roleName) { + this.roleName_ = roleName; +}; + +/** + * 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 + */ +Blockly.MenuItem.prototype.setCheckable = function(checkable) { + this.checkable_ = checkable; +}; + +/** + * Checks or unchecks the component. + * @param {boolean} checked Whether to check or uncheck the component. + * @package + */ +Blockly.MenuItem.prototype.setChecked = function(checked) { + this.checked_ = checked; +}; + +/** + * Highlights or unhighlights the component. + * @param {boolean} highlight Whether to highlight or unhighlight the component. + * @package + */ +Blockly.MenuItem.prototype.setHighlighted = function(highlight) { + this.highlight_ = highlight; + + var el = this.getElement(); + if (el && this.isEnabled()) { + // goog-menuitem-highlight is deprecated, use blocklyMenuItemHighlight. + // May 2020. + var name = 'blocklyMenuItemHighlight'; + var nameDep = 'goog-menuitem-highlight'; + if (highlight) { + Blockly.utils.dom.addClass(el, name); + Blockly.utils.dom.addClass(el, nameDep); + } else { + Blockly.utils.dom.removeClass(el, name); + Blockly.utils.dom.removeClass(el, nameDep); + } + } +}; + +/** + * Returns true if the menu item is enabled, false otherwise. + * @return {boolean} Whether the menu item is enabled. + * @package + */ +Blockly.MenuItem.prototype.isEnabled = function() { + return this.enabled_; +}; + +/** + * Enables or disables the menu item. + * @param {boolean} enabled Whether to enable or disable the menu item. + * @package + */ +Blockly.MenuItem.prototype.setEnabled = function(enabled) { + this.enabled_ = enabled; +}; + +/** + * Performs the appropriate action when the menu item is activated + * by the user. + * @package + */ +Blockly.MenuItem.prototype.performAction = function() { + if (this.isEnabled() && this.actionHandler_) { + this.actionHandler_(this); + } +}; + +/** + * Set the handler that's called when the menu item is activated by the user. + * `obj` will be used as the 'this' object in the function when called. + * @param {function(!Blockly.MenuItem)} fn The handler. + * @param {!Object} obj Used as the 'this' object in fn when called. + * @package + */ +Blockly.MenuItem.prototype.onAction = function(fn, obj) { + this.actionHandler_ = fn.bind(obj); +}; diff --git a/static/js/dist/core/msg.js b/static/js/dist/core/msg.js new file mode 100644 index 0000000..8cf7a2c --- /dev/null +++ b/static/js/dist/core/msg.js @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2013 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Empty name space for the Message singleton. + * @author scr@google.com (Sheridan Rawlins) + */ +'use strict'; + +/** + * Name space for the Msg singleton. + * Msg gets populated in the message files. + */ +goog.provide('Blockly.Msg'); + +goog.require('Blockly.utils.global'); + + +/** + * Exported so that if Blockly is compiled with ADVANCED_COMPILATION, + * the Blockly.Msg object exists for message files included in script tags. + */ +if (!Blockly.utils.global['Blockly']) { + Blockly.utils.global['Blockly'] = {}; +} +if (!Blockly.utils.global['Blockly']['Msg']) { + Blockly.utils.global['Blockly']['Msg'] = Blockly.Msg; +} diff --git a/static/js/dist/core/mutator.js b/static/js/dist/core/mutator.js new file mode 100644 index 0000000..093a01d --- /dev/null +++ b/static/js/dist/core/mutator.js @@ -0,0 +1,562 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object representing a mutator dialog. A mutator allows the + * user to change the shape of a block using a nested blocks editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Mutator'); + +goog.require('Blockly.Bubble'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Events.BubbleOpen'); +goog.require('Blockly.Icon'); +goog.require('Blockly.navigation'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.global'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.toolbox'); +goog.require('Blockly.utils.xml'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.Xml'); + +goog.requireType('Blockly.utils.Metrics'); + + +/** + * Class for a mutator dialog. + * @param {!Array.} quarkNames List of names of sub-blocks for flyout. + * @extends {Blockly.Icon} + * @constructor + */ +Blockly.Mutator = function(quarkNames) { + Blockly.Mutator.superClass_.constructor.call(this, null); + this.quarkNames_ = quarkNames; +}; +Blockly.utils.object.inherits(Blockly.Mutator, Blockly.Icon); + +/** + * Width of workspace. + * @private + */ +Blockly.Mutator.prototype.workspaceWidth_ = 0; + +/** + * Height of workspace. + * @private + */ +Blockly.Mutator.prototype.workspaceHeight_ = 0; + +/** + * Set the block this mutator is associated with. + * @param {Blockly.BlockSvg} block The block associated with this mutator. + * @package + */ +Blockly.Mutator.prototype.setBlock = function(block) { + this.block_ = block; +}; + +/** + * Returns the workspace inside this mutator icon's bubble. + * @return {Blockly.WorkspaceSvg} The workspace inside this mutator icon's + * bubble. + * @package + */ +Blockly.Mutator.prototype.getWorkspace = function() { + return this.workspace_; +}; + +/** + * Draw the mutator icon. + * @param {!Element} group The icon group. + * @protected + */ +Blockly.Mutator.prototype.drawIcon_ = function(group) { + // Square with rounded corners. + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, + { + 'class': 'blocklyIconShape', + 'rx': '4', + 'ry': '4', + 'height': '16', + 'width': '16' + }, + group); + // Gear teeth. + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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' + }, + group); + // Axle hole. + Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.CIRCLE, + { + 'class': 'blocklyIconShape', + 'r': '2.7', + 'cx': '8', + 'cy': '8' + }, + group); +}; + +/** + * Clicking on the icon toggles if the mutator bubble is visible. + * Disable if block is uneditable. + * @param {!Event} e Mouse click event. + * @private + * @override + */ +Blockly.Mutator.prototype.iconClick_ = function(e) { + if (this.block_.isEditable()) { + Blockly.Icon.prototype.iconClick_.call(this, e); + } +}; + +/** + * Create the editor for the mutator's bubble. + * @return {!SVGElement} The top-level node of the editor. + * @private + */ +Blockly.Mutator.prototype.createEditor_ = function() { + /* Create the editor. Here's the markup that will be generated: + + [Workspace] + + */ + this.svgDialog_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.SVG, + {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, + null); + // Convert the list of names into a list of XML objects for the flyout. + if (this.quarkNames_.length) { + var quarkXml = Blockly.utils.xml.createElement('xml'); + for (var i = 0, quarkName; (quarkName = this.quarkNames_[i]); i++) { + var element = Blockly.utils.xml.createElement('block'); + element.setAttribute('type', quarkName); + quarkXml.appendChild(element); + } + } else { + var quarkXml = null; + } + var workspaceOptions = new Blockly.Options( + /** @type {!Blockly.BlocklyOptions} */ + ({ + // If you want to enable disabling, also remove the + // event filter from workspaceChanged_ . + 'disable': false, + 'parentWorkspace': this.block_.workspace, + 'media': this.block_.workspace.options.pathToMedia, + 'rtl': this.block_.RTL, + 'horizontalLayout': false, + 'renderer': this.block_.workspace.options.renderer, + 'rendererOverrides': this.block_.workspace.options.rendererOverrides + })); + workspaceOptions.toolboxPosition = this.block_.RTL ? + Blockly.utils.toolbox.Position.RIGHT : + Blockly.utils.toolbox.Position.LEFT; + var hasFlyout = !!quarkXml; + if (hasFlyout) { + workspaceOptions.languageTree = + Blockly.utils.toolbox.convertToolboxDefToJson(quarkXml); + workspaceOptions.getMetrics = this.getFlyoutMetrics_.bind(this); + } + this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); + this.workspace_.isMutator = true; + this.workspace_.addChangeListener(Blockly.Events.disableOrphans); + + // Mutator flyouts go inside the mutator workspace's rather than in + // a top level svg. Instead of handling scale themselves, mutators + // inherit scale from the parent workspace. + // To fix this, scale needs to be applied at a different level in the dom. + var flyoutSvg = hasFlyout ? + this.workspace_.addFlyout(Blockly.utils.Svg.G) : null; + var background = this.workspace_.createDom('blocklyMutatorBackground'); + + if (flyoutSvg) { + // Insert the flyout after the but before the block canvas so that + // the flyout is underneath in z-order. This makes blocks layering during + // dragging work properly. + background.insertBefore(flyoutSvg, this.workspace_.svgBlockCanvas_); + } + this.svgDialog_.appendChild(background); + + return this.svgDialog_; +}; + +/** + * Add or remove the UI indicating if this icon may be clicked or not. + */ +Blockly.Mutator.prototype.updateEditable = function() { + Blockly.Mutator.superClass_.updateEditable.call(this); + if (!this.block_.isInFlyout) { + if (this.block_.isEditable()) { + if (this.iconGroup_) { + Blockly.utils.dom.removeClass( + /** @type {!Element} */ (this.iconGroup_), + 'blocklyIconGroupReadonly'); + } + } else { + // Close any mutator bubble. Icon is not clickable. + this.setVisible(false); + if (this.iconGroup_) { + Blockly.utils.dom.addClass( + /** @type {!Element} */ (this.iconGroup_), + 'blocklyIconGroupReadonly'); + } + } + } +}; + +/** + * Resize the bubble to match the size of the workspace. + * @private + */ +Blockly.Mutator.prototype.resizeBubble_ = function() { + var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; + var workspaceSize = this.workspace_.getCanvas().getBBox(); + var width = workspaceSize.width + workspaceSize.x; + var height = workspaceSize.height + doubleBorderWidth * 3; + var flyout = this.workspace_.getFlyout(); + if (flyout) { + var flyoutMetrics = flyout.getMetrics_(); + height = Math.max(height, flyoutMetrics.contentHeight + 20); + width += flyout.getWidth(); + } + if (this.block_.RTL) { + width = -workspaceSize.x; + } + width += doubleBorderWidth * 3; + // Only resize if the size difference is significant. Eliminates shuddering. + if (Math.abs(this.workspaceWidth_ - width) > doubleBorderWidth || + Math.abs(this.workspaceHeight_ - height) > doubleBorderWidth) { + // Record some layout information for getFlyoutMetrics_. + this.workspaceWidth_ = width; + this.workspaceHeight_ = height; + // Resize the bubble. + this.bubble_.setBubbleSize( + width + doubleBorderWidth, height + doubleBorderWidth); + this.svgDialog_.setAttribute('width', this.workspaceWidth_); + this.svgDialog_.setAttribute('height', this.workspaceHeight_); + } + + if (this.block_.RTL) { + // Scroll the workspace to always left-align. + var translation = 'translate(' + this.workspaceWidth_ + ',0)'; + this.workspace_.getCanvas().setAttribute('transform', translation); + } + this.workspace_.resize(); +}; + +/** + * A method handler for when the bubble is moved. + * @private + */ +Blockly.Mutator.prototype.onBubbleMove_ = function() { + if (this.workspace_) { + this.workspace_.recordDeleteAreas(); + } +}; + +/** + * Show or hide the mutator bubble. + * @param {boolean} visible True if the bubble should be visible. + */ +Blockly.Mutator.prototype.setVisible = function(visible) { + if (visible == this.isVisible()) { + // No change. + return; + } + Blockly.Events.fire( + new Blockly.Events.BubbleOpen(this.block_, visible, 'mutator')); + if (visible) { + // Create the bubble. + this.bubble_ = new Blockly.Bubble( + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + this.createEditor_(), this.block_.pathObject.svgPath, + /** @type {!Blockly.utils.Coordinate} */ (this.iconXY_), null, null); + // Expose this mutator's block's ID on its top-level SVG group. + this.bubble_.setSvgId(this.block_.id); + this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this)); + var tree = this.workspace_.options.languageTree; + var flyout = this.workspace_.getFlyout(); + if (tree) { + flyout.init(this.workspace_); + flyout.show(tree); + } + + this.rootBlock_ = this.block_.decompose(this.workspace_); + var blocks = this.rootBlock_.getDescendants(false); + for (var i = 0, child; (child = blocks[i]); i++) { + child.render(); + } + // The root block should not be draggable or deletable. + this.rootBlock_.setMovable(false); + this.rootBlock_.setDeletable(false); + if (flyout) { + var margin = flyout.CORNER_RADIUS * 2; + var x = this.rootBlock_.RTL ? flyout.getWidth() + margin : margin; + } else { + var margin = 16; + var x = margin; + } + if (this.block_.RTL) { + x = -x; + } + this.rootBlock_.moveBy(x, margin); + // Save the initial connections, then listen for further changes. + if (this.block_.saveConnections) { + var thisMutator = this; + var mutatorBlock = + /** @type {{saveConnections: function(!Blockly.Block)}} */ ( + this.block_); + mutatorBlock.saveConnections(this.rootBlock_); + this.sourceListener_ = function() { + mutatorBlock.saveConnections(thisMutator.rootBlock_); + }; + this.block_.workspace.addChangeListener(this.sourceListener_); + } + this.resizeBubble_(); + // When the mutator's workspace changes, update the source block. + this.workspace_.addChangeListener(this.workspaceChanged_.bind(this)); + this.applyColour(); + } else { + // Dispose of the bubble. + this.svgDialog_ = null; + this.workspace_.dispose(); + this.workspace_ = null; + this.rootBlock_ = null; + this.bubble_.dispose(); + this.bubble_ = null; + this.workspaceWidth_ = 0; + this.workspaceHeight_ = 0; + if (this.sourceListener_) { + this.block_.workspace.removeChangeListener(this.sourceListener_); + this.sourceListener_ = null; + } + } +}; + +/** + * Update the source block when the mutator's blocks are changed. + * Bump down any block that's too high. + * Fired whenever a change is made to the mutator's workspace. + * @param {!Blockly.Events.Abstract} e Custom data for event. + * @private + */ +Blockly.Mutator.prototype.workspaceChanged_ = function(e) { + if (e.isUiEvent || + (e.type == Blockly.Events.CHANGE && e.element == 'disabled')) { + return; + } + + if (!this.workspace_.isDragging()) { + var blocks = this.workspace_.getTopBlocks(false); + var MARGIN = 20; + + for (var b = 0, block; (block = blocks[b]); b++) { + var blockXY = block.getRelativeToSurfaceXY(); + + // Bump any block that's above the top back inside. + if (blockXY.y < MARGIN) { + block.moveBy(0, MARGIN - blockXY.y); + } + // Bump any block overlapping the flyout back inside. + if (block.RTL) { + var right = -MARGIN; + var flyout = this.workspace_.getFlyout(); + if (flyout) { + right -= flyout.getWidth(); + } + if (blockXY.x > right) { + block.moveBy(right - blockXY.x, 0); + } + } else if (blockXY.x < MARGIN) { + block.moveBy(MARGIN - blockXY.x, 0); + } + } + } + + // When the mutator's workspace changes, update the source block. + if (this.rootBlock_.workspace == this.workspace_) { + Blockly.Events.setGroup(true); + var block = this.block_; + var oldMutationDom = block.mutationToDom(); + var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + + // Switch off rendering while the source block is rebuilt. + var savedRendered = block.rendered; + // TODO(#4288): We should not be setting the rendered property to false. + block.rendered = false; + + // Allow the source block to rebuild itself. + block.compose(this.rootBlock_); + // Restore rendering and show the changes. + block.rendered = savedRendered; + // Mutation may have added some elements that need initializing. + block.initSvg(); + + if ((/** @type {!Blockly.WorkspaceSvg} */ (Blockly.getMainWorkspace())) + .keyboardAccessibilityMode) { + Blockly.navigation.moveCursorOnBlockMutation(block); + } + + if (block.rendered) { + block.render(); + } + + var newMutationDom = block.mutationToDom(); + var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); + if (oldMutation != newMutation) { + Blockly.Events.fire(new Blockly.Events.BlockChange( + block, 'mutation', null, oldMutation, newMutation)); + // Ensure that any bump is part of this mutation's event group. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + Blockly.Events.setGroup(group); + block.bumpNeighbours(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY); + } + + // Don't update the bubble until the drag has ended, to avoid moving blocks + // under the cursor. + if (!this.workspace_.isDragging()) { + this.resizeBubble_(); + } + Blockly.Events.setGroup(false); + } +}; + +/** + * Return an object with all the metrics required to size scrollbars for the + * mutator flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .absoluteTop: Top-edge of view. + * .absoluteLeft: Left-edge of view. + * @return {!Blockly.utils.Metrics} Contains size and position metrics of + * mutator dialog's workspace. + * @private + */ +Blockly.Mutator.prototype.getFlyoutMetrics_ = function() { + // The mutator workspace only uses a subset of Blockly.utils.Metrics + // properties as features such as scroll and zoom are unsupported. + var unsupported = 0; + var flyout = this.workspace_.getFlyout(); + var flyoutWidth = flyout ? flyout.getWidth() : 0; + return { + contentHeight: unsupported, + contentWidth: unsupported, + contentTop: unsupported, + contentLeft: unsupported, + + viewHeight: this.workspaceHeight_, + viewWidth: this.workspaceWidth_ - flyoutWidth, + viewTop: unsupported, + viewLeft: unsupported, + + absoluteTop: unsupported, + absoluteLeft: this.workspace_.RTL ? 0 : flyoutWidth + }; +}; + +/** + * Dispose of this mutator. + */ +Blockly.Mutator.prototype.dispose = function() { + this.block_.mutator = null; + Blockly.Icon.prototype.dispose.call(this); +}; + +/** + * Update the styles on all blocks in the mutator. + * @public + */ +Blockly.Mutator.prototype.updateBlockStyle = function() { + var ws = this.workspace_; + + if (ws && ws.getAllBlocks(false)) { + var workspaceBlocks = ws.getAllBlocks(false); + for (var i = 0; i < workspaceBlocks.length; i++) { + var block = workspaceBlocks[i]; + block.setStyle(block.getStyleName()); + } + + var flyout = ws.getFlyout(); + if (flyout) { + var flyoutBlocks = flyout.workspace_.getAllBlocks(false); + for (var i = 0; i < flyoutBlocks.length; i++) { + var block = flyoutBlocks[i]; + block.setStyle(block.getStyleName()); + } + } + } +}; + +/** + * Reconnect an block to a mutated input. + * @param {Blockly.Connection} connectionChild Connection on child block. + * @param {!Blockly.Block} block Parent block. + * @param {string} inputName Name of input on parent block. + * @return {boolean} True iff a reconnection was made, false otherwise. + */ +Blockly.Mutator.reconnect = function(connectionChild, block, inputName) { + if (!connectionChild || !connectionChild.getSourceBlock().workspace) { + return false; // No connection or block has been deleted. + } + var connectionParent = block.getInput(inputName).connection; + var currentParent = connectionChild.targetBlock(); + if ((!currentParent || currentParent == block) && + connectionParent.targetConnection != connectionChild) { + if (connectionParent.isConnected()) { + // There's already something connected here. Get rid of it. + connectionParent.disconnect(); + } + connectionParent.connect(connectionChild); + return true; + } + return false; +}; + +/** + * 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 + */ +Blockly.Mutator.findParentWs = function(workspace) { + var outerWs = null; + if (workspace && workspace.options) { + var parent = workspace.options.parentWorkspace; + // If we were in a flyout in a mutator, need to go up two levels to find + // the actual parent. + if (workspace.isFlyout) { + if (parent && parent.options) { + outerWs = parent.options.parentWorkspace; + } + } else if (parent) { + outerWs = parent; + } + } + return outerWs; +}; diff --git a/static/js/dist/core/names.js b/static/js/dist/core/names.js new file mode 100644 index 0000000..3b73d3f --- /dev/null +++ b/static/js/dist/core/names.js @@ -0,0 +1,187 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Utility functions for handling variables and procedure names. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Names'); + +goog.require('Blockly.constants'); +goog.require('Blockly.Msg'); + + +/** + * 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 + */ +Blockly.Names = function(reservedWords, opt_variablePrefix) { + this.variablePrefix_ = opt_variablePrefix || ''; + this.reservedDict_ = Object.create(null); + if (reservedWords) { + var splitWords = reservedWords.split(','); + for (var i = 0; i < splitWords.length; i++) { + this.reservedDict_[splitWords[i]] = true; + } + } + this.reset(); +}; + +/** + * 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. + */ +Blockly.Names.DEVELOPER_VARIABLE_TYPE = 'DEVELOPER_VARIABLE'; + +/** + * When JavaScript (or most other languages) is generated, variable 'foo' and + * procedure 'foo' would collide. However, Blockly has no such problems since + * variable get 'foo' and procedure call 'foo' are unambiguous. + * Therefore, Blockly keeps a separate type name to disambiguate. + * getName('foo', 'variable') -> 'foo' + * getName('foo', 'procedure') -> 'foo2' + */ + +/** + * Empty the database and start from scratch. The reserved words are kept. + */ +Blockly.Names.prototype.reset = function() { + this.db_ = Object.create(null); + this.dbReverse_ = Object.create(null); + this.variableMap_ = null; +}; + +/** + * Set the variable map that maps from variable name to variable object. + * @param {!Blockly.VariableMap} map The map to track. + */ +Blockly.Names.prototype.setVariableMap = function(map) { + this.variableMap_ = map; +}; + +/** + * Get the name for a user-defined variable, based on its ID. + * This should only be used for variables of type + * Blockly.VARIABLE_CATEGORY_NAME. + * @param {string} id The ID to look up in the variable map. + * @return {?string} The name of the referenced variable, or null if there was + * no variable map or the variable was not found in the map. + * @private + */ +Blockly.Names.prototype.getNameForUserVariable_ = function(id) { + if (!this.variableMap_) { + console.log('Deprecated call to Blockly.Names.prototype.getName without ' + + 'defining a variable map. To fix, add the following code in your ' + + 'generator\'s init() function:\n' + + 'Blockly.YourGeneratorName.variableDB_.setVariableMap(' + + 'workspace.getVariableMap());'); + return null; + } + var variable = this.variableMap_.getVariableById(id); + if (variable) { + return variable.name; + } else { + return null; + } +}; + +/** + * 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. + */ +Blockly.Names.prototype.getName = function(name, type) { + if (type == Blockly.VARIABLE_CATEGORY_NAME) { + var varName = this.getNameForUserVariable_(name); + if (varName) { + name = varName; + } + } + var normalized = name.toLowerCase() + '_' + type; + + var isVarType = type == Blockly.VARIABLE_CATEGORY_NAME || + type == Blockly.Names.DEVELOPER_VARIABLE_TYPE; + + var prefix = isVarType ? this.variablePrefix_ : ''; + if (normalized in this.db_) { + return prefix + this.db_[normalized]; + } + var safeName = this.getDistinctName(name, type); + this.db_[normalized] = safeName.substr(prefix.length); + return safeName; +}; + +/** + * 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. + */ +Blockly.Names.prototype.getDistinctName = function(name, type) { + var safeName = this.safeName_(name); + var i = ''; + while (this.dbReverse_[safeName + i] || + (safeName + i) in this.reservedDict_) { + // Collision with existing name. Create a unique name. + i = i ? i + 1 : 2; + } + safeName += i; + this.dbReverse_[safeName] = true; + var isVarType = type == Blockly.VARIABLE_CATEGORY_NAME || + type == Blockly.Names.DEVELOPER_VARIABLE_TYPE; + var prefix = isVarType ? this.variablePrefix_ : ''; + return prefix + safeName; +}; + +/** + * Given a proposed entity name, generate a name that conforms to the + * [_A-Za-z][_A-Za-z0-9]* format that most languages consider legal for + * variables. + * @param {string} name Potentially illegal entity name. + * @return {string} Safe entity name. + * @private + */ +Blockly.Names.prototype.safeName_ = function(name) { + if (!name) { + name = Blockly.Msg['UNNAMED_KEY'] || 'unnamed'; + } else { + // Unfortunately names in non-latin characters will look like + // _E9_9F_B3_E4_B9_90 which is pretty meaningless. + // https://github.com/google/blockly/issues/1654 + name = encodeURI(name.replace(/ /g, '_')).replace(/[^\w]/g, '_'); + // Most languages don't allow names with leading numbers. + if ('0123456789'.indexOf(name[0]) != -1) { + name = 'my_' + name; + } + } + return name; +}; + +/** + * 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. + */ +Blockly.Names.equals = function(name1, name2) { + return name1.toLowerCase() == name2.toLowerCase(); +}; diff --git a/static/js/dist/core/options.js b/static/js/dist/core/options.js new file mode 100644 index 0000000..a968a86 --- /dev/null +++ b/static/js/dist/core/options.js @@ -0,0 +1,376 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Object that controls settings for the workspace. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Options'); + +goog.require('Blockly.Theme'); +goog.require('Blockly.Themes.Classic'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.IdGenerator'); +goog.require('Blockly.utils.Metrics'); +goog.require('Blockly.utils.toolbox'); +goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.Xml'); + +goog.requireType('Blockly.WorkspaceSvg'); + + +/** + * 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 + */ +Blockly.Options = function(options) { + var readOnly = !!options['readOnly']; + if (readOnly) { + var toolboxJsonDef = null; + var hasCategories = false; + var hasTrashcan = false; + var hasCollapse = false; + var hasComments = false; + var hasDisable = false; + var hasSounds = false; + } else { + var toolboxJsonDef = Blockly.utils.toolbox.convertToolboxDefToJson(options['toolbox']); + var hasCategories = Blockly.utils.toolbox.hasCategories(toolboxJsonDef); + var hasTrashcan = options['trashcan']; + if (hasTrashcan === undefined) { + hasTrashcan = hasCategories; + } + var maxTrashcanContents = options['maxTrashcanContents']; + if (hasTrashcan) { + if (maxTrashcanContents === undefined) { + maxTrashcanContents = 32; + } + } else { + maxTrashcanContents = 0; + } + var hasCollapse = options['collapse']; + if (hasCollapse === undefined) { + hasCollapse = hasCategories; + } + var hasComments = options['comments']; + if (hasComments === undefined) { + hasComments = hasCategories; + } + var hasDisable = options['disable']; + if (hasDisable === undefined) { + hasDisable = hasCategories; + } + var hasSounds = options['sounds']; + if (hasSounds === undefined) { + hasSounds = true; + } + } + var rtl = !!options['rtl']; + var horizontalLayout = options['horizontalLayout']; + if (horizontalLayout === undefined) { + horizontalLayout = false; + } + var toolboxAtStart = options['toolboxPosition']; + toolboxAtStart = toolboxAtStart !== 'end'; + + /** @type {!Blockly.utils.toolbox.Position} */ + var toolboxPosition; + if (horizontalLayout) { + toolboxPosition = toolboxAtStart ? + Blockly.utils.toolbox.Position.TOP : Blockly.utils.toolbox.Position.BOTTOM; + } else { + toolboxPosition = (toolboxAtStart == rtl) ? + Blockly.utils.toolbox.Position.RIGHT : Blockly.utils.toolbox.Position.LEFT; + } + + var hasCss = options['css']; + if (hasCss === undefined) { + hasCss = true; + } + var pathToMedia = 'https://blockly-demo.appspot.com/static/media/'; + if (options['media']) { + pathToMedia = options['media']; + } else if (options['path']) { + // 'path' is a deprecated option which has been replaced by 'media'. + pathToMedia = options['path'] + 'media/'; + } + if (options['oneBasedIndex'] === undefined) { + var oneBasedIndex = true; + } else { + var oneBasedIndex = !!options['oneBasedIndex']; + } + var renderer = options['renderer'] || 'geras'; + + var plugins = options['plugins'] || {}; + + /** @type {boolean} */ + this.RTL = rtl; + /** @type {boolean} */ + this.oneBasedIndex = oneBasedIndex; + /** @type {boolean} */ + this.collapse = hasCollapse; + /** @type {boolean} */ + this.comments = hasComments; + /** @type {boolean} */ + this.disable = hasDisable; + /** @type {boolean} */ + this.readOnly = readOnly; + /** @type {number} */ + this.maxBlocks = options['maxBlocks'] || Infinity; + /** @type {?Object.} */ + this.maxInstances = options['maxInstances']; + /** @type {string} */ + this.pathToMedia = pathToMedia; + /** @type {boolean} */ + this.hasCategories = hasCategories; + /** @type {!Blockly.Options.MoveOptions} */ + this.moveOptions = Blockly.Options.parseMoveOptions_(options, hasCategories); + /** @deprecated January 2019 */ + this.hasScrollbars = this.moveOptions.scrollbars; + /** @type {boolean} */ + this.hasTrashcan = hasTrashcan; + /** @type {number} */ + this.maxTrashcanContents = maxTrashcanContents; + /** @type {boolean} */ + this.hasSounds = hasSounds; + /** @type {boolean} */ + this.hasCss = hasCss; + /** @type {boolean} */ + this.horizontalLayout = horizontalLayout; + /** @type {?Blockly.utils.toolbox.ToolboxInfo} */ + this.languageTree = toolboxJsonDef; + /** @type {!Blockly.Options.GridOptions} */ + this.gridOptions = Blockly.Options.parseGridOptions_(options); + /** @type {!Blockly.Options.ZoomOptions} */ + this.zoomOptions = Blockly.Options.parseZoomOptions_(options); + /** @type {!Blockly.utils.toolbox.Position} */ + this.toolboxPosition = toolboxPosition; + /** @type {!Blockly.Theme} */ + this.theme = Blockly.Options.parseThemeOptions_(options); + /** @type {string} */ + this.renderer = renderer; + /** @type {?Object} */ + this.rendererOverrides = options['rendererOverrides']; + + /** + * The SVG element for the grid pattern. + * Created during injection. + * @type {?SVGElement} + */ + this.gridPattern = null; + + /** + * The parent of the current workspace, or null if there is no parent + * workspace. We can assert that this is of type WorkspaceSvg as opposed to + * Workspace as this is only used in a rendered workspace. + * @type {Blockly.WorkspaceSvg} + */ + this.parentWorkspace = options['parentWorkspace']; + + /** + * Map of plugin type to name of registered plugin or plugin class. + * @type {!Object.} + */ + this.plugins = plugins; +}; + +/** + * Blockly options. + * This interface is further described in + * `typings/parts/blockly-interfaces.d.ts`. + * @interface + */ +Blockly.BlocklyOptions = function() {}; + +/** + * Grid Options. + * @typedef {{ + * colour: string, + * length: number, + * snap: boolean, + * spacing: number + * }} + */ +Blockly.Options.GridOptions; + +/** + * Move Options. + * @typedef {{ + * drag: boolean, + * scrollbars: boolean, + * wheel: boolean + * }} + */ +Blockly.Options.MoveOptions; + +/** + * Zoom Options. + * @typedef {{ + * controls: boolean, + * maxScale: number, + * minScale: number, + * pinch: boolean, + * scaleSpeed: number, + * startScale: number, + * wheel: boolean + * }} + */ +Blockly.Options.ZoomOptions; + +/** + * If set, sets the translation of the workspace to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains an x and/or y property which + * is a float between 0 and 1 specifying the degree of scrolling. + * @return {void} + */ +Blockly.Options.prototype.setMetrics; + +/** + * Return an object with the metrics required to size the workspace. + * @return {!Blockly.utils.Metrics} Contains size and position metrics. + */ +Blockly.Options.prototype.getMetrics; + +/** + * Parse the user-specified move options, using reasonable defaults where + * behaviour is unspecified. + * @param {!Object} options Dictionary of options. + * @param {boolean} hasCategories Whether the workspace has categories or not. + * @return {!Blockly.Options.MoveOptions} Normalized move options. + * @private + */ +Blockly.Options.parseMoveOptions_ = function(options, hasCategories) { + var move = options['move'] || {}; + var moveOptions = {}; + if (move['scrollbars'] === undefined && options['scrollbars'] === undefined) { + moveOptions.scrollbars = hasCategories; + } else { + moveOptions.scrollbars = !!move['scrollbars'] || !!options['scrollbars']; + } + if (!moveOptions.scrollbars || move['wheel'] === undefined) { + // Defaults to false so that developers' settings don't appear to change. + moveOptions.wheel = false; + } else { + moveOptions.wheel = !!move['wheel']; + } + if (!moveOptions.scrollbars) { + moveOptions.drag = false; + } else if (move['drag'] === undefined) { + // Defaults to true if scrollbars is true. + moveOptions.drag = true; + } else { + moveOptions.drag = !!move['drag']; + } + return moveOptions; +}; + +/** + * Parse the user-specified zoom options, using reasonable defaults where + * behaviour is unspecified. See zoom documentation: + * https://developers.google.com/blockly/guides/configure/web/zoom + * @param {!Object} options Dictionary of options. + * @return {!Blockly.Options.ZoomOptions} Normalized zoom options. + * @private + */ +Blockly.Options.parseZoomOptions_ = function(options) { + var zoom = options['zoom'] || {}; + var zoomOptions = {}; + if (zoom['controls'] === undefined) { + zoomOptions.controls = false; + } else { + zoomOptions.controls = !!zoom['controls']; + } + if (zoom['wheel'] === undefined) { + zoomOptions.wheel = false; + } else { + zoomOptions.wheel = !!zoom['wheel']; + } + if (zoom['startScale'] === undefined) { + zoomOptions.startScale = 1; + } else { + zoomOptions.startScale = Number(zoom['startScale']); + } + if (zoom['maxScale'] === undefined) { + zoomOptions.maxScale = 3; + } else { + zoomOptions.maxScale = Number(zoom['maxScale']); + } + if (zoom['minScale'] === undefined) { + zoomOptions.minScale = 0.3; + } else { + zoomOptions.minScale = Number(zoom['minScale']); + } + if (zoom['scaleSpeed'] === undefined) { + zoomOptions.scaleSpeed = 1.2; + } else { + zoomOptions.scaleSpeed = Number(zoom['scaleSpeed']); + } + if (zoom['pinch'] === undefined) { + zoomOptions.pinch = zoomOptions.wheel || zoomOptions.controls; + } else { + zoomOptions.pinch = !!zoom['pinch']; + } + return zoomOptions; +}; + +/** + * Parse the user-specified grid options, using reasonable defaults where + * behaviour is unspecified. See grid documentation: + * https://developers.google.com/blockly/guides/configure/web/grid + * @param {!Object} options Dictionary of options. + * @return {!Blockly.Options.GridOptions} Normalized grid options. + * @private + */ +Blockly.Options.parseGridOptions_ = function(options) { + var grid = options['grid'] || {}; + var gridOptions = {}; + gridOptions.spacing = Number(grid['spacing']) || 0; + gridOptions.colour = grid['colour'] || '#888'; + gridOptions.length = + (grid['length'] === undefined) ? 1 : Number(grid['length']); + gridOptions.snap = gridOptions.spacing > 0 && !!grid['snap']; + return gridOptions; +}; + +/** + * Parse the user-specified theme options, using the classic theme as a default. + * https://developers.google.com/blockly/guides/configure/web/themes + * @param {!Object} options Dictionary of options. + * @return {!Blockly.Theme} A Blockly Theme. + * @private + */ +Blockly.Options.parseThemeOptions_ = function(options) { + var theme = options['theme'] || Blockly.Themes.Classic; + if (typeof theme == 'string') { + return /** @type {!Blockly.Theme} */ ( + Blockly.registry.getObject(Blockly.registry.Type.THEME, theme)); + } else if (theme instanceof Blockly.Theme) { + return /** @type {!Blockly.Theme} */ (theme); + } + return Blockly.Theme.defineTheme(theme.name || + ('builtin' + Blockly.utils.IdGenerator.getNextUniqueId()), theme); +}; + +/** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {?Node|?string} toolboxDef DOM tree of blocks, or text representation + * of same. + * @return {?Node} DOM tree of blocks, or null. + * @deprecated Use Blockly.utils.toolbox.parseToolboxTree. (2020 September 28) + */ +Blockly.Options.parseToolboxTree = function(toolboxDef) { + Blockly.utils.deprecation.warn( + 'Blockly.Options.parseToolboxTree', + 'September 2020', + 'September 2021', + 'Blockly.utils.toolbox.parseToolboxTree'); + return Blockly.utils.toolbox.parseToolboxTree(toolboxDef); +}; diff --git a/static/js/dist/core/procedures.js b/static/js/dist/core/procedures.js new file mode 100644 index 0000000..a1b63be --- /dev/null +++ b/static/js/dist/core/procedures.js @@ -0,0 +1,404 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Utility functions for handling procedures. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.Procedures + * @namespace + */ +goog.provide('Blockly.Procedures'); + +goog.require('Blockly.Blocks'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.Events.BlockChange'); +goog.require('Blockly.Field'); +goog.require('Blockly.Msg'); +goog.require('Blockly.Names'); +goog.require('Blockly.utils.xml'); +goog.require('Blockly.Workspace'); +goog.require('Blockly.Xml'); + + +/** + * Constant to separate procedure names from variables and generated functions + * when running generators. + * @deprecated Use Blockly.PROCEDURE_CATEGORY_NAME + */ +Blockly.Procedures.NAME_TYPE = Blockly.PROCEDURE_CATEGORY_NAME; + +/** + * The default argument for a procedures_mutatorarg block. + * @type {string} + */ +Blockly.Procedures.DEFAULT_ARG = 'x'; + +/** + * Procedure block type. + * @typedef {{ + * getProcedureCall: function():string, + * renameProcedure: function(string,string), + * getProcedureDef: function():!Array + * }} + */ +Blockly.Procedures.ProcedureBlock; + +/** + * 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. + */ +Blockly.Procedures.allProcedures = function(root) { + var proceduresNoReturn = root.getBlocksByType('procedures_defnoreturn', false) + .map(function(block) { + return /** @type {!Blockly.Procedures.ProcedureBlock} */ (block).getProcedureDef(); + }); + var proceduresReturn = root.getBlocksByType('procedures_defreturn', false).map(function(block) { + return /** @type {!Blockly.Procedures.ProcedureBlock} */ (block).getProcedureDef(); + }); + proceduresNoReturn.sort(Blockly.Procedures.procTupleComparator_); + proceduresReturn.sort(Blockly.Procedures.procTupleComparator_); + return [proceduresNoReturn, proceduresReturn]; +}; + +/** + * Comparison function for case-insensitive sorting of the first element of + * a tuple. + * @param {!Array} ta First tuple. + * @param {!Array} tb Second tuple. + * @return {number} -1, 0, or 1 to signify greater than, equality, or less than. + * @private + */ +Blockly.Procedures.procTupleComparator_ = function(ta, tb) { + return ta[0].toLowerCase().localeCompare(tb[0].toLowerCase()); +}; + +/** + * 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. + */ +Blockly.Procedures.findLegalName = function(name, block) { + if (block.isInFlyout) { + // Flyouts can have multiple procedures called 'do something'. + return name; + } + name = name || Blockly.Msg['UNNAMED_KEY'] || 'unnamed'; + while (!Blockly.Procedures.isLegalName_(name, block.workspace, block)) { + // Collision with another procedure. + var r = name.match(/^(.*?)(\d+)$/); + if (!r) { + name += '2'; + } else { + name = r[1] + (parseInt(r[2], 10) + 1); + } + } + return name; +}; + +/** + * Does this procedure have a legal name? Illegal names include names of + * procedures already defined. + * @param {string} name The questionable name. + * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. + * @param {Blockly.Block=} opt_exclude Optional block to exclude from + * comparisons (one doesn't want to collide with oneself). + * @return {boolean} True if the name is legal. + * @private + */ +Blockly.Procedures.isLegalName_ = function(name, workspace, opt_exclude) { + return !Blockly.Procedures.isNameUsed(name, workspace, opt_exclude); +}; + +/** + * 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. + */ +Blockly.Procedures.isNameUsed = function(name, workspace, opt_exclude) { + var blocks = workspace.getAllBlocks(false); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + if (blocks[i] == opt_exclude) { + continue; + } + if (blocks[i].getProcedureDef) { + var procedureBlock = /** @type {!Blockly.Procedures.ProcedureBlock} */ ( + blocks[i]); + var procName = procedureBlock.getProcedureDef(); + if (Blockly.Names.equals(procName[0], name)) { + return true; + } + } + } + return false; +}; + +/** + * Rename a procedure. Called by the editable field. + * @param {string} name The proposed new name. + * @return {string} The accepted name. + * @this {Blockly.Field} + */ +Blockly.Procedures.rename = function(name) { + // Strip leading and trailing whitespace. Beyond this, all names are legal. + name = name.trim(); + + var legalName = Blockly.Procedures.findLegalName(name, + /** @type {!Blockly.Block} */ (this.getSourceBlock())); + var oldName = this.getValue(); + if (oldName != name && oldName != legalName) { + // Rename any callers. + var blocks = this.getSourceBlock().workspace.getAllBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].renameProcedure) { + var procedureBlock = /** @type {!Blockly.Procedures.ProcedureBlock} */ ( + blocks[i]); + procedureBlock.renameProcedure( + /** @type {string} */ (oldName), legalName); + } + } + } + return legalName; +}; + +/** + * 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. + */ +Blockly.Procedures.flyoutCategory = function(workspace) { + var xmlList = []; + if (Blockly.Blocks['procedures_defnoreturn']) { + // + // do something + // + var block = Blockly.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_defnoreturn'); + block.setAttribute('gap', 16); + var nameField = Blockly.utils.xml.createElement('field'); + nameField.setAttribute('name', 'NAME'); + nameField.appendChild(Blockly.utils.xml.createTextNode( + Blockly.Msg['PROCEDURES_DEFNORETURN_PROCEDURE'])); + block.appendChild(nameField); + xmlList.push(block); + } + if (Blockly.Blocks['procedures_defreturn']) { + // + // do something + // + var block = Blockly.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_defreturn'); + block.setAttribute('gap', 16); + var nameField = Blockly.utils.xml.createElement('field'); + nameField.setAttribute('name', 'NAME'); + nameField.appendChild(Blockly.utils.xml.createTextNode( + Blockly.Msg['PROCEDURES_DEFRETURN_PROCEDURE'])); + block.appendChild(nameField); + xmlList.push(block); + } + if (Blockly.Blocks['procedures_ifreturn']) { + // + var block = Blockly.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_ifreturn'); + block.setAttribute('gap', 16); + xmlList.push(block); + } + if (xmlList.length) { + // Add slightly larger gap between system blocks and user calls. + xmlList[xmlList.length - 1].setAttribute('gap', 24); + } + + function populateProcedures(procedureList, templateName) { + for (var i = 0; i < procedureList.length; i++) { + var name = procedureList[i][0]; + var args = procedureList[i][1]; + // + // + // + // + // + var block = Blockly.utils.xml.createElement('block'); + block.setAttribute('type', templateName); + block.setAttribute('gap', 16); + var mutation = Blockly.utils.xml.createElement('mutation'); + mutation.setAttribute('name', name); + block.appendChild(mutation); + for (var j = 0; j < args.length; j++) { + var arg = Blockly.utils.xml.createElement('arg'); + arg.setAttribute('name', args[j]); + mutation.appendChild(arg); + } + xmlList.push(block); + } + } + + var tuple = Blockly.Procedures.allProcedures(workspace); + populateProcedures(tuple[0], 'procedures_callnoreturn'); + populateProcedures(tuple[1], 'procedures_callreturn'); + return xmlList; +}; + +/** + * Updates the procedure mutator's flyout so that the arg block is not a + * duplicate of another arg. + * @param {!Blockly.Workspace} workspace The procedure mutator's workspace. This + * workspace's flyout is what is being updated. + * @private + */ +Blockly.Procedures.updateMutatorFlyout_ = function(workspace) { + var usedNames = []; + var blocks = workspace.getBlocksByType('procedures_mutatorarg', false); + for (var i = 0, block; (block = blocks[i]); i++) { + usedNames.push(block.getFieldValue('NAME')); + } + + var xml = Blockly.utils.xml.createElement('xml'); + var argBlock = Blockly.utils.xml.createElement('block'); + argBlock.setAttribute('type', 'procedures_mutatorarg'); + var nameField = Blockly.utils.xml.createElement('field'); + nameField.setAttribute('name', 'NAME'); + var argValue = Blockly.Variables.generateUniqueNameFromOptions( + Blockly.Procedures.DEFAULT_ARG, usedNames); + var fieldContent = Blockly.utils.xml.createTextNode(argValue); + + nameField.appendChild(fieldContent); + argBlock.appendChild(nameField); + xml.appendChild(argBlock); + + workspace.updateToolbox(xml); +}; + +/** + * 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 + */ +Blockly.Procedures.mutatorOpenListener = function(e) { + if (!(e.type == Blockly.Events.BUBBLE_OPEN && e.bubbleType === 'mutator' && + e.isOpen)) { + return; + } + var workspaceId = /** @type {string} */ (e.workspaceId); + var block = Blockly.Workspace.getById(workspaceId) + .getBlockById(e.blockId); + var type = block.type; + if (type != 'procedures_defnoreturn' && type != 'procedures_defreturn') { + return; + } + var workspace = block.mutator.getWorkspace(); + Blockly.Procedures.updateMutatorFlyout_(workspace); + workspace.addChangeListener(Blockly.Procedures.mutatorChangeListener_); +}; + +/** + * Listens for changes in a procedure mutator and triggers flyout updates when + * necessary. + * @param {!Blockly.Events.Abstract} e The event that triggered this listener. + * @private + */ +Blockly.Procedures.mutatorChangeListener_ = function(e) { + if (e.type != Blockly.Events.BLOCK_CREATE && + e.type != Blockly.Events.BLOCK_DELETE && + e.type != Blockly.Events.BLOCK_CHANGE) { + return; + } + var workspaceId = /** @type {string} */ (e.workspaceId); + var workspace = /** @type {!Blockly.WorkspaceSvg} */ + (Blockly.Workspace.getById(workspaceId)); + Blockly.Procedures.updateMutatorFlyout_(workspace); +}; + +/** + * 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. + */ +Blockly.Procedures.getCallers = function(name, workspace) { + var callers = []; + var blocks = workspace.getAllBlocks(false); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureCall) { + var procedureBlock = /** @type {!Blockly.Procedures.ProcedureBlock} */ ( + blocks[i]); + var procName = procedureBlock.getProcedureCall(); + // Procedure name may be null if the block is only half-built. + if (procName && Blockly.Names.equals(procName, name)) { + callers.push(blocks[i]); + } + } + } + return callers; +}; + +/** + * When a procedure definition changes its parameters, find and edit all its + * callers. + * @param {!Blockly.Block} defBlock Procedure definition block. + */ +Blockly.Procedures.mutateCallers = function(defBlock) { + var oldRecordUndo = Blockly.Events.recordUndo; + var procedureBlock = /** @type {!Blockly.Procedures.ProcedureBlock} */ ( + defBlock); + var name = procedureBlock.getProcedureDef()[0]; + var xmlElement = defBlock.mutationToDom(true); + var callers = Blockly.Procedures.getCallers(name, defBlock.workspace); + for (var i = 0, caller; (caller = callers[i]); i++) { + var oldMutationDom = caller.mutationToDom(); + var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + caller.domToMutation(xmlElement); + var newMutationDom = caller.mutationToDom(); + var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); + if (oldMutation != newMutation) { + // Fire a mutation on every caller block. But don't record this as an + // undo action since it is deterministically tied to the procedure's + // definition mutation. + Blockly.Events.recordUndo = false; + Blockly.Events.fire(new Blockly.Events.BlockChange( + caller, 'mutation', null, oldMutation, newMutation)); + Blockly.Events.recordUndo = oldRecordUndo; + } + } +}; + +/** + * 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. + */ +Blockly.Procedures.getDefinition = function(name, workspace) { + // Assume that a procedure definition is a top block. + var blocks = workspace.getTopBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureDef) { + var procedureBlock = /** @type {!Blockly.Procedures.ProcedureBlock} */ ( + blocks[i]); + var tuple = procedureBlock.getProcedureDef(); + if (tuple && Blockly.Names.equals(tuple[0], name)) { + return blocks[i]; + } + } + } + return null; +}; diff --git a/static/js/dist/core/registry.js b/static/js/dist/core/registry.js new file mode 100644 index 0000000..6384219 --- /dev/null +++ b/static/js/dist/core/registry.js @@ -0,0 +1,265 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview This file is a universal registry that provides generic methods + * for registering and unregistering different types of classes. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.registry'); + +goog.requireType('Blockly.blockRendering.Renderer'); +goog.requireType('Blockly.Events.Abstract'); +goog.requireType('Blockly.Field'); +goog.requireType('Blockly.IConnectionChecker'); +goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IToolbox'); +goog.requireType('Blockly.Theme'); + + +/** + * A map of maps. With the keys being the type and name of the class we are + * registering and the value being the constructor function. + * e.g. {'field': {'field_angle': Blockly.FieldAngle}} + * + * @type {Object>} + */ +Blockly.registry.typeMap_ = {}; + +/** + * The string used to register the default class for a type of plugin. + * @type {string} + */ +Blockly.registry.DEFAULT = 'default'; + +/** + * A name with the type of the element stored in the generic. + * @param {string} name The name of the registry type. + * @constructor + * @template T + */ +Blockly.registry.Type = function(name) { + /** + * @type {string} + * @private + */ + this.name_ = name; +}; + +/** + * Returns the name of the type. + * @return {string} The name. + * @override + */ +Blockly.registry.Type.prototype.toString = function() { + return this.name_; +}; + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.CONNECTION_CHECKER = + new Blockly.registry.Type('connectionChecker'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.EVENT = new Blockly.registry.Type('event'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.FIELD = new Blockly.registry.Type('field'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.RENDERER = new Blockly.registry.Type('renderer'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.TOOLBOX = new Blockly.registry.Type('toolbox'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.THEME = new Blockly.registry.Type('theme'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.TOOLBOX_ITEM = new Blockly.registry.Type('toolboxItem'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX = + new Blockly.registry.Type('flyoutsVerticalToolbox'); + +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX = + new Blockly.registry.Type('flyoutsHorizontalToolbox'); + +/** + * Registers a class based on a type and name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @param {?function(new:T, ...?)|Object} registryItem The class or object to + * register. + * @param {boolean=} opt_allowOverrides True to prevent an error when overriding an + * already registered item. + * @throws {Error} if the type or name is empty, a name with the given type has + * already been registered, or if the given class or object is not valid for it's type. + * @template T + */ +Blockly.registry.register = function(type, name, registryItem, opt_allowOverrides) { + if ((!(type instanceof Blockly.registry.Type) && typeof type != 'string') || String(type).trim() == '') { + throw Error('Invalid type "' + type + '". The type must be a' + + ' non-empty string or a Blockly.registry.Type.'); + } + type = String(type).toLowerCase(); + + if ((typeof name != 'string') || (name.trim() == '')) { + throw Error('Invalid name "' + name + '". The name must be a' + + ' non-empty string.'); + } + name = name.toLowerCase(); + if (!registryItem) { + throw Error('Can not register a null value'); + } + var typeRegistry = Blockly.registry.typeMap_[type]; + // If the type registry has not been created, create it. + if (!typeRegistry) { + typeRegistry = Blockly.registry.typeMap_[type] = {}; + } + + // Validate that the given class has all the required properties. + Blockly.registry.validate_(type, registryItem); + + // Don't throw an error if opt_allowOverrides is true. + if (!opt_allowOverrides && typeRegistry[name]) { + throw Error('Name "' + name + '" with type "' + type + '" already registered.'); + } + typeRegistry[name] = registryItem; +}; + +/** + * Checks the given registry item for properties that are required based on the + * type. + * @param {string} type The type of the plugin. (e.g. Field, Renderer) + * @param {Function|Object} registryItem A class or object that we are checking + * for the required properties. + * @private + */ +Blockly.registry.validate_ = function(type, registryItem) { + switch (type) { + case String(Blockly.registry.Type.FIELD): + if (typeof registryItem.fromJson != 'function') { + throw Error('Type "' + type + '" must have a fromJson function'); + } + break; + } +}; + +/** + * Unregisters the registry item with the given type and name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @template T + */ +Blockly.registry.unregister = function(type, name) { + type = String(type).toLowerCase(); + name = name.toLowerCase(); + var typeRegistry = Blockly.registry.typeMap_[type]; + if (!typeRegistry) { + console.warn('No type "' + type + '" found'); + return; + } + if (!typeRegistry[name]) { + console.warn('No name "' + name + '" with type "' + type + '" found'); + return; + } + delete Blockly.registry.typeMap_[type][name]; +}; + +/** + * Gets the registry item for the given name and type. This can be either a + * class or an object. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {?function(new:T, ...?)|Object} The class or object with the given + * name and type or null if none exists. + * @template T + */ +Blockly.registry.getItem_ = function(type, name) { + type = String(type).toLowerCase(); + name = name.toLowerCase(); + var typeRegistry = Blockly.registry.typeMap_[type]; + if (!typeRegistry) { + console.warn('No type "' + type + '" found'); + return null; + } + if (!typeRegistry[name]) { + console.warn('No name "' + name + '" with type "' + type + '" found'); + return null; + } + return typeRegistry[name]; +}; + +/** + * Returns whether or not the registry contains an item with the given type and + * name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {boolean} True if the registry has an item with the given type and + * name, false otherwise. + * @template T + */ +Blockly.registry.hasItem = function(type, name) { + type = String(type).toLowerCase(); + name = name.toLowerCase(); + var typeRegistry = Blockly.registry.typeMap_[type]; + if (!typeRegistry) { + return false; + } + return !!(typeRegistry[name]); +}; + +/** + * Gets the class for the given name and type. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {?function(new:T, ...?)} The class with the given name and type or + * null if none exists. + * @template T + */ +Blockly.registry.getClass = function(type, name) { + return /** @type {?function(new:T, ...?)} */ (Blockly.registry.getItem_(type, name)); +}; + +/** + * Gets the object for the given name and type. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Category) + * @param {string} name The plugin's name. (Ex. logic_category) + * @returns {T} The object with the given name and type or null if none exists. + * @template T + */ +Blockly.registry.getObject = function(type, name) { + return /** @type {T} */ (Blockly.registry.getItem_(type, name)); +}; + +/** + * Gets the class from Blockly options for the given type. + * This is used for plugins that override a built in feature. (e.g. Toolbox) + * @param {!Blockly.registry.Type} type The type of the plugin. + * @param {!Blockly.Options} options The option object to check for the given + * plugin. + * @return {?function(new:T, ...?)} The class for the plugin. + * @template T + */ +Blockly.registry.getClassFromOptions = function(type, options) { + var typeName = type.toString(); + var plugin = options.plugins[typeName] || Blockly.registry.DEFAULT; + + // If the user passed in a plugin class instead of a registered plugin name. + if (typeof plugin == 'function') { + return plugin; + } + return Blockly.registry.getClass(type, plugin); +}; diff --git a/static/js/dist/core/rendered_connection.js b/static/js/dist/core/rendered_connection.js new file mode 100644 index 0000000..0c070e1 --- /dev/null +++ b/static/js/dist/core/rendered_connection.js @@ -0,0 +1,566 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Components for creating connections between blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.RenderedConnection'); + +goog.require('Blockly.Connection'); +goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.deprecation'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Svg'); + + +/** + * 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 + */ +Blockly.RenderedConnection = function(source, type) { + Blockly.RenderedConnection.superClass_.constructor.call(this, source, type); + + /** + * Connection database for connections of this type on the current workspace. + * @const {!Blockly.ConnectionDB} + * @private + */ + this.db_ = source.workspace.connectionDBList[type]; + + /** + * Connection database for connections compatible with this type on the + * current workspace. + * @const {!Blockly.ConnectionDB} + * @private + */ + this.dbOpposite_ = source.workspace + .connectionDBList[Blockly.OPPOSITE_TYPE[type]]; + + /** + * Workspace units, (0, 0) is top left of block. + * @type {!Blockly.utils.Coordinate} + * @private + */ + this.offsetInBlock_ = new Blockly.utils.Coordinate(0, 0); + + /** + * Describes the state of this connection's tracked-ness. + * @type {Blockly.RenderedConnection.TrackedState} + * @private + */ + this.trackedState_ = Blockly.RenderedConnection.TrackedState.WILL_TRACK; + + /** + * Connection this connection connects to. Null if not connected. + * @type {Blockly.RenderedConnection} + */ + this.targetConnection = null; +}; +Blockly.utils.object.inherits(Blockly.RenderedConnection, Blockly.Connection); + +/** + * 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} + */ +Blockly.RenderedConnection.TrackedState = { + WILL_TRACK: -1, + UNTRACKED: 0, + TRACKED: 1 +}; + +/** + * Dispose of this connection. Remove it from the database (if it is + * tracked) and call the super-function to deal with connected blocks. + * @override + * @package + */ +Blockly.RenderedConnection.prototype.dispose = function() { + Blockly.RenderedConnection.superClass_.dispose.call(this); + if (this.trackedState_ == Blockly.RenderedConnection.TrackedState.TRACKED) { + this.db_.removeConnection(this, this.y); + } +}; + +/** + * Get the source block for this connection. + * @return {!Blockly.BlockSvg} The source block. + * @override + */ +Blockly.RenderedConnection.prototype.getSourceBlock = function() { + return /** @type {!Blockly.BlockSvg} */ ( + Blockly.RenderedConnection.superClass_.getSourceBlock.call(this)); +}; + +/** + * Returns the block that this connection connects to. + * @return {Blockly.BlockSvg} The connected block or null if none is connected. + * @override + */ +Blockly.RenderedConnection.prototype.targetBlock = function() { + return /** @type {Blockly.BlockSvg} */ ( + Blockly.RenderedConnection.superClass_.targetBlock.call(this)); +}; + +/** + * 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. + */ +Blockly.RenderedConnection.prototype.distanceFrom = function(otherConnection) { + var xDiff = this.x - otherConnection.x; + var yDiff = this.y - otherConnection.y; + return Math.sqrt(xDiff * xDiff + yDiff * yDiff); +}; + +/** + * Move the block(s) belonging to the connection to a point where they don't + * visually interfere with the specified connection. + * @param {!Blockly.Connection} staticConnection The connection to move away + * from. + * @package + */ +Blockly.RenderedConnection.prototype.bumpAwayFrom = function(staticConnection) { + if (this.sourceBlock_.workspace.isDragging()) { + // Don't move blocks around while the user is doing the same. + return; + } + // Move the root block. + var rootBlock = this.sourceBlock_.getRootBlock(); + if (rootBlock.isInFlyout) { + // Don't move blocks around in a flyout. + return; + } + var reverse = false; + if (!rootBlock.isMovable()) { + // Can't bump an uneditable block away. + // Check to see if the other block is movable. + rootBlock = staticConnection.getSourceBlock().getRootBlock(); + if (!rootBlock.isMovable()) { + return; + } + // Swap the connections and move the 'static' connection instead. + staticConnection = this; + reverse = true; + } + // Raise it to the top for extra visibility. + var selected = Blockly.selected == rootBlock; + selected || rootBlock.addSelect(); + var dx = (staticConnection.x + Blockly.SNAP_RADIUS + + Math.floor(Math.random() * Blockly.BUMP_RANDOMNESS)) - this.x; + var dy = (staticConnection.y + Blockly.SNAP_RADIUS + + Math.floor(Math.random() * Blockly.BUMP_RANDOMNESS)) - this.y; + if (reverse) { + // When reversing a bump due to an uneditable block, bump up. + dy = -dy; + } + if (rootBlock.RTL) { + dx = (staticConnection.x - Blockly.SNAP_RADIUS - + Math.floor(Math.random() * Blockly.BUMP_RANDOMNESS)) - this.x; + } + rootBlock.moveBy(dx, dy); + selected || rootBlock.removeSelect(); +}; + +/** + * 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. + */ +Blockly.RenderedConnection.prototype.moveTo = function(x, y) { + if (this.trackedState_ == Blockly.RenderedConnection.TrackedState.WILL_TRACK) { + this.db_.addConnection(this, y); + this.trackedState_ = Blockly.RenderedConnection.TrackedState.TRACKED; + } else if (this.trackedState_ == Blockly.RenderedConnection + .TrackedState.TRACKED) { + this.db_.removeConnection(this, this.y); + this.db_.addConnection(this, y); + } + this.x = x; + this.y = y; +}; + +/** + * 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. + */ +Blockly.RenderedConnection.prototype.moveBy = function(dx, dy) { + this.moveTo(this.x + dx, this.y + dy); +}; + +/** + * 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. + */ +Blockly.RenderedConnection.prototype.moveToOffset = function(blockTL) { + this.moveTo(blockTL.x + this.offsetInBlock_.x, + blockTL.y + this.offsetInBlock_.y); +}; + +/** + * 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. + */ +Blockly.RenderedConnection.prototype.setOffsetInBlock = function(x, y) { + this.offsetInBlock_.x = x; + this.offsetInBlock_.y = y; +}; + +/** + * Get the offset of this connection relative to the top left of its block. + * @return {!Blockly.utils.Coordinate} The offset of the connection. + * @package + */ +Blockly.RenderedConnection.prototype.getOffsetInBlock = function() { + return this.offsetInBlock_; +}; + +/** + * Move the blocks on either side of this connection right next to each other. + * @package + */ +Blockly.RenderedConnection.prototype.tighten = function() { + var dx = this.targetConnection.x - this.x; + var dy = this.targetConnection.y - this.y; + if (dx != 0 || dy != 0) { + var block = this.targetBlock(); + var svgRoot = block.getSvgRoot(); + if (!svgRoot) { + throw Error('block is not rendered.'); + } + // Workspace coordinates. + var xy = Blockly.utils.getRelativeXY(svgRoot); + block.getSvgRoot().setAttribute('transform', + 'translate(' + (xy.x - dx) + ',' + (xy.y - dy) + ')'); + block.moveConnections(-dx, -dy); + } +}; + +/** + * Find the closest compatible connection to this connection. + * 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. + */ +Blockly.RenderedConnection.prototype.closest = function(maxLimit, dxy) { + return this.dbOpposite_.searchForClosest(this, maxLimit, dxy); +}; + +/** + * Add highlighting around this connection. + */ +Blockly.RenderedConnection.prototype.highlight = function() { + var steps; + var sourceBlockSvg = /** @type {!Blockly.BlockSvg} */ (this.sourceBlock_); + var renderConstants = sourceBlockSvg.workspace.getRenderer().getConstants(); + var shape = renderConstants.shapeFor(this); + if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { + // Vertical line, puzzle tab, vertical line. + var yLen = renderConstants.TAB_OFFSET_FROM_TOP; + steps = Blockly.utils.svgPaths.moveBy(0, -yLen) + + Blockly.utils.svgPaths.lineOnAxis('v', yLen) + + shape.pathDown + + Blockly.utils.svgPaths.lineOnAxis('v', yLen); + } else { + var xLen = + renderConstants.NOTCH_OFFSET_LEFT - renderConstants.CORNER_RADIUS; + // Horizontal line, notch, horizontal line. + steps = Blockly.utils.svgPaths.moveBy(-xLen, 0) + + Blockly.utils.svgPaths.lineOnAxis('h', xLen) + + shape.pathLeft + + Blockly.utils.svgPaths.lineOnAxis('h', xLen); + } + var xy = this.sourceBlock_.getRelativeToSurfaceXY(); + var x = this.x - xy.x; + var y = this.y - xy.y; + Blockly.Connection.highlightedPath_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.PATH, + { + 'class': 'blocklyHighlightedConnectionPath', + 'd': steps, + transform: 'translate(' + x + ',' + y + ')' + + (this.sourceBlock_.RTL ? ' scale(-1 1)' : '') + }, + this.sourceBlock_.getSvgRoot()); +}; + +/** + * Remove the highlighting around this connection. + */ +Blockly.RenderedConnection.prototype.unhighlight = function() { + Blockly.utils.dom.removeNode(Blockly.Connection.highlightedPath_); + delete Blockly.Connection.highlightedPath_; +}; + +/** + * Set whether this connections is tracked in the database or not. + * @param {boolean} doTracking If true, start tracking. If false, stop tracking. + * @package + */ +Blockly.RenderedConnection.prototype.setTracking = function(doTracking) { + if ((doTracking && this.trackedState_ == + Blockly.RenderedConnection.TrackedState.TRACKED) || + (!doTracking && this.trackedState_ == + Blockly.RenderedConnection.TrackedState.UNTRACKED)) { + return; + } + if (this.sourceBlock_.isInFlyout) { + // Don't bother maintaining a database of connections in a flyout. + return; + } + if (doTracking) { + this.db_.addConnection(this, this.y); + this.trackedState_ = Blockly.RenderedConnection.TrackedState.TRACKED; + return; + } + if (this.trackedState_ == Blockly.RenderedConnection.TrackedState.TRACKED) { + this.db_.removeConnection(this, this.y); + } + this.trackedState_ = Blockly.RenderedConnection.TrackedState.UNTRACKED; +}; + +/** + * 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 + */ +Blockly.RenderedConnection.prototype.stopTrackingAll = function() { + this.setTracking(false); + if (this.targetConnection) { + var blocks = this.targetBlock().getDescendants(false); + for (var i = 0; i < blocks.length; i++) { + var block = blocks[i]; + // Stop tracking connections of all children. + var connections = block.getConnections_(true); + for (var j = 0; j < connections.length; j++) { + connections[j].setTracking(false); + } + // Close all bubbles of all children. + var icons = block.getIcons(); + for (var j = 0; j < icons.length; j++) { + icons[j].setVisible(false); + } + } + } +}; + +/** + * 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. + */ +Blockly.RenderedConnection.prototype.startTrackingAll = function() { + this.setTracking(true); + // All blocks that are not tracked must start tracking before any + // rendering takes place, since rendering requires knowing the dimensions + // of lower blocks. Also, since rendering a block renders all its parents, + // we only need to render the leaf nodes. + var renderList = []; + if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { + // Only spider down. + return renderList; + } + var block = this.targetBlock(); + if (block) { + var connections; + if (block.isCollapsed()) { + // This block should only be partially revealed since it is collapsed. + connections = []; + block.outputConnection && connections.push(block.outputConnection); + block.nextConnection && connections.push(block.nextConnection); + block.previousConnection && connections.push(block.previousConnection); + } else { + // Show all connections of this block. + connections = block.getConnections_(true); + } + for (var i = 0; i < connections.length; i++) { + renderList.push.apply(renderList, connections[i].startTrackingAll()); + } + if (!renderList.length) { + // Leaf block. + renderList[0] = block; + } + } + return renderList; +}; + +/** + * 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. + * @deprecated July 2020 + */ +Blockly.RenderedConnection.prototype.isConnectionAllowed = function(candidate, + maxRadius) { + Blockly.utils.deprecation.warn( + 'RenderedConnection.prototype.isConnectionAllowed', + 'July 2020', + 'July 2021', + 'Blockly.Workspace.prototype.getConnectionChecker().canConnect'); + if (this.distanceFrom(candidate) > maxRadius) { + return false; + } + + return Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this, + candidate); +}; + +/** + * Behavior after a connection attempt fails. + * @param {!Blockly.Connection} otherConnection Connection that this connection + * failed to connect to. + * @package + */ +Blockly.RenderedConnection.prototype.onFailedConnect = function( + otherConnection) { + this.bumpAwayFrom(otherConnection); +}; + + +/** + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. + * @private + */ +Blockly.RenderedConnection.prototype.disconnectInternal_ = function(parentBlock, + childBlock) { + Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this, + parentBlock, childBlock); + // Rerender the parent so that it may reflow. + if (parentBlock.rendered) { + parentBlock.render(); + } + if (childBlock.rendered) { + childBlock.updateDisabled(); + childBlock.render(); + // Reset visibility, since the child is now a top block. + childBlock.getSvgRoot().style.display = 'block'; + } +}; + +/** + * Respawn the shadow block if there was one connected to the this connection. + * Render/rerender blocks as needed. + * @private + */ +Blockly.RenderedConnection.prototype.respawnShadow_ = function() { + Blockly.RenderedConnection.superClass_.respawnShadow_.call(this); + var blockShadow = this.targetBlock(); + if (!blockShadow) { + // This connection must not have a shadowDom_. + return; + } + blockShadow.initSvg(); + blockShadow.render(false); + + var parentBlock = this.getSourceBlock(); + if (parentBlock.rendered) { + parentBlock.render(); + } +}; + +/** + * Find all nearby compatible connections to this connection. + * Type checking does not apply, since this function is used for bumping. + * @param {number} maxLimit The maximum radius to another connection, in + * workspace units. + * @return {!Array.} List of connections. + * @package + */ +Blockly.RenderedConnection.prototype.neighbours = function(maxLimit) { + return this.dbOpposite_.getNeighbours(this, maxLimit); +}; + +/** + * Connect two connections together. This is the connection on the superior + * block. Rerender blocks as needed. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @protected + */ +Blockly.RenderedConnection.prototype.connect_ = function(childConnection) { + Blockly.RenderedConnection.superClass_.connect_.call(this, childConnection); + + var parentConnection = this; + var parentBlock = parentConnection.getSourceBlock(); + var childBlock = childConnection.getSourceBlock(); + var parentRendered = parentBlock.rendered; + var childRendered = childBlock.rendered; + + if (parentRendered) { + parentBlock.updateDisabled(); + } + if (childRendered) { + childBlock.updateDisabled(); + } + if (parentRendered && childRendered) { + if (parentConnection.type == Blockly.NEXT_STATEMENT || + parentConnection.type == Blockly.PREVIOUS_STATEMENT) { + // Child block may need to square off its corners if it is in a stack. + // Rendering a child will render its parent. + childBlock.render(); + } else { + // Child block does not change shape. Rendering the parent node will + // move its connected children into position. + parentBlock.render(); + } + } + + // The input the child block is connected to (if any). + var parentInput = parentBlock.getInputWithBlock(childBlock); + if (parentInput) { + var visible = parentInput.isVisible(); + childBlock.getSvgRoot().style.display = visible ? 'block' : 'none'; + } +}; + +/** + * Function to be called when this connection's compatible types have changed. + * @protected + */ +Blockly.RenderedConnection.prototype.onCheckChanged_ = function() { + // The new value type may not be compatible with the existing connection. + if (this.isConnected() && (!this.targetConnection || + !this.getConnectionChecker().canConnect( + this, this.targetConnection, false))) { + var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; + child.unplug(); + // Bump away. + this.sourceBlock_.bumpNeighbours(); + } +}; diff --git a/static/js/dist/core/renderers/common/block_rendering.js b/static/js/dist/core/renderers/common/block_rendering.js new file mode 100644 index 0000000..8b4a2b5 --- /dev/null +++ b/static/js/dist/core/renderers/common/block_rendering.js @@ -0,0 +1,81 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Namespace for block rendering functionality. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +/** + * The top level namespace for block rendering. + * @namespace Blockly.blockRendering + */ +goog.provide('Blockly.blockRendering'); + +goog.require('Blockly.registry'); +goog.require('Blockly.utils.object'); + + +/** + * Whether or not the debugger is turned on. + * @type {boolean} + * @package + */ +Blockly.blockRendering.useDebugger = false; + +/** + * 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. + */ +Blockly.blockRendering.register = function(name, rendererClass) { + Blockly.registry.register(Blockly.registry.Type.RENDERER, name, + rendererClass); +}; + +/** + * Unregisters the renderer registered with the given name. + * @param {string} name The name of the renderer. + */ +Blockly.blockRendering.unregister = function(name) { + Blockly.registry.unregister(Blockly.registry.Type.RENDERER, name); +}; +/** + * Turn on the blocks debugger. + * @package + */ +Blockly.blockRendering.startDebugger = function() { + Blockly.blockRendering.useDebugger = true; +}; + +/** + * Turn off the blocks debugger. + * @package + */ +Blockly.blockRendering.stopDebugger = function() { + Blockly.blockRendering.useDebugger = false; +}; + +/** + * Initialize anything needed for rendering (constants, etc). + * @param {!string} name Name of the renderer to initialize. + * @param {!Blockly.Theme} theme The workspace theme object. + * @param {Object=} opt_rendererOverrides Rendering constant overrides. + * @return {!Blockly.blockRendering.Renderer} The new instance of a renderer. + * Already initialized. + * @package + */ + +Blockly.blockRendering.init = function(name, theme, opt_rendererOverrides) { + var rendererClass = Blockly.registry.getClass( + Blockly.registry.Type.RENDERER, name); + var renderer = new rendererClass(name); + renderer.init(theme, opt_rendererOverrides); + return renderer; +}; diff --git a/static/js/dist/core/renderers/common/constants.js b/static/js/dist/core/renderers/common/constants.js new file mode 100644 index 0000000..6044318 --- /dev/null +++ b/static/js/dist/core/renderers/common/constants.js @@ -0,0 +1,1257 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview An object that provides constants for rendering blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.blockRendering.ConstantProvider'); + +goog.require('Blockly.constants'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.colour'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.svgPaths'); +goog.require('Blockly.utils.userAgent'); + +goog.requireType('Blockly.blockRendering.Debug'); + + +/** + * An object that provides constants for rendering blocks. + * @constructor + * @package + */ +Blockly.blockRendering.ConstantProvider = function() { + + /** + * The size of an empty spacer. + * @type {number} + */ + this.NO_PADDING = 0; + + /** + * The size of small padding. + * @type {number} + */ + this.SMALL_PADDING = 3; + + /** + * The size of medium padding. + * @type {number} + */ + this.MEDIUM_PADDING = 5; + + /** + * The size of medium-large padding. + * @type {number} + */ + this.MEDIUM_LARGE_PADDING = 8; + + /** + * The size of large padding. + * @type {number} + */ + this.LARGE_PADDING = 10; + + /** + * 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} + */ + this.TALL_INPUT_FIELD_OFFSET_Y = this.MEDIUM_PADDING; + + /** + * The height of the puzzle tab used for input and output connections. + * @type {number} + */ + this.TAB_HEIGHT = 15; + + /** + * The offset from the top of the block at which a puzzle tab is positioned. + * @type {number} + */ + this.TAB_OFFSET_FROM_TOP = 5; + + /** + * Vertical overlap of the puzzle tab, used to make it look more like a puzzle + * piece. + * @type {number} + */ + this.TAB_VERTICAL_OVERLAP = 2.5; + + /** + * The width of the puzzle tab used for input and output connections. + * @type {number} + */ + this.TAB_WIDTH = 8; + + /** + * The width of the notch used for previous and next connections. + * @type {number} + */ + this.NOTCH_WIDTH = 15; + + /** + * The height of the notch used for previous and next connections. + * @type {number} + */ + this.NOTCH_HEIGHT = 4; + + /** + * The minimum width of the block. + * @type {number} + */ + this.MIN_BLOCK_WIDTH = 12; + + this.EMPTY_BLOCK_SPACER_HEIGHT = 16; + + /** + * The minimum height of a dummy input row. + * @type {number} + */ + this.DUMMY_INPUT_MIN_HEIGHT = this.TAB_HEIGHT; + + /** + * The minimum height of a dummy input row in a shadow block. + * @type {number} + */ + this.DUMMY_INPUT_SHADOW_MIN_HEIGHT = this.TAB_HEIGHT; + + /** + * Rounded corner radius. + * @type {number} + */ + this.CORNER_RADIUS = 8; + + /** + * Offset from the left side of a block or the inside of a statement input to + * the left side of the notch. + * @type {number} + */ + this.NOTCH_OFFSET_LEFT = 15; + + /** + * Additional offset added to the statement input's width to account for the + * notch. + * @type {number} + */ + this.STATEMENT_INPUT_NOTCH_OFFSET = this.NOTCH_OFFSET_LEFT; + + this.STATEMENT_BOTTOM_SPACER = 0; + this.STATEMENT_INPUT_PADDING_LEFT = 20; + + /** + * Vertical padding between consecutive statement inputs. + * @type {number} + */ + this.BETWEEN_STATEMENT_PADDING_Y = 4; + + /** + * The top row's minimum height. + * @type {number} + */ + this.TOP_ROW_MIN_HEIGHT = this.MEDIUM_PADDING; + + /** + * The top row's minimum height if it precedes a statement. + * @type {number} + */ + this.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT = this.LARGE_PADDING; + + /** + * The bottom row's minimum height. + * @type {number} + */ + this.BOTTOM_ROW_MIN_HEIGHT = this.MEDIUM_PADDING; + + /** + * The bottom row's minimum height if it follows a statement input. + * @type {number} + */ + this.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT = this.LARGE_PADDING; + + /** + * 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} + */ + this.ADD_START_HATS = false; + + /** + * Height of the top hat. + * @type {number} + */ + this.START_HAT_HEIGHT = 15; + + /** + * Width of the top hat. + * @type {number} + */ + this.START_HAT_WIDTH = 100; + + this.SPACER_DEFAULT_HEIGHT = 15; + + this.MIN_BLOCK_HEIGHT = 24; + + this.EMPTY_INLINE_INPUT_PADDING = 14.5; + + /** + * The height of an empty inline input. + * @type {number} + */ + this.EMPTY_INLINE_INPUT_HEIGHT = this.TAB_HEIGHT + 11; + + this.EXTERNAL_VALUE_INPUT_PADDING = 2; + + /** + * 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} + */ + this.EMPTY_STATEMENT_INPUT_HEIGHT = this.MIN_BLOCK_HEIGHT; + + this.START_POINT = Blockly.utils.svgPaths.moveBy(0, 0); + + /** + * Height of SVG path for jagged teeth at the end of collapsed blocks. + * @type {number} + */ + this.JAGGED_TEETH_HEIGHT = 12; + + /** + * Width of SVG path for jagged teeth at the end of collapsed blocks. + * @type {number} + */ + this.JAGGED_TEETH_WIDTH = 6; + + /** + * Point size of text. + * @type {number} + */ + this.FIELD_TEXT_FONTSIZE = 11; + + /** + * Text font weight. + * @type {string} + */ + this.FIELD_TEXT_FONTWEIGHT = 'normal'; + + /** + * Text font family. + * @type {string} + */ + this.FIELD_TEXT_FONTFAMILY = 'sans-serif'; + + /** + * Height of text. This constant is dynamically set in ``setFontConstants_`` + * to be the height of the text based on the font used. + * @type {number} + */ + this.FIELD_TEXT_HEIGHT = -1; // Dynamically set + + /** + * Text baseline. This constant is dynamically set in ``setFontConstants_`` + * to be the baseline of the text based on the font used. + * @type {number} + */ + this.FIELD_TEXT_BASELINE = -1; // Dynamically set + + /** + * A field's border rect corner radius. + * @type {number} + */ + this.FIELD_BORDER_RECT_RADIUS = 4; + + /** + * A field's border rect default height. + * @type {number} + */ + this.FIELD_BORDER_RECT_HEIGHT = 16; + + /** + * A field's border rect X padding. + * @type {number} + */ + this.FIELD_BORDER_RECT_X_PADDING = 5; + + /** + * A field's border rect Y padding. + * @type {number} + */ + this.FIELD_BORDER_RECT_Y_PADDING = 3; + + /** + * The backing colour of a field's border rect. + * @type {string} + * @package + */ + this.FIELD_BORDER_RECT_COLOUR = '#fff'; + + /** + * A field's text element's dominant baseline. + * @type {boolean} + */ + this.FIELD_TEXT_BASELINE_CENTER = + !Blockly.utils.userAgent.IE && !Blockly.utils.userAgent.EDGE; + + /** + * A dropdown field's border rect height. + * @type {number} + */ + this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT = this.FIELD_BORDER_RECT_HEIGHT; + + /** + * Whether or not a dropdown field should add a border rect when in a shadow + * block. + * @type {boolean} + */ + this.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW = false; + + /** + * Whether or not a dropdown field's div should be coloured to match the + * block colours. + * @type {boolean} + */ + this.FIELD_DROPDOWN_COLOURED_DIV = false; + + /** + * Whether or not a dropdown field uses a text or SVG arrow. + * @type {boolean} + */ + this.FIELD_DROPDOWN_SVG_ARROW = false; + + /** + * A dropdown field's SVG arrow padding. + * @type {number} + */ + this.FIELD_DROPDOWN_SVG_ARROW_PADDING = this.FIELD_BORDER_RECT_X_PADDING; + + /** + * A dropdown field's SVG arrow size. + * @type {number} + */ + this.FIELD_DROPDOWN_SVG_ARROW_SIZE = 12; + + /** + * A dropdown field's SVG arrow datauri. + * @type {string} + */ + this.FIELD_DROPDOWN_SVG_ARROW_DATAURI = + 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllci' + + 'AxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMi43MSIgaG' + + 'VpZ2h0PSI4Ljc5IiB2aWV3Qm94PSIwIDAgMTIuNzEgOC43OSI+PHRpdGxlPmRyb3Bkb3duLW' + + 'Fycm93PC90aXRsZT48ZyBvcGFjaXR5PSIwLjEiPjxwYXRoIGQ9Ik0xMi43MSwyLjQ0QTIuND' + + 'EsMi40MSwwLDAsMSwxMiw0LjE2TDguMDgsOC4wOGEyLjQ1LDIuNDUsMCwwLDEtMy40NSwwTD' + + 'AuNzIsNC4xNkEyLjQyLDIuNDIsMCwwLDEsMCwyLjQ0LDIuNDgsMi40OCwwLDAsMSwuNzEuNz' + + 'FDMSwwLjQ3LDEuNDMsMCw2LjM2LDBTMTEuNzUsMC40NiwxMiwuNzFBMi40NCwyLjQ0LDAsMC' + + 'wxLDEyLjcxLDIuNDRaIiBmaWxsPSIjMjMxZjIwIi8+PC9nPjxwYXRoIGQ9Ik02LjM2LDcuNz' + + 'lhMS40MywxLjQzLDAsMCwxLTEtLjQyTDEuNDIsMy40NWExLjQ0LDEuNDQsMCwwLDEsMC0yYz' + + 'AuNTYtLjU2LDkuMzEtMC41Niw5Ljg3LDBhMS40NCwxLjQ0LDAsMCwxLDAsMkw3LjM3LDcuMz' + + 'dBMS40MywxLjQzLDAsMCwxLDYuMzYsNy43OVoiIGZpbGw9IiNmZmYiLz48L3N2Zz4='; + + /** + * Whether or not to show a box shadow around the widget div. This is only a + * feature of full block fields. + * @type {boolean} + */ + this.FIELD_TEXTINPUT_BOX_SHADOW = false; + + /** + * Whether or not the colour field should display its colour value on the + * entire block. + * @type {boolean} + */ + this.FIELD_COLOUR_FULL_BLOCK = false; + + /** + * A colour field's default width. + * @type {number} + */ + this.FIELD_COLOUR_DEFAULT_WIDTH = 26; + + /** + * A colour field's default height. + * @type {number} + */ + this.FIELD_COLOUR_DEFAULT_HEIGHT = this.FIELD_BORDER_RECT_HEIGHT; + + /** + * A checkbox field's X offset. + * @type {number} + */ + this.FIELD_CHECKBOX_X_OFFSET = this.FIELD_BORDER_RECT_X_PADDING - 3; + + /** + * 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} + * @package + */ + this.randomIdentifier = String(Math.random()).substring(2); + + /** + * The ID of the emboss filter, or the empty string if no filter is set. + * @type {string} + * @package + */ + this.embossFilterId = ''; + + /** + * The element to use for highlighting, or null if not set. + * @type {SVGElement} + * @private + */ + this.embossFilter_ = null; + + /** + * The ID of the disabled pattern, or the empty string if no pattern is set. + * @type {string} + * @package + */ + this.disabledPatternId = ''; + + /** + * The element to use for disabled blocks, or null if not set. + * @type {SVGElement} + * @private + */ + this.disabledPattern_ = null; + + /** + * The ID of the debug filter, or the empty string if no pattern is set. + * @type {string} + * @package + */ + this.debugFilterId = ''; + + /** + * The element to use for a debug highlight, or null if not set. + * @type {SVGElement} + * @private + */ + this.debugFilter_ = null; + + /** + * The
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/static/js/dist/generators/lua/math.js b/static/js/dist/generators/lua/math.js new file mode 100644 index 0000000..23f0485 --- /dev/null +++ b/static/js/dist/generators/lua/math.js @@ -0,0 +1,423 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/lua/procedures.js b/static/js/dist/generators/lua/procedures.js new file mode 100644 index 0000000..156c3c7 --- /dev/null +++ b/static/js/dist/generators/lua/procedures.js @@ -0,0 +1,113 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.Lua.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.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/static/js/dist/generators/lua/text.js b/static/js/dist/generators/lua/text.js new file mode 100644 index 0000000..12ceefe --- /dev/null +++ b/static/js/dist/generators/lua/text.js @@ -0,0 +1,355 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('..') != -1 ? Blockly.Lua.ORDER_CONCATENATION : + Blockly.Lua.ORDER_ATOMIC; + return [code, order]; +}; + +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_NONE) || '\'\''; + var code = 'string.reverse(' + text + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/static/js/dist/generators/lua/variables.js b/static/js/dist/generators/lua/variables.js new file mode 100644 index 0000000..9249a43 --- /dev/null +++ b/static/js/dist/generators/lua/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/lua/variables_dynamic.js b/static/js/dist/generators/lua/variables_dynamic.js new file mode 100644 index 0000000..ac4456d --- /dev/null +++ b/static/js/dist/generators/lua/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/php.js b/static/js/dist/generators/php.js new file mode 100644 index 0000000..326cc8e --- /dev/null +++ b/static/js/dist/generators/php.js @@ -0,0 +1,324 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_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] +]; + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.PHP.isInitialized = false; + +/** + * 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'); + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +Blockly.PHP.multiline_quote_ = function (string) { + var lines = string.split(/\n/g).map(Blockly.PHP.quote_); + // Join with the following, plus a newline: + // . "\n" . + // Newline escaping only works in double-quoted strings. + return lines.join(' . \"\\n\" .\n'); +}; + +/** + * Common tasks for generating PHP from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The PHP code created for this block. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} PHP code with comments and subsequent blocks added. + * @protected + */ +Blockly.PHP.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.PHP.COMMENT_WRAP - 3); + commentCode += Blockly.PHP.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.PHP.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.PHP.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Blockly.PHP.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.PHP.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.PHP.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta > 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/static/js/dist/generators/php/colour.js b/static/js/dist/generators/php/colour.js new file mode 100644 index 0000000..a785fb3 --- /dev/null +++ b/static/js/dist/generators/php/colour.js @@ -0,0 +1,91 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || 0; + var green = Blockly.PHP.valueToCode(block, 'GREEN', + Blockly.PHP.ORDER_NONE) || 0; + var blue = Blockly.PHP.valueToCode(block, 'BLUE', + Blockly.PHP.ORDER_NONE) || 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_NONE) || '\'#000000\''; + var c2 = Blockly.PHP.valueToCode(block, 'COLOUR2', + Blockly.PHP.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.PHP.valueToCode(block, 'RATIO', + Blockly.PHP.ORDER_NONE) || 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/static/js/dist/generators/php/lists.js b/static/js/dist/generators/php/lists.js new file mode 100644 index 0000000..a985ce4 --- /dev/null +++ b/static/js/dist/generators/php/lists.js @@ -0,0 +1,498 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || '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_NONE) || 'null'; + var repeatCount = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '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_NONE) || '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_NONE) || '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_NONE) || 'array()'; + return 'array_unshift(' + list + ', ' + value + ');\n'; + } + break; + case 'LAST': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '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_NONE) || 'array()'; + return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n'; + } + break; + case 'FROM_END': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '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_NONE) || '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_NONE); + var value_delim = Blockly.PHP.valueToCode(block, 'DELIM', + Blockly.PHP.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!value_input) { + value_input = '\'\''; + } + var functionName = 'explode'; + } else if (mode == 'JOIN') { + if (!value_input) { + value_input = 'array()'; + } + var functionName = 'implode'; + } else { + throw 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_NONE) || '[]'; + var code = 'array_reverse(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/static/js/dist/generators/php/logic.js b/static/js/dist/generators/php/logic.js new file mode 100644 index 0000000..4519932 --- /dev/null +++ b/static/js/dist/generators/php/logic.js @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/php/loops.js b/static/js/dist/generators/php/loops.js new file mode 100644 index 0000000..265bbe6 --- /dev/null +++ b/static/js/dist/generators/php/loops.js @@ -0,0 +1,170 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/php/math.js b/static/js/dist/generators/php/math.js new file mode 100644 index 0000000..397dc5d --- /dev/null +++ b/static/js/dist/generators/php/math.js @@ -0,0 +1,370 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'LOW', + Blockly.PHP.ORDER_NONE) || '0'; + var argument2 = Blockly.PHP.valueToCode(block, 'HIGH', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'Y', + Blockly.PHP.ORDER_NONE) || '0'; + return ['atan2(' + argument1 + ', ' + argument0 + ') / pi() * 180', + Blockly.PHP.ORDER_DIVISION]; +}; diff --git a/static/js/dist/generators/php/procedures.js b/static/js/dist/generators/php/procedures.js new file mode 100644 index 0000000..d500047 --- /dev/null +++ b/static/js/dist/generators/php/procedures.js @@ -0,0 +1,132 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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.getVars().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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.PHP.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i, + Blockly.PHP.ORDER_NONE) || '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/static/js/dist/generators/php/text.js b/static/js/dist/generators/php/text.js new file mode 100644 index 0000000..b598f7a --- /dev/null +++ b/static/js/dist/generators/php/text.js @@ -0,0 +1,274 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('.') != -1 ? Blockly.PHP.ORDER_STRING_CONCAT : + Blockly.PHP.ORDER_ATOMIC; + return [code, order]; +}; + +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_NONE]; + } else if (block.itemCount_ == 2) { + var element0 = Blockly.PHP.valueToCode(block, 'ADD0', + Blockly.PHP.ORDER_STRING_CONCAT) || '\'\''; + var element1 = Blockly.PHP.valueToCode(block, 'ADD1', + Blockly.PHP.ORDER_STRING_CONCAT) || '\'\''; + 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_NONE) || '\'\''; + } + 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_NONE; + 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 where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var text = Blockly.PHP.valueToCode(block, 'STRING', + Blockly.PHP.ORDER_NONE) || '\'\''; + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + return [code, Blockly.PHP.ORDER_NONE]; + } 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_NONE) || '\'\''; + 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_NONE) || '\'\''; + 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_NONE) || '\'\''; + var code = 'strrev(' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/static/js/dist/generators/php/variables.js b/static/js/dist/generators/php/variables.js new file mode 100644 index 0000000..5ac4849 --- /dev/null +++ b/static/js/dist/generators/php/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/php/variables_dynamic.js b/static/js/dist/generators/php/variables_dynamic.js new file mode 100644 index 0000000..3b1584c --- /dev/null +++ b/static/js/dist/generators/php/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/python.js b/static/js/dist/generators/python.js new file mode 100644 index 0000000..9844b95 --- /dev/null +++ b/static/js/dist/generators/python.js @@ -0,0 +1,329 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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] +]; + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.Python.isInitialized = false; + +/** + * 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'); + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +Blockly.Python.multiline_quote_ = function(string) { + var lines = string.split(/\n/g).map(Blockly.Python.quote_); + // Join with the following, plus a newline: + // + '\n' + + return lines.join(' + \'\\n\' + \n'); +}; + +/** + * 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. + * @protected + */ +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/static/js/dist/generators/python/colour.js b/static/js/dist/generators/python/colour.js new file mode 100644 index 0000000..6be61d3 --- /dev/null +++ b/static/js/dist/generators/python/colour.js @@ -0,0 +1,72 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/python/lists.js b/static/js/dist/generators/python/lists.js new file mode 100644 index 0000000..647cbc7 --- /dev/null +++ b/static/js/dist/generators/python/lists.js @@ -0,0 +1,349 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/python/logic.js b/static/js/dist/generators/python/logic.js new file mode 100644 index 0000000..67e06ac --- /dev/null +++ b/static/js/dist/generators/python/logic.js @@ -0,0 +1,127 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/python/loops.js b/static/js/dist/generators/python/loops.js new file mode 100644 index 0000000..792d887 --- /dev/null +++ b/static/js/dist/generators/python/loops.js @@ -0,0 +1,214 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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(); + } else { + range = defineDownRange(); + } + range += '(' + startVar + ', ' + endVar + ', ' + incVar + ')'; + } else { + // We cannot determine direction statically. + range = generateUpDownRange(startVar, endVar, incVar); + } + } + 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/static/js/dist/generators/python/math.js b/static/js/dist/generators/python/math.js new file mode 100644 index 0000000..c5d3eb6 --- /dev/null +++ b/static/js/dist/generators/python/math.js @@ -0,0 +1,385 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/python/procedures.js b/static/js/dist/generators/python/procedures.js new file mode 100644 index 0000000..521b5e4 --- /dev/null +++ b/static/js/dist/generators/python/procedures.js @@ -0,0 +1,134 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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.getVars().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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.Python.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.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/static/js/dist/generators/python/text.js b/static/js/dist/generators/python/text.js new file mode 100644 index 0000000..82fe8d0 --- /dev/null +++ b/static/js/dist/generators/python/text.js @@ -0,0 +1,297 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('+') != -1 ? Blockly.Python.ORDER_ADDITIVE : + Blockly.Python.ORDER_ATOMIC; + return [code, order]; +}; + +/** + * Enclose the provided value in 'str(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {[string, number]} Array containing code evaluating to a string and + * the order of the returned code. + * @private + */ +Blockly.Python.text.forceString_ = function(value) { + if (Blockly.Python.text.forceString_.strRegExp.test(value)) { + return [value, Blockly.Python.ORDER_ATOMIC]; + } + return ['str(' + value + ')', Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +/** + * 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 codeAndOrder = Blockly.Python.text.forceString_(element); + return codeAndOrder; + 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)[0] + ' + ' + + Blockly.Python.text.forceString_(element1)[0]; + 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)[0] + '\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 textOrder = (where == 'RANDOM') ? Blockly.Python.ORDER_NONE : + Blockly.Python.ORDER_MEMBER; + var text = Blockly.Python.valueToCode(block, 'VALUE', textOrder) || '\'\''; + 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_FUNCTION_CALL]; +}; + +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/static/js/dist/generators/python/variables.js b/static/js/dist/generators/python/variables.js new file mode 100644 index 0000000..f72f4c1 --- /dev/null +++ b/static/js/dist/generators/python/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/generators/python/variables_dynamic.js b/static/js/dist/generators/python/variables_dynamic.js new file mode 100644 index 0000000..34fc1a4 --- /dev/null +++ b/static/js/dist/generators/python/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/dist/index.d.ts b/static/js/dist/index.d.ts new file mode 100644 index 0000000..10324ba --- /dev/null +++ b/static/js/dist/index.d.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// +/// +/// +/// + +import * as Blockly from './core'; +import './blocks'; +import './javascript'; +import './msg/en'; + +export = Blockly; diff --git a/static/js/dist/index.js b/static/js/dist/index.js new file mode 100644 index 0000000..fe8dd40 --- /dev/null +++ b/static/js/dist/index.js @@ -0,0 +1,24 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./browser'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./node')); + } else { // Browser + root.Blockly = factory(root.Blockly); + } +}(this, function(Blockly) { +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly module. + */ + +/* eslint-disable */ +'use strict'; +return Blockly; +})); diff --git a/static/js/dist/javascript.d.ts b/static/js/dist/javascript.d.ts new file mode 100644 index 0000000..f1a14ba --- /dev/null +++ b/static/js/dist/javascript.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the JavaScript generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/dist/javascript.js b/static/js/dist/javascript.js new file mode 100644 index 0000000..d0cb51a --- /dev/null +++ b/static/js/dist/javascript.js @@ -0,0 +1,27 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./core', './javascript_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./core'), require('./javascript_compressed.js')); + } else { // Browser + root.BlocklyJavaScript = factory(root.Blockly, root.BlocklyJavaScript); + } +}(this, function(Blockly, BlocklyJavaScript) { +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview JavaScript Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.JavaScript = BlocklyJavaScript; + +return BlocklyJavaScript; +})); diff --git a/static/js/dist/javascript_compressed.js b/static/js/dist/javascript_compressed.js new file mode 100644 index 0000000..b492f72 --- /dev/null +++ b/static/js/dist/javascript_compressed.js @@ -0,0 +1,115 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.JavaScript = factory(root.Blockly); + } +}(this, function(Blockly) { + '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.isInitialized=!1; +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_NONE)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_NONE)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_NONE)||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_NONE)||"'#000000'",c=Blockly.JavaScript.valueToCode(a,"COLOUR2",Blockly.JavaScript.ORDER_NONE)||"'#000000'";a=Blockly.JavaScript.valueToCode(a,"RATIO",Blockly.JavaScript.ORDER_NONE)||.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_NONE]}[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_NONE)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";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_NONE)||"0",c=Blockly.JavaScript.valueToCode(a,"LOW",Blockly.JavaScript.ORDER_NONE)||"0";a=Blockly.JavaScript.valueToCode(a,"HIGH",Blockly.JavaScript.ORDER_NONE)||"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_NONE)||"0";a=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_NONE)||"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_NONE)||"0";return["Math.atan2("+(Blockly.JavaScript.valueToCode(a,"Y",Blockly.JavaScript.ORDER_NONE)||"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 h=[],l=a.getVars(),k=0;k + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/dist/lua.js b/static/js/dist/lua.js new file mode 100644 index 0000000..a6f3a49 --- /dev/null +++ b/static/js/dist/lua.js @@ -0,0 +1,27 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./core', './lua_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./core'), require('./lua_compressed.js')); + } else { // Browser + root.BlocklyLua = factory(root.Blockly, root.BlocklyLua); + } +}(this, function(Blockly, BlocklyLua) { +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Lua Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Lua = BlocklyLua; + +return BlocklyLua; +})); diff --git a/static/js/dist/lua_compressed.js b/static/js/dist/lua_compressed.js new file mode 100644 index 0000000..e9be9ac --- /dev/null +++ b/static/js/dist/lua_compressed.js @@ -0,0 +1,94 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.Lua = factory(root.Blockly); + } +}(this, function(Blockly) { + 'use strict';Blockly.Lua=new Blockly.Generator("Lua");Blockly.Lua.addReservedWords("_,__inext,assert,bit,colors,colours,coroutine,disk,dofile,error,fs,fetfenv,getmetatable,gps,help,io,ipairs,keys,loadfile,loadstring,math,native,next,os,paintutils,pairs,parallel,pcall,peripheral,print,printError,rawequal,rawget,rawset,read,rednet,redstone,rs,select,setfenv,setmetatable,sleep,string,table,term,textutils,tonumber,tostring,turtle,type,unpack,vector,write,xpcall,_VERSION,__indext,HTTP,and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,repeat,return,then,true,until,while,add,sub,mul,div,mod,pow,unm,concat,len,eq,lt,le,index,newindex,call,assert,collectgarbage,dofile,error,_G,getmetatable,inpairs,load,loadfile,next,pairs,pcall,print,rawequal,rawget,rawlen,rawset,select,setmetatable,tonumber,tostring,type,_VERSION,xpcall,require,package,string,table,math,bit32,io,file,os,debug"); +Blockly.Lua.ORDER_ATOMIC=0;Blockly.Lua.ORDER_HIGH=1;Blockly.Lua.ORDER_EXPONENTIATION=2;Blockly.Lua.ORDER_UNARY=3;Blockly.Lua.ORDER_MULTIPLICATIVE=4;Blockly.Lua.ORDER_ADDITIVE=5;Blockly.Lua.ORDER_CONCATENATION=6;Blockly.Lua.ORDER_RELATIONAL=7;Blockly.Lua.ORDER_AND=8;Blockly.Lua.ORDER_OR=9;Blockly.Lua.ORDER_NONE=99;Blockly.Lua.isInitialized=!1; +Blockly.Lua.init=function(a){Blockly.Lua.definitions_=Object.create(null);Blockly.Lua.functionNames_=Object.create(null);Blockly.Lua.variableDB_?Blockly.Lua.variableDB_.reset():Blockly.Lua.variableDB_=new Blockly.Names(Blockly.Lua.RESERVED_WORDS_);Blockly.Lua.variableDB_.setVariableMap(a.getVariableMap());this.isInitialized=!0}; +Blockly.Lua.finish=function(a){var b=[],c;for(c in Blockly.Lua.definitions_)b.push(Blockly.Lua.definitions_[c]);delete Blockly.Lua.definitions_;delete Blockly.Lua.functionNames_;Blockly.Lua.variableDB_.reset();return b.join("\n\n")+"\n\n\n"+a};Blockly.Lua.scrubNakedValue=function(a){return"local _ = "+a+"\n"};Blockly.Lua.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/'/g,"\\'");return"'"+a+"'"};Blockly.Lua.multiline_quote_=function(a){return a.split(/\n/g).map(Blockly.Lua.quote_).join(" .. '\\n' ..\n")}; +Blockly.Lua.scrub_=function(a,b,c){var d="";if(!a.outputConnection||!a.outputConnection.targetConnection){var e=a.getCommentText();e&&(e=Blockly.utils.string.wrap(e,Blockly.Lua.COMMENT_WRAP-3),d+=Blockly.Lua.prefixLines(e,"-- ")+"\n");for(var f=0;f",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=[],l=a.getVars(),k=0;k5S_413-^&w3C0*Djhb23xn^V5J7*a`8)ASWpJ=BH$)Wu~SmB<7_k z6s6{7Rsh*al?v|p`RO^S3Z8k%djEe z|8W7JU6wwMzOKf4mKH^fXJM`pX;9&~;>5tv0CLC9h9lfCiIGA>B1ot=-=`$KfxBg% z!2xvxQN{%u1ZVItq(kKX|Nq&bz`W(yxy6|b2}}%!60c^lW>9qJNYT78cK7X1G`=?E8tc&Ve+j=v1Tvih0*@(UOg z)*t^hr9ta#q~@}-;m&2rD@0cDT)bT*!L`fq5ld(5;h8Pk2Y6UQCK#ON^K*&Q;bhss z9BrK3;2d=3SdT^1nUz-!lTNNk@Mmq?@6Ud%@A{J`(*oW^&e)mc81_B)Si14_drS7G zzq-2c_uuE{Khk^7tTS$rj-Ikr)v)XCym_1Z3znXKSJt+4_U@f=e}9{n-@o_q*!$1_ zEB<}`ef{>-}am~&Ni$6GlPLakVQmBho5g+#P@|YVu44#{>+Kski1s6Sk9!K zfj8soyG^C-EUk(PA#6;{Q6^WIn`c~D`^7+Hh82hGUKz=t+05gThWnaIbh@zJJ~KkT2if{=by{ zTQ@IoW{I(Pu>SSez~uDu?f?G|PglO@n5t)*8uVuWesE08RaG}_le~O;$&!upuPt3# z8=v`Re&nesyE{%Tj?H`UbN#;vFNOjJhOlWaokA)e6P3DTmN+f&5Mr6SvEXOSJm;zB zK{3S7d@XXazRmOo4h9AjU^KF=ZEbV+q!+WU9HsZvvK=+^CR?=u0PulcRlXv+U&QSpI=?S zCH&&rkF9I7s}8nGoo8jOQ&`u;r3EVh^^8^xAfUf1KrvLqe1L&*2{3~xKx1eCLtxZu H^bi05jng?> literal 0 HcmV?d00001 diff --git a/static/js/dist/media/click.ogg b/static/js/dist/media/click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e8ae42a6106dadbb6861981a696b7f8b8f64c9ae GIT binary patch literal 4865 zcmai13s_S}7QRu01OrA07;JQJkQ8nJB?w5^vgIL#1X3gS4T_I;7qX~&LkdY!roq9>%9EDy)D25XYk`Pxlv((8**}U z#o1|alvoJoq=LU(L2_mm9Gfpr$-seG>w~#rfncfM67Ukt;WA^nfwB3?l1y>FC>IQc zMzh&r?{Z@UV{>GZ6j1=YH9tQ$V9lCs+qSLF6-skt*+S{+97)<5Gr1<$tZ#FsShzVS z75tg>ZI+_?V0MmBoGKOx;pA)~ED>di-v_i{I~<;qla?uhnb|3;F^kM*A|au17zhh? zK#zj;MPt=G2qHkx78k^}HkFB}70qtj8x#>JrS~dtP?YOQDV21?uN~|obbufWsK^ah z)jGpWA7P}CT&pBa4Dq}E$6>3An0pM|UUfK=9WdBSh^3Q|5Q0U;mm%#95+KTK77P^uGokQ9MCKXd&>8ZzahK@t zJYwv9$Jd6%a@joa$dcjqkyK}B2>85OY zs&IPhz~*J8e+1TVnFE2Ok(+W-A*iJHtBT(Z!I=a6Yv$w;`wx+?9&(B7a$!$+T>H)^ z`l-*jeOQbSJJum-+(CBTQ55T!blq2UohOR|R`d6)D*0?0pyt%zTtz4-&eDsl~#rhAKv$f)QL&fp3irKO%xAJ;% zxl((fC3CQIzW4vO-!dm$;sP4ToG^*YYngM2P7Vdx)aAi`YPKoAo5T93;sexmRj|$F_D#%({#bDASwJxmR74-3 zUm;0Gm{*(DkI->P6ax%bb?pQb@vJAUMX2p|DGyYw6U?h^3Q}ankv6-OavfL%S%Kf; z=CNuAOb`)*1bB`$Qlj9DAT!mRLHa{7hs8LqiXCBKSI7tHmPd*Sh?*Qbg7lN+!@&<# z#bd#45CmVsfM1B4k1z}(xI*`GT}EqtB8k*U`>;`>Xv&^FRp)cf$2W${8?xt3a(QH3F_|s=jcu zF)OLzl_)mRB+8FB)#DqJ&x_%S61cpC0#U+qUc9j|5^!VLw;Xu99^S2IS-kqf`}w@2 zc+suryadNxiBl!_e<-|9LM2a4$^bXnC`vvjn|2c`#px|4v`ROvR-^67(st?+TjsPa z+QF_gZD+?|*Qt}8ne%|#c|zOeq1Aev?CN--^_cHDq3zWTcAakQJUQR<&Eh_f`QBV@ zXXnYTCn&d9H*d(B@AcZ*jtsS*eB7()?aiL=%^U8?BDZQEe@Yv=e0s3!oB7@~XJwQa zp6sq7=|McOBWv@vqlwQ;y0ZTIneN3P5HRsC#%K=t0$BD@_8VZ#@YMb7WdAC4niA|( zt83JrobSqZ@9UTkiQyF{)rqFpB_%A&o?cg#ICY>!`?!}j^eIq8|H6<%{@9D0bjJ@c zj&$i37p4q6$Bky(G331nc<_U)^%Nf0e-K~;gJQ#eFsPa0zM#k-16fjLiLnHl9?mCl z9>Z;1x+O*WE=x~VY+$8R6gOxFm|MjhP}SP8wjzoNj#aaI11qChVdP|-X}=-(2i)e! z5_>8p_~{zM4Swa)6oU6`n{b4QQ=df{K-6qgn{5b7-A0ULdBzO`Ah%8gM`+sYVwsw5 zAWGfl7|Ejd5EHZMMlx8@W|zoB48+(hPlIxm0S2P3qRLG=9yTa|sKdoIES9dWhBK_H zMMV`?v6x6t4J!)lip4rp!r^DqjVey2FW40jRl~~kH1HFnx@83ZV$-g4-EkS|Is;Hn zRg)rFXSy9TvgtF+Sz;ZkT%&hPtOCkoGkn{P=_n&HE6}KvvUJ89oCAQ7l67%Xx#OE( zEf=JF8jJ!Rs+@MFt_CQdxy`R+C?*6zR1K#RtVqnf&|aSo7)s9m?wQ-tOy3`F@HCpG*v^l>Od!G8h+ zXk_{p5CE(U{7{xozcHheqBaUTe5U}2yJwUcEWpUPb^(IESY!pAUie0spDPJR^AVbi zD1w0-E9s>~K?QwQ6^cdl4WPzpC!wVW_{gI5M`bpInXiiU2J`D{HT&ASP=X);J|LqNeAZzpheM;P>(Qg* z2A|~#WLr_yMov1=5`a~oy@9H_861JAjr{$dAmv!#RZ!_$$^ldKHw7K^wh0c%Pf|(; zNFaU&*m{O1(rpw}b_4%|6T&Fi?`z~QhVEtOLPZg$^GfU5KDs=9&lGD4D7HgP-bOD5 z91x2p6fKnXEPyH$BNRCZgLzC|{o5EJVAc#R0H|5>JjI3(6ST0+U<_FSK;~wmsDQ$m z3pf)P<#wQyQvk{4F@+t_VJhzw92AkjH7LUbRTG7ypzbnFrkK~FwIG1#Li7|~HRsYg z=$z?u|MJ2OTL)NB5gvl_Zl=#8#sOHblGjJdt0e@%>ZP0tM)(;~gp-~$si3Qgv7C%K zm7p>v`bY|k-q)dsW4RsLJ0a=lE*J*4Ulye}(Z z|4`ZVZ%wcniLe7ykR&P;Xa?3ye`rmfS;o8fNIphV@Yd>1J*zERk$4~57Gpga z<=6cB);VnYXJ`C7J-0We)Xha7T8y`ysj?3xx%%H^I3gFj%U+UniJ@KJCqCS5y>rni zlFjm)`(_I{MUkWvtD~$=xYzDuC9nF6h4|+M%XODn%|A6R!(={t4+r&aqtvTDTR6wt z(E0g6;iC!CUn5Q=F;lNCeU$BW|GOmSroE}z?jKvqe=MMt#x1$K^JVRVO9UB`AAH+?lzm%p z1{*OoyDC~2yvA{|wBY%m$HfoEr(eFDn~YrWN#O44%&c#(*VYUW8=}3SZR50+b&>qM zxcCR>eP4+5OETUHu=zUuse4@FjUC3L8u14ODJ0uU>gIE|zX`wiY2M#!by-+9-^KoO zeJ}QBQO_Ma+Ub;B>A9{pn|5Hj_BxTTyL(j`e$?g0&p8<2ox_Kd!;juM{mwD$hBLOe zpWo-*oe_@yVnOE*4^^(d)lrW|-?kAh+P0$SyGn*^ho|&;Rtx^% p7k4FIZ@TV#xbK&J-v%`HU5P#@S^9X{;VrAfeySU))r708{sTaExM%T7p^9ndf_EzHQ$3of#W9Y}f@)fC>4I3RdDtcslIgiiG%1X;f4SFXnB`9;I9I~b- zrOyo-my?z}N3M(>n_!iz#^ofOdL$jp?qnQ1dpf|4>)g67Yd zo3=>Kr!NkQ&CEjjXKl#}$p10a$V5G(8wK{$@Ms5jfg zCMe65Y!=5R8M|9{nFh1f@H+X0fT(NEuDtzh(?&i5>(uCyEx*a`2A+3pL=ew zJ;KpB)FYwl-`5+95B~h*a_z&Jrol5SE z-;;|EuE1x(hOgb1e_IE^OgtylbCY zHRnb2i_FR}+fJr>1^K76a(Sj2^0oKv2kc&&AKhjx@rw0f?kicf>yL)OnlGz^8~eG2 zQcp{r+coQU!8lQOvE6HY^eW1E5Br+j-A}tOu*9=pwSzXlrnKh2oXHq(EVX{` zcEdcJUE&>G>m1WvLjRr&R92fzrWfo4&eEMm1o@yqaN){Q6##71+Ch)r6M;odo>7B(Sh^KSdF7}Ad zC2b)MCt@-N;5Na;dwi+x(!SMKidoQuzF^tP0OM^X(ojRjpk3dr4bn=qX?!3ag9&6a z`HGAow_yN0!3G=wV<8;Ma2<9*1J;Ws@mTmtyBB#z+R~rNDDnXeMn$yZEA(W2vp$il zq7$j3UmH|qq;Z7eqE;Bj!?Z{>MV+OodNMAj;YzOYnsSUaLO=0X>#Ca7f%*;ngT7

~Kv18<{tYx#Fqpj22d0W|!J;axGqUq#0ju4-7Dk3onMvxkUB#{h-^Wq$Law|@T zTjT~s$)xQh1`32P|6H%s-{y2? z_zgDUY5W{1L_!tr!|j-cFGYb^B7T)S4#5+$lYUEIkaO@co)BZjFmXa;;#?R{@<|!k z(I2OaFmY7WVH%l7f1?Ewy@#=zn8%m$5HVJs*ll`@g|nrkBYN_y+6HZr?khsTm-b+N z*<17=grh|aF{vBq}uRHE|4vv3C@q1S-IW zz(q7lE@gZ=Cb}_ivVOk6sB0&$=iZvUr zfOK}x;4sv%U1YD&w0yNptx*O+O++NDtP^aEmRb@jykc?xh#&UBn$6MB?Z+%IF1{jzh&xewMElNAM{;Cb@Ja zEh4Ao+3&`AScG9P3;MuKoPb@i6~2v+Fb^JsfwUuCNqbTXn_(hkLjlZ%1{{jdM3tC= ze_{x%g6pscJfJH^i4s0Zyos&gZ@5Sn(oMAdpWP6KE5t&HxVu;igdUalOJp`wix>Pj zZ!J7A7p(Lxmd9RWA=E^CAqH2AY2u=oj5o0Z^acwY#HkpI^YNHO=R`OG=OG?;V7SaQ z0XJedh#)QKWLifCla=s`#6^in!fo(18A6xQN%RcaC)L5hyYpz?z@1_cY#|HiT56;n zNEdihYSS9whR<;`G(j1hg++i86#=M=R=5z$a0nDbAF_d5AU}~j(vo~6kytEOjF;s>G4Z4zHB$AZF3aG{5cv2*Z@#2m+j76}YMADvgCpiU6aiB=%akA#s_&S+J|EBxt zJ#ts}KTq7}ErdUwgIL;zxv|;wJ<=cIFkd3MS(M0H9MD}>w+-SkSS;lmc@L2&QJh4- zV1KbT>L_(u27`{*l-j0l8I!zL`qj!jRP^c36+(IVK>r?eQJwlY>C*&l3joqSuO5a^DRfLOl;fn$#^QEG!CUx+Z zRJ@xaTTBtXL{BkND%pGJC(%VncX^|PlJ})r4#knU8Vj)sBVj9?gY^>WQJ5r(`A%NV zFNj(UBtbO4X?WAt=1SWwJGURPZ?&Ja?{Q30?c!af$}P?N8y`RKjUL%FY+jdf>6iFU-b(BWZMZ8II+)C%5-x*G>roK}NdiRF$dR#`+p!ce|n z>#eEUSG>Dq9-;9p$?&#PqI{-g84~GAJf`?QN+xa9Gse_&oB3VU_Wg@wn2J z-NPsPZZ*o4=z6J+=SSc-!&LJR)&*{Zt-a*?KLFFT66az^f@81q4J}zT5sOk`++zwf zX@;{TR9sS{oZTGZjv!}ywO(%vomif7z<5r+WzMo}vI2cYF2BN0i&6|GGwE1%i*060 zs0TTXlSHFlqlIZ)&DYlGcX% literal 0 HcmV?d00001 diff --git a/static/js/dist/media/delete.mp3 b/static/js/dist/media/delete.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..442bd9c1f4c9cee39ca9cc776c7cd594c90f2795 GIT binary patch literal 3123 zcmeHJXH*m07M>&!dX=iEktT2fsh48B1PId6#Ly%{0to>Gg7l^YAtC|_JX+`=MMRMz z%|=4KfCcqIM5>~Qpi&e;ROW`Ku5}mx?vMBDy>G33W`Ad9&EEU$Z_XTRv@Q(b0CEUt zjnm;cq8u|14hsnK_YI^Vf`~!nV4SN3mNU!EF&!;!Z5$eF{&#xRLYqT*Id&|R9OOd` zG(Tc*&tbkC+rlwwSg;q_7~vBd8f1LnKtx1@W)LZa8WukCkYH%o-gs`WQe7$`+4l$5~2qp*kMsj@5D1;@IO7SNntOLC?!LRAvKcf9@ zv<~#9a;ON$-~b@t52$T}<95)t;p%n_ZwI&yoLEM7ruG)Pnns4fkO#lAk)SE^SeXF; zZ7UCz7B9tLH~v?yKN=(v=Ao(A3&8&P?V5oB77DOCAk1_{K7L_V>G{%k=1@Xx3l8dO zEQ;Xh5RJBl0zvil(`Yg2v9WKO`FktsM0UE{FSY4QEWT_XQxf{Lu#@iE>PKaz6z^1S#Kk6E| zG-kc6w!8meF>Y{bCCjCuXMue~ilz2C!X4IBS^mk%roZYV3EJ%*WEKJ4CXdY$UQ4Z)#EROyxblolH`S9mE z2QJKK*G*4-eWTyn(ffXymH0Jo*N+cx#lj%oWXLh=832^!1zpK5Gt?{Zu6~>g=Qj~g z;kv01&+284q4hmg6M7n=LU-_69`#Y6$IHWWue=~!%*zSP3s;u%z(unHZ6oA6>5wpA z0tUusc++ve)J0)^ot6*o<=*A4(6PhKg-GAljOBMKHQ4gC4?a(i7x@ucDN0>VX$46b zs_@PuxW{RY&!YHs-HH!6&(>VsY>jx?(Z1VQ#7!ci>cbIby!@Yaoay>{p&^lq}H#A~FK*Wpum_g(k9vo6T>j89*1Bax3k zbT?{hF?OPO2hY7UaB)<*`XH)mlCdl$c?$Zt#HhLHK)t*(Z)~hqV@I<0$hhCi6GisK zQqs=-E2aO0K*XV4AY z!)OJaCpY7M?urlK8Q0=@t2Y=qzcT^2a?j1DdZgooQGn>Jm3&*B3!-+(yl*41&FJb8 z%B8%lrQDQp^lfz);i~u6+0hrQ!-U4_E0AzUwT{P@C(xp^>g7$30wuI5Qm zHXns9?$9qO{c4Bl;se?U9=>zj5DZg2HdRcIS8=3SR_2nB?){D;FR_fg79G`}9cu4GN#xS_ z*Spjxg7uKy;zd=iJ1eai0tw$HESr@aaK;1VibBOdNH)79IuxFx*KgTjnc=sowdyWO zdL--2d_Pskq{g}N^Uu2^dq0TCWobt zdDo-+Bj7i)?x%kFm6xe+bkX}ZV63vAeH)8yy)9Sn`RKCQbD{H7^;pMaDv&aNv z+Z91w$7vqa(F7jXR5tS9Y%^%s3Iy|29127mmMeD7muocCUcW=X!}xolGP$F6HYPB4VL7_aI(MCd}qs6aUj^1?Gh@W3yLA@0ZwTW z)*=GR(#7yAd~pe<;oqly+u}=$xo>X5oPm`PV=M0;7|ng5ziXP)deG<5Gq{P zV8SlyRFD}Ba3lEn<>S3fCj@-K^~4@gX;D=``xW47B?H~p0+@o}Hz+)QUzwNroMxnk z)lGVO8nn%?1O%Cir7lCA5P6!OmOHWbu%2aEd}63QJr{mofy&9TTS;2wVmyFx{B`Eh m)Y*Qf`iFe0Ly8GZ08$|b00;okqjC1dfB267KmOlbfxiHkb?GSp literal 0 HcmV?d00001 diff --git a/static/js/dist/media/delete.ogg b/static/js/dist/media/delete.ogg new file mode 100644 index 0000000000000000000000000000000000000000..67f84ac19a05075a52de49829b3a2bc17af9e29c GIT binary patch literal 5731 zcmai12~<UMQkbya=Ux7sx%#2s1z zeSLnbQ<2iDyGCVU8(<01Y(^MI!h<=~eVuXuCMB-GTqP_2dL%0)9N*9zRD^ix|2aBlfNoisNpYyS00CJUftSg$j*} zi?K2>IdI^>mY5(;bbM40XG=6Y#AKN?VMIr>{H4M{AHwAL2XHvi>^No+iV__Z790kM zfT$o8n;98)5YUW6s9n*~ArVXzDJpOaOm5jKw4J>N3{nK@aV{uf(m)O!f)Eh2UmvZU z7feF)d1Xe23VBWvN@$u<$jcBS1G8|VKRXmY2$(DjB^klF6%(ZJK4J*ckjpM5hV8bj zMk!>vJte|#&20*ds%oiXMfIT#6jyu8K_Fx{PP%F8R7uA;p_`5b-H+PrPTlGf_Dal! z(&H=5I#DSuW^XFmDGe*C`i~auUBLX` z%_g)H1K9vy-ig(|6RYn?)xX0wR*-tQ69O@{p&AR>_+1?Q9nSZl?TT~g;Ow5$nCI8pWzRWwla;Vx0R=v8TrdhyWB3|g__)tbU$X#^wsv|fN%qPx!sOV11x zar#I~Mf_#zkZQ3)ea#>k)0!+%7HI{5d0~S^3N>S1V6FE+(Zq$T>VV4N6&to*r7g?* z3X7V3C4D!E&%la|2gR(ba6dqO3MzSb7cLq5Cwy!`+yX|CqO-?QiClSxx^9(j-iEkS z%6X-@PITplZ0=5SP0AjsmLWgxxYTkK1f?RRDE_mPLU|d*mARRiZlg=RWS>kB=mdk7WC=P5&pb z{>mH(Bu%O`CwYu4+?|q?-FEQh0RNdevFdkDYj>U2cW&0F3>x449q;-9e^1TP4Nq~` z@VloGKcvZYx9}SxFo)>O;RNPb8`Jl4qIcWZgjr6T@sap%GDngkdPMFEr(D^;GpE#u z``nVdk(8_NoxAB!K}beX&6#s=YRXssBXdGCs|z!$Ph?J>;2LEVgk=;7u9io1H%zzx z&-Pd5>|*PK1~SKyt^ZBt+`wtugKTOxrhHho(fS^6Xq@BPZvy~9H*%DmrRRtn6+28N z3{$amn)QFr7{DFIQ-<)svH1|B1wk7@kW&$v>>Rr&YcECIguYxEQNHXpGPN3Eu0&j| z7nfseXniG@*rD{{Db+~B!6hZzU@I53`c~Cm(kn|vaO}xKZV;4&>%`qgvinF~r4D^K z_*q^j(U6}vNJ3)^kmhKED%HRjB^86Du1X%#IrD6#YG6h^SOh76cU9Ryjt0y|9fBB2 z)RpKo9<>iWkwfjqz0#(ViPa_UeMCi_)NY*o*%SntukGH4zN4MmYx}AsWx&=5f>1YL z;I%Wt2RT9rL+ELYet#a`S>3={&9PsdIif}x$;aQt6WnO@9yR(fjs8%RLT@vms8J}h zG`gB2U4uSUK%uur_T!mjH2Pyr`fwZbq2>>s1@YtN6mRe;2Hg0Of<%9Dq+j7zQ51El zC=2>X8^JA(?nY;N)9Bs_Oz(NRr#R6WaNQ|m8gzOaeQYk0UXb`Kj_&8l9Gj2{NrcwIMo{9~Tq3r}E2 zr2m0)zVm6#k=uT$U+e|~1{a9^(b`wRvP)6x!IumO``L#^AUOn38&Buf}1uRE#kj=%^}aR}-Zs*;A2*X8Uc z3$=NB$l!yhe22 zCrc#|VK!MA)JKBzTOP$*5nOvWrOYJSmlZZ;;l1b>c zT(S$;6`6c7jp`GD6PHjU2w+!0R4zFJEAsJmX^ltttdj1kzSV;jUM~X54fsfB^2Jt7 zRupbx9XYICqP#|^>B|Mm-C2Yxakzxx8)+>r;*jgb_o>-{5g2)Wxai2Qe_GB6$BM*^ zdWmw(#r#~LeByym7Lhl|0HSiKSzv{4#MP>TaKI>{o@||Xz=b@i$y4K?#OHLktqYnO7%d59v=zf!dDLj zzD07B?J!z_eYQsE)IDSjIt@W48Sp{9y;2+0a}fhPFKw`)<#S}e5<>}>j*6q1VN_CG z$c8n^z@zo?01A9zuTOY=%czZFeVW+J*#JNxxc+vb&t?dE3pVstdX5-CISP;svI6KO zh9DTd#Mjz*a58GADq}+-=M%4nja@& z@Te;x2onP;q9(T>&hgWw;LKbB9g>`xWTHYDZzo!W;^k6-I$%-_TM771=pkY7eBPn} zG$IHI2mmXQk3G3w=*4Q#<%=10gb@JZ)`=n(88BFPuR_oxIR&UmX1$|@Arg+k2T6@c zLIF2s;nLL^nYhUkdquRc5Y#wTNJ;4dezKDKBMUIVrwA~JliHH5gv0&2F!`GTH;Df* zq6XAiDjwi(EkdqWT&~J@s!BftBfb{th0CAc)a-v(@BfYRWz_@7ecM4czpPY%mK4@| z?6O3!TV*V<5dp3;$c{p=V|ks_boA@WR1lsrdot0;0H6eo2JitH&GR9j;ZUg<1Ac+z z=(z7g#sb+227EC!9B8pp{TYsUQr?W2rfRjUlWim!Sm!HMu;Gx5rKjEyXf0hSmWfGm=sU zfPyan^XA)Pew_GLlnx z<7@qjZoLTnvs*HILOaP&k`e^Pj)qU8#hoZ&Nos*}Y7QI0*rGzsB<{M%bkY(chj}=@ zx;vHix`dJC=6W`ejO(c5d611xA0K4bwI=j}%PvY0GDYZ`C)>c(k)1$Msw^5RZMrdl z+bb*kQq^pw(#kujoWU>|2$9;UbozvslB${@xtw7IdF|cbsgR_Uo!xSB)oZgGa(<8E zQK=|d-4jBXdQMV`TGYYkt6i_$gj+fCm6z}4FlYk=<*r8Q=@k*V%BR-kAWo~~s^+Qj z0DK|nDJ*FXl%y|r;>3wyZbion8GVPK)XLj0WeuckNvEi|d{vQ^($c%T>_L@fw&dv~HI5XBh^yWBcWoiLfIa%=r^ zMtlX?5`SnuEBy^|;8NX((LLF5;R}{0pV{XH^G3$MpSXmCf?$oi&fH|KP}pW8`{Qc4 zKhBaKmG_R8-8A>WTp~XuGZ{3k?x|h{;qU%1NJ-1zb^S^!EqiW@j7{480+_18@$Z+8 zJ$@X$-6}sUoP7CRXTlE)Ew9%oRX1G9d;gqgc(-tNH&+P?(rTO=jXr*6h0AvZUf;KU z3GTzs-{trJ`*42RcW(T;&!s;`E*;b^{@!OpxU%Nj^9nnlW`g!^Erlvsn?>?_YU(Ga zT|HR%eXpPQGE-3k#5ziLcS*(7kHe2p2R;X1IC{?F{IjLGCHE@jMw2r)m&ShowDfA` z!g@O!?P-mhad);|_<`^IT~5jwn|CiZ973eyVII|iinxMJr~Yvi z3iI1ku@<7uG;Fm&466?IxD>)hnr4b?-(Q&Br*lrL=l2cAYhq`Zf;WE@-*ic6fFfWA z;Hpq|$|r2Hi*eSLi6IxyH=Gu=^Hx9k&YHxTKHl{2ExAzXug8V6mMV7_KOd71l54b0 z+N`x3ckiTJH&J7K-<*lxSYKP@sdu*8F^yh#aDCdHp@_sxh;kjz55v2zh(^AKr5U$cjWPrn9VL<_N63e zLT`BwArth|^Zmou^xorHnjF<#o_kN@Kh2H77Zjcygp9xZaAT$`h){=jl)te`bCGQx z>sIrU9Qx(M==|)b7T(~ovys;jN)>W(F#l&RR=Fwa$vNU%dMeP0p6s@vu7CoUZUaK~ z%~+WaBUgHIw>>QQf_Y>gc5DUhOT#Yf&Z5oP&8N}kHhO~bd5v{?N)Z9h1Bf~GSGQ-lb|*aYS|sWn=WgpR+|J*m zLA;Bw5k$>x8|RwBA>Qg9*)=A0E6Znw?b<&lCodU~CH^w{pzFD-!Gn>hsN0dT@`vaP zC(YHCtZQaBQ9?Xe-@$InIinOsvJRDv+q*TE)?b?YZI8vX>fHui$JlEhZs~Yvv5>Ma z$Ho4|wZrh*=zg8=s8HNYgX7yhL8Qh+JDHvA7eS`tX4180(lPl%OKaZ8`!41jM7!)z zs)e#vH?FW>Rh8iIc;D)7!FB5<;!j21#ls=^GEew#6``wK_s4opB6}aUB|26q?LU0P z_q8k(r_m^r5M+K;4d1}JXQNPCz_7-0F)n7KUX*#thF=Jrvx0SY`ARwp@wW%J9x!{G z_@JCD2OWhs+Rm6Bc5^BVRy(fsc1Ll~k&Lj@tZf!PqJ0a!T0bkJJpB->6@Pm7qw-!A z|C5BAG)46DlMq$N+SlXe#G5}Hyxt{uUz+CwLJ=arw{@GUiq;MoPsRVVd@jnKJDb6N zJNC{!%Itixz-0Fyi%tJj#)YfU`$$#-1uyocuBTLo{Bg0$<5d3%wyK}{qo_r!>P*?%2`8@z*%I5vsfd(Ix~S`4B4u7p z_2+r)Y&=Zxk4wLa+d;UzP(6R#z3%8E)djT*1LZEK^FyCTC-D$Zr_pAcv2KdVmo}R> z!zTOMCJ62cUoH<#e{}c=uZg++gvy;U9-ZjOhqDd|?VosUhwxgBhUc6xTyGYZg(9C~ z-d`-562E+s{(8vL>Bu9iGMi(6eBb0bfTbPdTz?C{?f7P!ucGnl9+{uMI6WTV{rou; vR`?Wo(2Qg0ZT{g!$8~yn$d@jH=kr;w_lFKSxWQO2W1GLb6Jt_4yA%39fAVYV literal 0 HcmV?d00001 diff --git a/static/js/dist/media/delete.wav b/static/js/dist/media/delete.wav new file mode 100644 index 0000000000000000000000000000000000000000..18debcf96d6f76e36f295feb6de2f09dffaec1f5 GIT binary patch literal 9164 zcmXAu2Yip$_s7qDzDa}-Dr%Jc>{XkXr6@AY+M`sB5G#loTWQP)MXjn$P^v{yVr#9^ z+N<`agpf$`eeU_c_5bRtvcAuK?mg#oKA+Dyw@pN7=+WXL9UFFN(r3`{BDqAw@L%H} zMW%N$;z%xO9?`a4BEOGl8QLnMWy2QlKhr2?#GoMq`$hLHGNi|l$QX%e*ruI7zi&G{ za!6EX zIe74Z?*FaCzkMTzb?-53*x;Dqk-dww7~H#GpMHGPBf58yn8-o>M)Q5o*dk$r2lpKq zStKI5S4DQ#s7+%(-d448l`0~=dkpW9Tuh{>Jk==s!uFI);v+-#qW&OvYgSyeKvfpSiNzigSQ0M7e{Yr*QV;L-YOb2tp95aXHv^Lgknr@%!TS*lw z*QBk~kf}0K{wJSGQPbP`)A4ckn_f;a&l}G`pPQZ!JTuJ;ov7BXaED|jW{mcJ@~P**n7iD4&>l^4i4v4E2rl+2d*CRFKE&wH@8Z-binV_pG<4+t8NL4jQ9DQpp54 zo6Iz+Wwtw)ozNTz2U%T3Qn1dkHtS zq?s*YE9*^ZWq#H{BdMr~uGkYc!8WuN?R`5{HW`o8*IDH>acYo@w7d(Tdn7ADmkH_OaX zGt%sl-V$W0nY8Yr9bfWARQ!Qq@nrFERaK5T4(96GTd}AyCj+%?6kk= z6Md$;^m83AwVjd1N2}Q{^tfD?cbceob*}hJG3}>6Ykx8)a+UXfVID}PmN2!PeUgnc z6_9Z02)=JvuidGiXq5Jpn>tvtkc}{1poOKB+yEJQrJMP{SeU0Uft3kR|m-$TU z6T_ieU2;oR>7?E4HG4pxNupfUe7x(n{I2nuF1<`ka~7QKkqIC#FFPA;3YqJ=&34jo zlW0z`pCOt_L`txuS$f8PrDvo#NZux;rMW)U?J`cfa;ioWDq%882ieV3X*E+@M91)s zmHM{~6xYV+J&88|>O?zC|BwZ;fxo?w2y;YcOI~RpIb}2TAEG<;kk*zeri}cif9ra( z^&7FQDAOf7Yd*J++$y$<+$CdKar(`=G0WazepI47Mz&jO#e zeg)pSPs1}x_(f>e)C(yGeRg~h?OQqRSw^(~S6N%AefLS`K2I;tK0V|4!E8?}oH|pp zd1~98Qp0zK^FQL6!&6u;xy^K-xo>8g+S=AT-u+E-m<;>MK9GabTKC!#`i{6pNqf`P z6ftq2X_F>M4>Q%glBJph45hdS>?~cZr|cR%4wto&6=tDnAiH(Bd?!_;EN7es&&`#7 zri$4BgKX05ve=Y0t#q;twta1V-jH2x>r3;k$8l!rY5OaYnr|cB!aB}uGds1s_F

  • byd!2eCa;2SN@P6|j{ouc39DL8n)mgA(AWS*wl45GVAr)vfIR$9pc?M5}O&^(~N zfh;A;or!ZS{MQ7wZKH=|s);w{q_+N}&1D5RD0h}U-As$X)#MC~r;skk$>Br#f6exRbd+r@BI7dUahejtyfj@e=6NM-SuH!@2GX$8He4YZRTWVeFF zSlJ|H%r%LXHs&vK5p23^FHN(TZA<i-D;w@mL2>c)157QM<~Q@C?1L8Ob@lE*3w6MPC~%mcN!)q*~uK)E#u{H z>Zcb^{YeD`$T=OWS*e*F)Yo;Md2MU!J@P)AoGj&;cI;^@NZAiA9_TdPt|RaZvFOJW zbl|w2QGY&>$lv|&MPubSPO7DFR{ans^2n|M^_B`Mp`oC$l-6a(=QO{345~)3&M)$p zgvdQT0#;J&c+Dz@rJ(r-U0AD2bq^eSjoqhlo_#t~e9UcjwTRDzkuQ-`c(>f>Y-4$( z)pU(smSN_hG?PUA*DkT4HpJG|1F-Wt&Cqr1`&ShFA$56F%dx^jy=7n8u~b|;YGprJ zZOI9mngPT!D{g4H#!&|$=stJ?{T|68KVgGgOB*rfCVOnIcWo$poTtOll5U(n8C(Q{ z+a6%*y-Ft8idqw0ze!I1C40rGfR!*#R;h^+9OT^RsqW=+5ijM3?rj9ajqm~w;g#H= zZ7)vp0_a<)|C5vYJr!RJp4@Jm5Sw0lAI0lMh0cThuBjt&8cY>mKoe6mCo%aQwI7DB z8Ni#KQXvyzvLqX;pGhP>_H+3PO!Q{Oi=1I7?Eg2s+d>|qABV~Ra4=dOHoOE<)^omv zI)a=;aLUnAjrPThTm6Kf5_|B3z$hmGe`0|hv5 z3^h{sKXy3CnI@3kDY_QS^p^^-W<2?iB3cWnivY=Be`R<_brALv2IvPDU4WzS^0}Qv zdlI@4MEsZ0sf;0G6^Z?3*z_A%c9mAql3G?<;n?P&bT3h?nQ-MaIJ&sZB@&4`AAi^Z zHtSAQ{vq#??7k_r9}CN`CwBKZOPD^ihrwQ^twU`jNFzB*2AkmER>3usi1i4W$f{4# zv-#{~2`uK-H^lERd&(Bm_nG=vM~k2NgF2`qgQ$$o)LC&!lP}~`IA$$)JB~^ngnRJRzo`34TD zLpGYDJrh8Db25?0ySGr!xlo=}ct5zWN0@y{8Ls%u{*lDSMu$ z=j>g&gz0Lv8YqjR=Iij}E8>8P$cN-FT&_?zd-ONiPfgt;DnWRga8%}JG_NW=Fw>h~ z%K3%*TrdeXTUz7vl1^KnzD|t!)9g26G|t^*Q&n`jx4$=+Gu`*O`P%+qbD_A~^s>{z zGtkVEv-UeT%%+3fCmKed*2tE1*Vu<>#}Y6!7%nR%bETY_fO5ArkM&zB<~e#C0|VrN zb6??CLS&7UGP&eOs;IDBu!*)c`ASDyHpzXMHcGz(vE5*!^YjNt@MJ&J8*Zi2qv^4C z@U@xDu$$aW>*1VBLBTNdt;u5?F<^Bu?rW%IGjo{-r0P`8ZE*r!aDg{KhFIc>)KnT5HlQ*B8d z{N9&?ybodh12Ezqay$?&86bsCLGxa#eTn=?J!*qF$sF|Mt}P;taV6MnHKXWF`_XZJ z3a(30y@$xdVcbYwyi881iWc7E`IWHQGrGwHobMGPw*b%jf{JNJ?G}KYtC5TQptm;f zjis)8;9uX^C~7#C3V225_B-|V3D^&(hMyAW#pLA#vGJAiOgoanP$0RBLziY!eYNRJ zr=f1OiDgMN{x9mbJzgl9xUYvh>dPZoVvl_ULN3@boa|p}X%3n+*tWPyM!UP< zmv-ZN66p8W!1*ECl`6lCcfKff&G)cYR`lVj&R~-D2aI>!Ueo+$qy&(q1S+;L9dSE+ z%tjoxrKY=rfl_#g>+~FZ;n63W#@ZeMf!FZiMg>*1G1@a`!P zUlZSRgSo~IdfPyFpoYrq1$@ghs*Yj`TB`~&)YVB!6! zXDvBm^P!4mrLhLs(Y6X6WjMXi2BstH!Xz8^%uLymdDREq}m4Kjm|T->W4mb7Cz~u z@>C33-V4o5(rnAE}3+U|DX$w7Khr)&5v$G_on7Jib zgYa5;%_q#-8p2VN>3oezCpZ16y~BK_s+_j(+!=NvRa?Z~VD_{K^gXxDsMOA8x)bf` z;*@4qx6S;|Ow`@3x&g3wJ3Z@8f)`ez%ke1fNNocLOr|CxaL%J70F~I!wDbu~JHY05 zqueRXj*GH#d3djr*T24-gZr4T^rUCcLX8LG^aJ2%MN10dUPjAH z+f7@UerBr9v@O^{s13JmI7jJ6jL+>B@k#A;J$8WNG z+B@I&V>YnYFh?-zoSE@duA{J{KeZb=_~W&^Z6{9XZnvjS$z z1a&vy;M%zAn!47V;+Dn3Ez&|%@PM1pU~4_$MoltRFmkjGA@K zIP`L;*@iP~Nv~9z&xYXEpV{h~kKWzaUb16!G~Rl?4WXwUKv#Ye9bjsw88*9}2BU*POpNJ~$FjxB?t@)y8(CZ6Oy;7RQ&l(L%T();;8AWj^yOs{ahO zZ*M=dLr|Jv(;Dn`r2Ah(C${CiZ$`hTagH&X(-yKR_8tBqQn#YdAxv_7wlzbY?oL4yrq?;gY5NymegpR>b2)8My=dp-FnZx+ zWAGw7@GA#k{&ecSIXZQS9_W$`Wy)X36X!fM<(aRinNym@7I7PU_j+4{fM8|`+27AN z#Mk(nV|vFust4jo7?T^ek3cMIZhvmw^eZgO`U(t zBOKEh9QjckxkrxKNp>fluOGjgq}7?0ZY1wv`Z@O;8$il_CL)JXkz35@SL4t9sie>7 z4uXuYv|#2Qhl^V0F82Oli{p}}+8#DVMw(O!z#lYo=6Q}fFPT9WWG1l-%qHpg(i|m9 z(98B~cZfULR*{iTYy4QK47KZ+-G+I5oL1asv~w&Kjly^DM*D{9WYf@DWu7>P%v_Y~FB$5b)l+VL`PM9v)wZX5+RbzmnY3JU^Vl?2 zsb_wbFPW+yq`&G6zll@abhp{v^)?I)uSPfG$>n<7%3S)mA@KHG3394>R&sMOgjd=K(Y;nLce0bC;9y zAr5OCRh2~d(_Z4W3s`>%oBU1pKZEJ^D{V`>(m~@bdW=JE6L!DRv^UeuR!_9&oE)Yy z#-XN1xLX>8#}1VXrk_*P$!Ct@FDs&*SLKXd?md@r(3`AXL1Ra)Z6DbEFve?rB0FK| ztf>DdPB}B0-ZCCcZKu;+&TO!j1UdzsmSz-n*2Vlzzxy@n6pjaS;f55AK%JMEf2lm! z7pMF{o|{c(f@X&y9>FjfoHD^Kb>mR6_xxWsP72yS>9 zp{l==$#Gi3cE%?k!#k(RBPYyxNSC+=Y}F&n=}h?M;@I;TW0LI?ZyYy+HQ=$~@J5dR zX8r}xl(9_g{)b|{;r1|)c&%qjc7jM`Fkk!*=UJ0USbkV*6P^Asy5pKQ*?Yx)VdA9= z{@dTFZ+h9S?rrWAv*8q1aI3oDGtB?0|FkSu{GxqhOtAghdo#U%+P=4*)Ub?J>f_nzyVtL--(8=9o@tK1 zr>@!Tje7Uf+mv@p^i!XY{eJS?*DKy5nT2gpIcVlPYvrVka9g^oaRIlTvi|4%Lyeo- z=j|KsN$0X>0v>3ytjBwF@Z5CTn?8EbUFS}*nQ-V`Rr>|J58B1nEvts)6kL3(4w?16YQE=pF8XzCTQWN zy(6A#p2Pt< zLwY%_q2vu5?z8g2#wU@v8{}`0`tu($D(z z_O!`d=l#&*>mTUzJabp(0R0vgy_UO)8E@m zQ_Mb1wBx<+xIGJUm)dbA$tmG<#3_|9xjkb|2dU}IaF)qo@0yHl?tYlFpDp8ty8U&P z>Fg8eyUBA_1HE;;HZwUrN5&vG5%*g~AG(FCzkFeGJHtH#oEqfErAN<7$HCnoY`fLx zwBH2ZV4p%hA2^Y2hm0i|MVPyEC z{mNwF7PcoH?Kr%aKet9-FvnbDb90kh-i*Z~*5&?W1-DFlZ6Q|a%XHG^etQ@`Yyth- zCH;#Ia-;oOe_`7HObR%?ogTP@OS+JIpJ*z-4Nui}DsqnyV=mBp1j%b|4N6E!4YYgQ zDcsvk<}S4zJR6Kog^Rz9&m5Y0*3I$X)U<|t!@d1BywU^i49l4?(?*Ws-8<`MTbQ~T zi(0%gskp;oOkzebkqTt(W9&JPd1-Q)bhti=X~uFpL3i7ywlV!yb?M9$rLfsezq!;t zgzHR1&Xi(+2WfY1I) R6c)kuZMgU8%=~+f{2#xTwtoNs literal 0 HcmV?d00001 diff --git a/static/js/dist/media/disconnect.mp3 b/static/js/dist/media/disconnect.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8cfaff6c06253a8b9bbe50dc0d5d05c4a25b6fb5 GIT binary patch literal 1586 zcmeZtF=l1}0w$Lb&k!RZLl%ew@(T(w^U@W3GE)@t(|}Y#QesZ7LU2iDa&}0hYY5S_413-^&w3C0*Djhb23xn^V5J7*a`8)ASWpJ=BH$)Wu~SmB<7_k z6s6{7Rsh*al?v|p`RO^S3Z8k%dPufLL`2Zb*8jgJ9D#TfiS*1%%Lj7#ftZPbf#nH9 z1F7IY$pC1VrH`YptFfM?MG@m!m}^8DR9FR^7#JEr?kM%Ux(OyRQfNp73G>`{+H$;s zxkPL2cI_uj3JklBc57@rmotr*p}~Z$azZxO{Z_Yd)K#$9}OR$+G?)epB%pW=1n=9LA9novfgAxAg&B5r3P5q7BqM|4 zJq4D7AL>8#cC<1JHasZM5n^`|XH`Cur-!_&v-`oU`xo3Bym%oMJl(@(rk zz5iKR$jfjc^J0afDaZf+KUaCe<-_}O-YGLgP8~^pYOepj{wS>@uLhL2WnW(a5)@E z;qYN#V4nZ`IVdr%T=9Upo1sI1`QigNhF35D#NOXq7r)0EB=yf3vo1*}J(-=+!+T*82Y~&8rv|a9m(8N=ka|z1Y&Q=V_j-ypvF)=>Ol7 zj&L(y^XzB(bG(6rfx!fnR0DrytVsHHc}i8-zc?)r;_ghVv{s;m3N-HP@+J()|YZPUw6 zn|9ZhUuJ*Q)NgIkxc0T_d*!`?(45zdVWj|ks@h9nmi z%S)9qm8`fNbA{=F@Q4NCr1+^mv3csb-{sYrRKuq0QWCzs`-*~Pi2QdT5?9s1IJ z==PG5{6ZNjD9%~u;^tHui`$awf>2-w+$7XmHPt9V5E_EK7KC{p$rE5EU3#yVk8dU8&-?e~lrL#vY_9vP49 zh1BJcBxd-IZ;wU8hI;^Wj z39OuIp-2^|iEKYi7o4GAKEu3nEhzcR&=lXuYa8N4Vxa_zI&)WrY_>u@TTz+TQj>AM zGVOd##?6|{r#0D(+Gq7|m3N+!)uB4-g0!vSH_u@mfiHJ_!tYqBsqI;UUOSub@|cd~naH!J^Ckp_lu;98(Y%m_n8|xxVY4YF=8i>|fWIJ!2ds25dQ6#vCmR ziYJ0bm7yLE3y&e-(-X#mgxPCe*dxNA*+s zCs+91`Uh>@^yAk*s23j(9_ns6?(ksYWWXHw5*t5eZ96ulS4|4M^d@I-pU-g*OZPO4 z1uPi6Z2{RZPd=^p=)ScZ)}~GA=T8pNp;xav9y~B4cJg}$i|*eVCO_ccgBA539ajud zGokmtxrWcLP|2~M!zTv(mVJ|9Yu%4lYTc!DRu}8Y>hia|kF;^eFyrb&+HH7u^-dxn z*i^pXp*e~m8kz&e&l?AnohUXo9pH?IygLzbIh1UAMkb>c`$lM6ytshk&`3b>p@I2# zRK5HJg=xT^zSg88aLnY4C~zv8+ZgK};0Ti17Uej00;1wY$NhKE)fKC*y-=_I4>QGw z4fR??m}o<^L@e1=QIz(!`u4e+%$w>vvz2#d4`r>a{W-9Hj2r}lM&pP{owR{FYN*~3 zM|C>*dE}JQM-MYE9S%zD4-!s?Uip%j{DgPSH$H_Y6!~Rd^HX26tGi>h6s$Ym4GDHIT+PQ=#*PkM%EkygtX6+h5Q&3vdul63z2hy z%iIFd)E_E*;?yzv8W^-Ze&ve}K#&WKUWtx#B!vi@AtGmpFo`(&mm>zKGd$sS9vJp0 zf&?JQ8gR0Pc0kz}R~)^Y!krItYv;SSf5_0Bpl$HtFApqlj17)H-^3sBdUBTt@!OhI zeTcnDi!Q&|^{U{(W(pj8u1E@kRB^|+A2O7af=g{%C%M#C-55XEbYxn9g*7uaVC*iR zoH;}1wBV9a$4ETTYV^sex4@n60_@P31iX$$5504b*JAEc=}L zPKaDDFX%XF)`ytQ-R8j}bFU?%yg?(G@xKYgmVa1p4zC(Zq#W^?GN{+@5m zp^Jkj&BK=Q{=VbArxpjlST+*6I9zJ(?LF21DM=l+EZWKzhr{3K!Y+56dOX}cJY2ju zTsARS#OyRb{xj$D#lG?WFBXT_pH;I`Bdi%;(lx^Vg50knR$C75L){!%PMomo>H$WZrjSfjhg#L-Fe!JI{Fr1 z!-d3#?|4i*YweP%%`S*LYk@AJaja-Ljd+Y2#awrmY6os*>UQDI> z_#R9*O?b4McH)Y5ot;pe>AE5P3^n@W@-W?WdO^4CMtZ}F99qPJF?UixHJv31z-pn* z=pBcfjPyi2EOi2a+&LYa&~5Y)3AzV>mC5Lzh;s+&8O2;X6IK{~G6a~7E-DJM>DSm$ zV0DQU?vU}IMF*^oRX5?dS`_kf}S`yF#nONF!Gxl={=;3MEFCf-WvKk6;7S1rASN_Rn|rxA!OLb))A8eIZZji z=TPG&_`%)Eq&N(dOvF;y1Cx9Vv)cI-w#h${6J||SU>Il-26=}gY~6+RRu|9ZX;fq@ zM6nHpbH_cv#HgNP80k5*KobM}Vxs4OZ5b->I8H#$WNZkg*@<(o8X7KOn;Aok4R(#6!I(| zwxmPu{V8ndQ^z^NMjAbk7)B?^<>%9+6a0rv9-NF!jW@?;sP>Md_`x>dUp2vph870| z$oJZ-p)u*ENdkdCLSYOum6HS=;fWv|NU|w?DY>fshuh%HT!QQ)&rF=}(XQKu*-%{* z0pdWVZlxF4&YDURbm^a>0FA=P3L3!5mc9kISa&OWSth%*Cvp}*JTR|U;6PAZ8A6bc z-8_)KrLV+q3}#R{yj+J8RVbLTfm=(L9^ft*woou@3*4E&<@k;9U&DhJ!LP;HI-jL{xw7`ztS7~aohei#!r+o{~4`BmJFbv=W z5v@zdkEsZP!!|XON5_qHJPdeyuuXQN0Hj1wOlNP9qHe|}U?zL|!7vCp96qHDk+lR& zvEG#SaE;Rh#3v)C2LdQv0b5suVFPw)!vNSHP6)g7V5B{L8FII{6sbz+E2}+feD~tD zyAEHoAlZ&{Sev{U5a5e85-qH)IG~Ee2ulNQaE@sje;lJlEjXbCfLd_Q)9s9NK#S52 zW7sMHS%{;@h91?Kz&XIE@qtuM2b`T_IvuB~7|+1#y7C{fsOj zz{;4>aZPj)p?GMJHl!rC=HT3s9$hLPa(Mr=vS*-T0`9^n1qr9IHoO_*LT8MDAdM@A zwDnz>;=bzYdfz9))5~*Iqneg4MQEBaufuh_y?lJlZ+1wdklnAoHs(>~b?DI9gUcR9 zTyV?$SdD5>S5}?Xh2B_I?OXi%C(D!1e?X0jH+eg+?k>n`1Zi511_tW+TJN`BYNQ=r z(d2W)R|oJ#kh?BbFCkSyZgq8adD_mAxuro{b2Y{f@4K=cWU`@9oL3cBN8fR^ckOfD z^bzuEPm1|>w_|Q@ksEjs-21DtM9a4bw(lQ$T^5vpsgAwh$FP0t|NZ&Yx3dg=Q~&Yn zAJV=b)&A*9)ZZKS*yVrF=6&{$>m@zWSvjBG{`^Ul@w@NlT+MCQ{&bV^hr2tr{ZT$- zSggN2;y3yIn$b~* zgNLCjQ~p{Ichf39wd%K1kN#Tqj|ZNc_CGQ$_ga3M+4TDSjg^T-Pu*T?{o>qrZ{M0< jxIK41^keCb2kVdh=ifJXu}>c?xOZB5^2z7YcaZ-Bex2=H literal 0 HcmV?d00001 diff --git a/static/js/dist/media/disconnect.wav b/static/js/dist/media/disconnect.wav new file mode 100644 index 0000000000000000000000000000000000000000..af5c25447cad1a7ebd705e0f28ffbc4ebec01f49 GIT binary patch literal 1492 zcmcgse@v8R9Djbiciaz^Ls1l@Ugwr2@*^}OGz~%I%0mZ-QkeuC2WQ9K0Y~UYx-47F z)a7)e;WE=P*TBL;@<+^7&eSBAzbaP~Jp?=m9rug(eV^y)IZjqvTYvVv`@Y}L_vh#P zJbT`^z?hr+qY8laS?g9>tKFgj008-u(+0r%#SkE10G3jBX{^8l;|l`D!a0onTPVYT zjz`0Yj0@sb5eq%430ME^iCE#-BZ5a!g$cYvq&iah&z=$Xi8(0Go0ux%n|SX7C&5lI z1!S^vdX^j{_sLm0#1i2gv|}`Hbic39e>I>4+5-Cmoq=NAm z757*5CG~X=Y#yd*dUkOB!04bbG7y*ptMvU-d*g)o z!*Q2mzS1Uuxxu#{T=!<*Upp*}PL;ag*HIUB8G1$YxZt2Kj_vVx_!yUOFg$qe#jha@$x#a7rNLuL`C~edGzGQDJ zRU_KN(#R1xLssM#vWV>l80F&%Ay;)rwO>^ul%Ym;TuGPC1qb|zeybk^)zT&6ga?G} z>K=86Y5~5=?kESO7sfV>d8I<~1^7;|YT9($^qIP)QOogcW|eP;wgiiUheJv7Myfz2 zJXE(tiBV(18JJAZNlQb?!SrBaXpS_j#DjTwi>h6HQr)HM#t!%{GtdTdo}8k+Y(6YU zX554K;?2kaJK3xBfif(o$g=mx9@%UCg$$znP}Z?ij~6^7tvkbrhpLYI>LN{doRHqqlu1AVXr?L-a~hdzSS z;Z}aT%h)j*P0x{5a)s2;Z4AR^^d(mC+c*Q|gH&o)n&ci?Anmjn%tLwjV?2ts!y(p5 zLqtn2(W@*LO0X66pbtfY)IQ>;>Iy84W0v%08u@{7HWWJJIJ@E1bYyKDmz_ zrFY3`VxX7lT}Hqle2=pip__04KZ|~5;S9O-8tEoU)K9->UEmm8Z7ejO;vcRtKX;8W zKg;wO$7`J~m(5WruC`f3rdropdown-arrow \ No newline at end of file diff --git a/static/js/dist/media/handclosed.cur b/static/js/dist/media/handclosed.cur new file mode 100644 index 0000000000000000000000000000000000000000..4851755a1690d6631be7c32dcc7e001e6372aafb GIT binary patch literal 326 zcmb`>ArgZy5QX7CK}5#YAc(B&4cephDBOgraFhrH5{cWsZDtreZ06gynH32{0;NO} z9j^cn;3-8u5_G)Ae{U_GW-~k8u8*mL%Q9^6c6*bRZdjrJa+LmXTW#6QRhg67=(=WB LR`K-RGPP%aOVoiS literal 0 HcmV?d00001 diff --git a/static/js/dist/media/handdelete.cur b/static/js/dist/media/handdelete.cur new file mode 100644 index 0000000000000000000000000000000000000000..170320fc281ab02ded109f0310aa180b77e465f0 GIT binary patch literal 766 zcmeHFF%AMD5F9v?Yp*cIl58w|z?Bw6?qT>6zj9Bx!ot!YtV7NVgxDBcCk(s8u)7HX zurTm`K#vX&3+w@$NKXdRz;P$&Z5XzMF{K1mWu^!r$3MP#feGL$h{26T0d9<;Xe$zH zyVWAc`hK=AyHX$`lT`DlMSN-BYBYYUZ7#3struI#()e@6fAbs8EI*J})n~VIF{(3v TWO5|WGG}sm$GKO%-`24&Q~QG0 literal 0 HcmV?d00001 diff --git a/static/js/dist/media/handopen.cur b/static/js/dist/media/handopen.cur new file mode 100644 index 0000000000000000000000000000000000000000..da44588b2fa68ee115deb843e1ce6802e58b3e30 GIT binary patch literal 198 zcmaLQu?>Sj429wUKPx#1ZP1_K>z@;j|==^1poj532;bRa{vGxhX4Q_hXIe}@nrx202p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-17k@~NpgWidAYDCB{xzCg$v62`}%y(^E=vS&YW}R zIA_L8olku(cINkc=DV|JXP$Y^G}Nh61N!>ipY&rB1d5HUQ4bI2$I282@AHyK}XVm^?T%-*F?qH)ui3Sa`u+&-jj0bVL zwS>a{9u)_eXS=n3rrYGvYrCUE(?!=C$~~N7r6r**{=hU$!eUp0yVzo-WuZ2a!0TLJ z0iUql$|6C1B7u*(z5;rzBr@u8tsXTG{K)kcu-Hl>Lr)@s-@87KpE%k|B12ESfhpGY zG3;Xh#!4!JzSsi~$FRVUt)wF8i#@RJaGEUzd1)mTL0=-D;U})oL-+S+_w|0zlStr` zuFper(`8l?8F~^4yx#Q{p!sm*rv^cNB7rAkezxBq-L6+#StO{BKd_+bit8;vSCCa0 zY5GT9Vu3rc*z{6o|2R&>lEK-ZSYTb=cIDcOqqBV;b;c*)Kx_XC+mZ<^Xw>uEh1?M3 z(Pi%y>IrxU>dAU7-oha91Qs;wR(&KlOzns-a2^KHg2vO_aMcrkV8KAcup6&q*zG$i z$pr2XgO0I1COn2=!MOfm$0Ig(ombIs%8m!4J6% z9;ps|z-91Ab>Mw2gGZ_Z?{yhGQXP1Y%ixjfz`I=rk5mWV=`whvI`DRv!6Vgyx48@+ zsSdowW$;LKV9hmx)X#9u;NY423}@~tk-6(|=I(Tvn@ePFwwAg1aOR#kGWSdu`sKLo z*8VwelZU<B?g=~xQY`6?zK#qG8~eHcB(eheOiAAE zE)4(M`_JqL@;D1TB8wRqxP?KOkzv*x37{Z*iKnkC`y)ekTZU8^Ck)Z(J+#Hpl_C8`@E!djcq-Ly@x zBTzylkXvz~n63)P!qy8)8Rakc|JeFrpULw(GmRfFOaJ>g@m}$>%6o-+icyuvlA~g# z-8f+KK4L!G`48+3hav)4p7 zzhyRSJ2=bg?S!2ha%)7txbUp$$h`W}H23r#(QStdzbxEfJ7dT8@RqkLEi4oc2y@w8&^UpAiJqTb`*wXihmckC(N^~E_!2Ny5bExE#6ALuRd zy)(Du_(8FG)eqW3W)~e^y#L7IcQ=lf^Y5Ly=2L%Cq3Y=y=WjMq@3mx?nq_!+$Msi{ z_qVCPzL>Gs^~U+0L-RJ--s&>VTfKC@$v?X(HxCQ4NiLkf_T=)i&OWx7p;d1f*Kx8c~vxSdwa$T$Bo=7>o=IEp!bmb&ZTe3@xpU%&bf-v<(cb3=AX= gELw!3AvZrIGp!Q0hRnHAazG6Xp00i_>zopr0ACYJfB*mh literal 0 HcmV?d00001 diff --git a/static/js/dist/media/quote1.png b/static/js/dist/media/quote1.png new file mode 100644 index 0000000000000000000000000000000000000000..826583e0ad72dd1424a2ffe9e21a8b653b596058 GIT binary patch literal 738 zcmV<80v-K{P)hppyUq0&_`3K~zY` zwU*CIR8bVizi%)dr%W2FnSNk}mX$CPQd80l=@=9tO1LP9gf>Aze?W_ZAd3nT+6Pk9 zB8q4gJZRIxeo$192pP3d(M`3B=|$fbGxNOndG9^1MQ3#neBSq+d(J)QUf@5Or#j4F zE9wy-zzpWS-|kPDMh6-ZAix6Vys`~za&kJm|imv7ub-TtLCa_4e4I5=UIc=oR zMZp~HHelG>w3R-sf=NDc2!CO_CY#_mUAB7>EzoVZHQ_FSe#`~{NC3zSC#Rbm6>q&j z@5Sbta9Kce=vKUpKxc5ECM?@Y)`jaPksjiTxWXwc3)c%Gy#>t`;U6*3bhw@s=`#LQ zgx|zK7hC@;CdDkb013dG#HfHafZ=eN#h56ZuI2a!d?)%Hf#Ti4gV;lk^&D{=`uAKH z>As_!bMQrNY%+xcO4tP87l0Fr(gz&zW+I^^kw+i4SLqVeU+?i=+xKuriC~HwgdGn= z_h&iBtV2O@KjE8@OLZ0puFhMItm66JPiMSI>{r}(jwa$xtr%TGBJ>G;*cI`RvVMxs zLL&On7Or35l|6!X?J)HV@n-o}p+{V2`o01_tPF04@MVR5#+7#Pn08lp2(l%u8a;OK zp!ISz(Yv&yU9p3`nyiop<}_K~ng$MQvd`J#lr2W)iTQcM6h}31f?4O#I;+uB+-3%Q z`0*cPJNYsaZJP;O!<&(@=W~@+w3!zp^n`Il@%WNyddXfg_AZ&jjk(TlN%G=_dLieUI)}5eKVv-52W;%U3({kc=kzi09cD^L9+|y1X;sFF|f& UTm9BGZ2$lO07*qoM6N<$g0UG+&Hw-a literal 0 HcmV?d00001 diff --git a/static/js/dist/media/sprites.png b/static/js/dist/media/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..20aadb6c4c31f4a46f0a3316241788687c2fc444 GIT binary patch literal 2595 zcmZ{mc|6mPAICr2%r$G9Gq=d~t=uisVbfeWBNdTjj>;KwOlgg3o6w=$VTiUQqA*5Z zqeBNdlP~3NLYQlgzWe@uzkj}e{Qh{qpO4r3{dzs#|Guftj@EE-1#tiX;I=k+7Xf_) zby-wM&<|a|;wpep5Y7Py09EO*O<$-$s}XEm8~}i*1puUE0N@Koq-g-SWB>qM9{@1R z0sy&)yoTe41PidAoi!f#eKY-ivp|VO*tkatF7^LYAPb$`IKfQF7LPj-H#nOY93tH> z^E&<2Kvrjs^Dl@_DIESu)`EnM*Bvjyqg;;QL)~h5irx$z88=G~Q?ZS;dNuY=N~)rP z!{UdRCeJC3|^p@Y^MmSaw|O zqcgnH`mt=(`nwksF1OpdRwptSWL&g;<#Vt5VHL)|uKRA9#vdbF_=0_?$=A_m z@F%rT_!cE|G&D6rw}mnJ1_l_g{vf!~zq1Xc|EB$kXZY!_p79<2K9Yrd(OT{Mb{mHR zIvKG63$q6jt50+|q)^*;#+gBVShnFY)z5nDzRVi4ozb?LsVO@_w2}`s^Nsd45NuI& zhpaC93Xq=!P!5F+t|m_?X^7vZ!l;zS{DCNSO=s(#>vwURfgYrFL(a3IT>5^I1^Q*X z;)RoYq>tsN>gj(j@5Vm}xi@}SsB{RVwp&HMV7`=duNpIAN9DD77D=bx@cS4V-&vPO zs5T{9CdzxiGP{x8MkGN(d=iBWQ`V%DcFT)=J1o)t)H3Td!oc1LAK_<(d3rW6p80;H z#aIj?rO_f63gW^WOh=(%{(Ndk<7FM|l3yoxnrDV*OW1=m7B0}%cYUk@slC;DWXDJ- zbzq}6+noaUhkMwYaDbO3K#1{=500{dhi6mjFD;htRSp}2)l%ASo_Jf3u6|gk06e31F|)O_QAS*Z)CL|=mx)^$~0VZ>4RvI2=-oxLwg~Smc)R? ziic42uNohoj(`9tgiNDgQA$gb7jWL6o!tQebl792!%r&rX2iIfd zwjCA3av?iKJ}2lJ8aH!`0%DB+fVum7^Xn%nzYa~JUtU>O2ppA|Zv3&d&9bUmk59Wz zU5`&9r68bYF9iuIr-eb;&1xz9u|eaG%lNMHX%7WXx1|oiTEa z>5u=TY{rZ?nC7g%a>`NFGkxo57ecI%fnP_0QMi=h$usgg0U#K-lzo4ICX2@=XH+sc z?g*KF0<%eFSi+hfrgUltlJ2H-Z zNgsLbj_fx9j~L$hL?f1QThz~tgbFXL+ABGfgeeV!y6)b(&XBAjndVe&>reu7Pyf=x zBRL88M z)}J=R;=En-&;r8ZUsGq!E5bTZI30ysLn0@>FMiMaxg|*of^qCKqJSvJ z0d>D!A)AgP2XVYFBbH^}&?+aq&<1wvLZ5NZF6a6EL3a$E&MWZh;|@dmkt_PPY2swc z+FZ<9_A}S`S(YM7D3}&ZL*Y5Un?gWzqSNAI^s+V*l+rQuSk)OZIwLDY;!Y&bp^z16 zThcLSRSRV}#c|Rc5zKweZ=hGB3IQi{K@~RcKnG~SYLwuCuxQAB7^l~i#Xn5RuLq`; z3x`vtuuU4;q_@_T}uEHsg z*4`$9M+;xYYtcWMNO>;}oflgzXxnCsdQ{_X0K-Pe{Ar=B2@EJBsZNI*_oq#3H~VyO z1+Z!ok$uzv#fhVV&1M?SNP)52x%dd@WR24 zUs;*7RYd??6)qAX(T^L;oAxHFSVQ#WgHm$*kXwB_I_3T3&DJ&FrTvwioMQ7?w}NWCd{15EH?+j(m|Bqcpc;aWOw>o##G#~R~B zUK2Wj&~kbSK&DkUi_rUF{iq$AEzUzRN$hp^Ov$CFzCgWie8o9+7{CS_K5>u>-XXU?4pmmDU ztF($Uj}mD;7m=xN*ZW;doJicbKz@!Nb9mH-kEnvphMGQMR4LxYt-BP2MOr8}%g{!FKX!$g&pF<7_#5Ou0bt>ToPvvMIf;;DVHCXEYR{K)FG zEnpihSH8kHUn+U2iLU)o$`?z z?v&TgUglV~^_d5mvWG1PRPvjab=@BKopM~Yml!&Z@v1m=-&Bk&>c>i&w<7pjKM_7i z4O-r^YC0m*I}`em?^|CtlgnTzZ-0t#cSAfpe}nN7yeacKvaa!Lc^~0`!h$)k2vJas zVl6|mN7CebXQZr}Ji;q~o8Mu*J6`Z0{e|F3(u}q|9qsQM9biU?3=jY?GB7mVXMovf zWPHL9V`hXlGcny`U|?oou(O3u|5qS1-2Z%F{QnP}&sR_p1myp@;2Itn9qStz0K~?| g>YWb@jw1L*1n7lF2IbBjQV^H`TT4g$QwtyR-{S78%>V!Z literal 0 HcmV?d00001 diff --git a/static/js/dist/media/sprites.svg b/static/js/dist/media/sprites.svg new file mode 100644 index 0000000..3f09ef3 --- /dev/null +++ b/static/js/dist/media/sprites.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/js/dist/msg/ab.d.ts b/static/js/dist/msg/ab.d.ts new file mode 100644 index 0000000..eb87b9b --- /dev/null +++ b/static/js/dist/msg/ab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ab.js b/static/js/dist/msg/ab.js new file mode 100644 index 0000000..556da3a --- /dev/null +++ b/static/js/dist/msg/ab.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ar.d.ts b/static/js/dist/msg/ar.d.ts new file mode 100644 index 0000000..e2435d7 --- /dev/null +++ b/static/js/dist/msg/ar.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ar locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ar.js b/static/js/dist/msg/ar.js new file mode 100644 index 0000000..93cae39 --- /dev/null +++ b/static/js/dist/msg/ar.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +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"] = "https://www.december.com/html/spec/colorpercompact.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://ar.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 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://ar.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://ar.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://ar.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"] = "عودة قوس ظل النقطة (س، ص) بالدرجات من -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://ar.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"] = "تقيد %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://tr.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://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://ar.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://ar.wikipedia.org/wiki/توليد_الأعداد_العشوائية"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = " عدد صحيح عشوائي من %1 إلى %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ar.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://ar.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"] = "جيب تمام"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://ar.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"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اسمح بالبيانات"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "مع:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ar.wikipedia.org/wiki/دالة_(برمجة)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "تشغيل الدالة المعرفة من قبل المستخدم '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ar.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://ar.wikipedia.org/wiki/دالة_(برمجة)"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "القيام بشيء ما"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "إلى"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "انشئ دالة بدون مخرجات ."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://tr.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"] = "إذا كانت القيمة صحيحة ، اذان قم بارجاع القيمة الثانية."; +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://ar.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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/az.d.ts b/static/js/dist/msg/az.d.ts new file mode 100644 index 0000000..a877781 --- /dev/null +++ b/static/js/dist/msg/az.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly az locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/az.js b/static/js/dist/msg/az.js new file mode 100644 index 0000000..8e877ac --- /dev/null +++ b/static/js/dist/msg/az.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ba.d.ts b/static/js/dist/msg/ba.d.ts new file mode 100644 index 0000000..21cc21c --- /dev/null +++ b/static/js/dist/msg/ba.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ba locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ba.js b/static/js/dist/msg/ba.js new file mode 100644 index 0000000..03198e2 --- /dev/null +++ b/static/js/dist/msg/ba.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/bcc.d.ts b/static/js/dist/msg/bcc.d.ts new file mode 100644 index 0000000..e60e54d --- /dev/null +++ b/static/js/dist/msg/bcc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly bcc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/bcc.js b/static/js/dist/msg/bcc.js new file mode 100644 index 0000000..b58adeb --- /dev/null +++ b/static/js/dist/msg/bcc.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/be-tarask.d.ts b/static/js/dist/msg/be-tarask.d.ts new file mode 100644 index 0000000..91640bb --- /dev/null +++ b/static/js/dist/msg/be-tarask.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly be-tarask locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/be-tarask.js b/static/js/dist/msg/be-tarask.js new file mode 100644 index 0000000..777bfc7 --- /dev/null +++ b/static/js/dist/msg/be-tarask.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/be.d.ts b/static/js/dist/msg/be.d.ts new file mode 100644 index 0000000..0857b63 --- /dev/null +++ b/static/js/dist/msg/be.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly be locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/be.js b/static/js/dist/msg/be.js new file mode 100644 index 0000000..997d2f3 --- /dev/null +++ b/static/js/dist/msg/be.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/bg.d.ts b/static/js/dist/msg/bg.d.ts new file mode 100644 index 0000000..8190515 --- /dev/null +++ b/static/js/dist/msg/bg.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly bg locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/bg.js b/static/js/dist/msg/bg.js new file mode 100644 index 0000000..7e650d0 --- /dev/null +++ b/static/js/dist/msg/bg.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/bn.d.ts b/static/js/dist/msg/bn.d.ts new file mode 100644 index 0000000..8207499 --- /dev/null +++ b/static/js/dist/msg/bn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly bn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/bn.js b/static/js/dist/msg/bn.js new file mode 100644 index 0000000..1721f6e --- /dev/null +++ b/static/js/dist/msg/bn.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/br.d.ts b/static/js/dist/msg/br.d.ts new file mode 100644 index 0000000..319e7ad --- /dev/null +++ b/static/js/dist/msg/br.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly br locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/br.js b/static/js/dist/msg/br.js new file mode 100644 index 0000000..7d2694b --- /dev/null +++ b/static/js/dist/msg/br.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "goulenn un destenn gant ur gemennadenn"; +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"] = "dizanv"; +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"] = "Takad labour Blockly"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ca.d.ts b/static/js/dist/msg/ca.d.ts new file mode 100644 index 0000000..a89b937 --- /dev/null +++ b/static/js/dist/msg/ca.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ca locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ca.js b/static/js/dist/msg/ca.js new file mode 100644 index 0000000..43e72c5 --- /dev/null +++ b/static/js/dist/msg/ca.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Els blocs plegats contenen avisos."; +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"] = "No es pot fer servir un nom de variable buit."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Reanomena"; +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"] = "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 l'element."; +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"] = "invertir %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Invertir la còpia d'una llista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendent"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendent"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordena la còpia d'una llista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabètic, ignorant majúscules"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numèric"; +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"] = "fer una llista d'un text"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "fer un text d'una llista"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Ajunta una llista de textos en un text, separats per un delimitador."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Parteix el text en una llista de textos, trencant-lo a cada delimitador."; +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://ca.wikipedia.org/wiki/Inverses_de_les_funcions_trigonom%C3%A8triques#L'arctangent_amb_dos_arguments"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Torna l'arctangent del punt (X,Y) en graus de -180 a 180."; +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"] = "en el text %1 %2"; +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"] = "comptar %1 en %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Compta quantes vegades hi ha un text dins d'un altre text."; +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"] = "substituir %1 amb %2 en %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Substitueix totes les aparicions d'un text dins d'un altre text."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "invertir %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverteix l'ordre dels caràcters en el text."; +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"] = "sense nom"; +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"] = "Espai de treball Blockly"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/constants.d.ts b/static/js/dist/msg/constants.d.ts new file mode 100644 index 0000000..41cb98e --- /dev/null +++ b/static/js/dist/msg/constants.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly constants locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/cs.d.ts b/static/js/dist/msg/cs.d.ts new file mode 100644 index 0000000..fd8998d --- /dev/null +++ b/static/js/dist/msg/cs.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly cs locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/cs.js b/static/js/dist/msg/cs.js new file mode 100644 index 0000000..c486489 --- /dev/null +++ b/static/js/dist/msg/cs.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Storno"; +Blockly.Msg["IOS_ERROR"] = "Chyba"; +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"] = "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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/da.d.ts b/static/js/dist/msg/da.d.ts new file mode 100644 index 0000000..9ae9615 --- /dev/null +++ b/static/js/dist/msg/da.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly da locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/da.js b/static/js/dist/msg/da.js new file mode 100644 index 0000000..824834d --- /dev/null +++ b/static/js/dist/msg/da.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/de.d.ts b/static/js/dist/msg/de.d.ts new file mode 100644 index 0000000..84004ff --- /dev/null +++ b/static/js/dist/msg/de.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly de locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/de.js b/static/js/dist/msg/de.js new file mode 100644 index 0000000..3cd55b1 --- /dev/null +++ b/static/js/dist/msg/de.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "um"; +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"] = "unbenannt"; +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 Arbeitsbereich"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/diq.d.ts b/static/js/dist/msg/diq.d.ts new file mode 100644 index 0000000..2dadf5b --- /dev/null +++ b/static/js/dist/msg/diq.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly diq locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/diq.js b/static/js/dist/msg/diq.js new file mode 100644 index 0000000..54e51f0 --- /dev/null +++ b/static/js/dist/msg/diq.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Pê amarêno %1 %2 ra %3 rê , herg gam de %4 vurnayışi"; +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"] = "Na fonksiyon de dekerdeko mukerrer şınasiyao"; +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"] = "Lista de obcey sıfteyıni tadano"; +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"] = "Lista de obcey peyêni tadano"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Lista de obcey raşt ameyayi tadano"; +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"] = "Lista de obcey sıfteyıni wedareno"; +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"] = "Lista de obcey peyêni wedareno"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Lista de obcey raşt ameyayi wedareno"; +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"] = "Lista # ra lista bınên bıgêrê"; +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"] = "Lista de obcey sıfteyıni eyar keno"; +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"] = "Lista de obcey peyêni eyar keno"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Lista de obcey raşt ameyayi eyar keno"; +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"] = "Kopyay yew lista rêz kerê"; +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"] = "metini ra lista bıkerê"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "Lista ra metin bıkerê"; +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"] = "Arêdayışê dı amara tadê"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Letey iya dı amara tadê"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ferqê dı amara tadê"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Reyina dı amara tadê"; +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"] = "Standart ferqıziya lista"; +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"] = "Lista de amara tewr qıckeke tadê"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Lista ra amara werti tadê"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Lista de tewr qıckek amar tadê"; +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"] = "Ercê mutlaqê yew amarer tadê"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "E quwetê yew amar tadano."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Tebi algoritmaya yew amarer tadê"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Logaritmay 10i yew amari rê peyser tadê"; +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"] = "Karerêçê yew amarer tadê"; +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"] = "Derecey yew kosinusi tadê (radyan niyo)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Sinusi yew derece tadê (radyan niyo)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Tanjantê yew derecey tadê (radyan niyo)"; +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"] = "Seba yew numreya karber persiyê"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Seba tay metinan karberi persiyê"; +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 heruna ra zerrey %3 zerrey %2 ya bıvurne"; +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"] = "Ercê nê vurnayoği tadano"; +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 Caygurenayışi"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/dty.d.ts b/static/js/dist/msg/dty.d.ts new file mode 100644 index 0000000..995d93a --- /dev/null +++ b/static/js/dist/msg/dty.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly dty locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/dty.js b/static/js/dist/msg/dty.js new file mode 100644 index 0000000..b9a3eef --- /dev/null +++ b/static/js/dist/msg/dty.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ee.d.ts b/static/js/dist/msg/ee.d.ts new file mode 100644 index 0000000..436e5b9 --- /dev/null +++ b/static/js/dist/msg/ee.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ee locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ee.js b/static/js/dist/msg/ee.js new file mode 100644 index 0000000..ce3bb14 --- /dev/null +++ b/static/js/dist/msg/ee.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/el.d.ts b/static/js/dist/msg/el.d.ts new file mode 100644 index 0000000..981a987 --- /dev/null +++ b/static/js/dist/msg/el.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly el locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/el.js b/static/js/dist/msg/el.js new file mode 100644 index 0000000..d35bf61 --- /dev/null +++ b/static/js/dist/msg/el.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"; +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"; +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"; +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"; +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"; +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"; +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"; +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"; +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"; +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://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)"; +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"; +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"] = ""; // 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"; +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"; +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"] = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό."; +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"; // 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"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/en-gb.d.ts b/static/js/dist/msg/en-gb.d.ts new file mode 100644 index 0000000..59032a4 --- /dev/null +++ b/static/js/dist/msg/en-gb.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly en-gb locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/en-gb.js b/static/js/dist/msg/en-gb.js new file mode 100644 index 0000000..4055f84 --- /dev/null +++ b/static/js/dist/msg/en-gb.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/en.d.ts b/static/js/dist/msg/en.d.ts new file mode 100644 index 0000000..256aa7d --- /dev/null +++ b/static/js/dist/msg/en.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly en locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/en.js b/static/js/dist/msg/en.js new file mode 100644 index 0000000..aabc83f --- /dev/null +++ b/static/js/dist/msg/en.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/eo.d.ts b/static/js/dist/msg/eo.d.ts new file mode 100644 index 0000000..a9b4004 --- /dev/null +++ b/static/js/dist/msg/eo.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly eo locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/eo.js b/static/js/dist/msg/eo.js new file mode 100644 index 0000000..39268e8 --- /dev/null +++ b/static/js/dist/msg/eo.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/es.d.ts b/static/js/dist/msg/es.d.ts new file mode 100644 index 0000000..4dd0c58 --- /dev/null +++ b/static/js/dist/msg/es.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly es locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/es.js b/static/js/dist/msg/es.js new file mode 100644 index 0000000..2fa4fae --- /dev/null +++ b/static/js/dist/msg/es.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Cambiar nombre"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/et.d.ts b/static/js/dist/msg/et.d.ts new file mode 100644 index 0000000..01541ff --- /dev/null +++ b/static/js/dist/msg/et.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly et locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/et.js b/static/js/dist/msg/et.js new file mode 100644 index 0000000..595f0c6 --- /dev/null +++ b/static/js/dist/msg/et.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Kokkuvajunud plokid sisaldavad hoiatusi."; +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"] = "Sellel funktsioonil on dubleerivad sisendid."; +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"] = "Loendi koopia ümberpööramine."; +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"] = "Pöörab tekstis tähemärkide järjestuse ümber."; +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"] = "nimetu"; +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 tööruum"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Ütle midagi..."; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/eu.d.ts b/static/js/dist/msg/eu.d.ts new file mode 100644 index 0000000..1d0e852 --- /dev/null +++ b/static/js/dist/msg/eu.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly eu locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/eu.js b/static/js/dist/msg/eu.js new file mode 100644 index 0000000..322104a --- /dev/null +++ b/static/js/dist/msg/eu.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/fa.d.ts b/static/js/dist/msg/fa.d.ts new file mode 100644 index 0000000..0e92979 --- /dev/null +++ b/static/js/dist/msg/fa.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly fa locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/fa.js b/static/js/dist/msg/fa.js new file mode 100644 index 0000000..8671801 --- /dev/null +++ b/static/js/dist/msg/fa.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "بدون نام"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/fi.d.ts b/static/js/dist/msg/fi.d.ts new file mode 100644 index 0000000..dad65e9 --- /dev/null +++ b/static/js/dist/msg/fi.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly fi locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/fi.js b/static/js/dist/msg/fi.js new file mode 100644 index 0000000..38d914a --- /dev/null +++ b/static/js/dist/msg/fi.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Blocklyn työnäkymä"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/fr.d.ts b/static/js/dist/msg/fr.d.ts new file mode 100644 index 0000000..6014c3b --- /dev/null +++ b/static/js/dist/msg/fr.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly fr locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/fr.js b/static/js/dist/msg/fr.js new file mode 100644 index 0000000..e38a7e6 --- /dev/null +++ b/static/js/dist/msg/fr.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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érifie 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 ne peut ê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 « set %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 « get %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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/gl.d.ts b/static/js/dist/msg/gl.d.ts new file mode 100644 index 0000000..874c328 --- /dev/null +++ b/static/js/dist/msg/gl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly gl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/gl.js b/static/js/dist/msg/gl.js new file mode 100644 index 0000000..b277d2a --- /dev/null +++ b/static/js/dist/msg/gl.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Duplicar o comentario"; +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"] = "Crar unha variábel de cadea..."; +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"] = "innominada"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/gor.d.ts b/static/js/dist/msg/gor.d.ts new file mode 100644 index 0000000..69c2999 --- /dev/null +++ b/static/js/dist/msg/gor.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly gor locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/gor.js b/static/js/dist/msg/gor.js new file mode 100644 index 0000000..ef767e1 --- /dev/null +++ b/static/js/dist/msg/gor.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ha.d.ts b/static/js/dist/msg/ha.d.ts new file mode 100644 index 0000000..f5e92a6 --- /dev/null +++ b/static/js/dist/msg/ha.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ha locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ha.js b/static/js/dist/msg/ha.js new file mode 100644 index 0000000..cc3f13d --- /dev/null +++ b/static/js/dist/msg/ha.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/he.d.ts b/static/js/dist/msg/he.d.ts new file mode 100644 index 0000000..deb61f9 --- /dev/null +++ b/static/js/dist/msg/he.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly he locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/he.js b/static/js/dist/msg/he.js new file mode 100644 index 0000000..623b616 --- /dev/null +++ b/static/js/dist/msg/he.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "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"] = "לעשות שהערך ‚%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"] = "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"] = "לאפשר פעולות"; +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"] = "#"; +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://he.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"] = "תחזיר אמת (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"] = "מחזיר את הארכטנגנס של נקודה (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://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"] = "הגבלת מספר כך שיהיה בין המגבלות שמוגדרות (כולל)."; +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://he.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://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"] = "סטיית תקן של רשימה"; +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"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "שבר אקראי"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "מחזיר שבר אקראי בין 0.0 (כולל) עד 1.0 (כולל)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://he.wikipedia.org/wiki/מחולל_מספרים_אקראיים"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "מספר שלם אקראי בין %1 ל-%2 (כולל)"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "החזרת מספר שלם, חיובי ואקראי בין שני הגבולות שהוגדרו, כולל."; +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"] = "החזרת הארק-קוסינוס של מספר."; +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://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"] = "הוספת טקסט למשתנה ‚%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://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"] = "ללא שם"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/hi.d.ts b/static/js/dist/msg/hi.d.ts new file mode 100644 index 0000000..5abcff5 --- /dev/null +++ b/static/js/dist/msg/hi.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hi locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/hi.js b/static/js/dist/msg/hi.js new file mode 100644 index 0000000..7faca11 --- /dev/null +++ b/static/js/dist/msg/hi.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/hrx.d.ts b/static/js/dist/msg/hrx.d.ts new file mode 100644 index 0000000..7859161 --- /dev/null +++ b/static/js/dist/msg/hrx.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hrx locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/hrx.js b/static/js/dist/msg/hrx.js new file mode 100644 index 0000000..c1aecb3 --- /dev/null +++ b/static/js/dist/msg/hrx.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/hu.d.ts b/static/js/dist/msg/hu.d.ts new file mode 100644 index 0000000..3f87f84 --- /dev/null +++ b/static/js/dist/msg/hu.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hu locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/hu.js b/static/js/dist/msg/hu.js new file mode 100644 index 0000000..b0446fd --- /dev/null +++ b/static/js/dist/msg/hu.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Az összecsukott blokk figyelmeztetéseket tartalmaz."; +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://hu.wikipedia.org/wiki/Arctg2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "Arctg2 X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Az (X,Y) pont arkusz tangens értéke fokban -180 és 180 között."; +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"] = "Az új változó típusa:"; +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"] = "névtelen"; +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 munkaterület"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Mondj valamit..."; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/hy.d.ts b/static/js/dist/msg/hy.d.ts new file mode 100644 index 0000000..ee726e2 --- /dev/null +++ b/static/js/dist/msg/hy.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hy locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/hy.js b/static/js/dist/msg/hy.js new file mode 100644 index 0000000..248d44f --- /dev/null +++ b/static/js/dist/msg/hy.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "անանուն"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ia.d.ts b/static/js/dist/msg/ia.d.ts new file mode 100644 index 0000000..b0324c9 --- /dev/null +++ b/static/js/dist/msg/ia.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ia locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ia.js b/static/js/dist/msg/ia.js new file mode 100644 index 0000000..55b5c71 --- /dev/null +++ b/static/js/dist/msg/ia.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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://ia.wikipedia.org/wiki/Bucla_for"; +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"] = "sin nomine"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/id.d.ts b/static/js/dist/msg/id.d.ts new file mode 100644 index 0000000..ddb57b7 --- /dev/null +++ b/static/js/dist/msg/id.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly id locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/id.js b/static/js/dist/msg/id.js new file mode 100644 index 0000000..8b9ee54 --- /dev/null +++ b/static/js/dist/msg/id.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Tambahkan Komentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Tidak bisa menghapus variabel '%1' karena variabel ini bagian dari sebuah definisi dari fungsi '%2'"; +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"] = "Duplikat Komentar"; +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"] = "Batal"; +Blockly.Msg["IOS_ERROR"] = "Kesalahan"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "tambah masukan"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Ijinkan pernyataan"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Fungsi ini memiliki masukan duplikat"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "Masukan"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Tambah"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "Tambah variabel"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Hapus"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Kamu tidak bisa menggunakan variabel kosong"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Ubah nama"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nama variabel"; +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"; +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."; // 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"] = "Buat variabel warna..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Buat variabel number..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Buat variabel string..."; +Blockly.Msg["NEW_VARIABLE"] = "Buat variabel..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nama variabel baru:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipe variabel baru:"; +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/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Menjalankan fungsi '%1' yang ditetapkan pengguna."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "tanpa nama"; +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"] = "Variabel yg bernama '%1' sudah ada untuk tipe lain: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Ucapkan sesuatu..."; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ig.d.ts b/static/js/dist/msg/ig.d.ts new file mode 100644 index 0000000..90e5c7b --- /dev/null +++ b/static/js/dist/msg/ig.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ig locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ig.js b/static/js/dist/msg/ig.js new file mode 100644 index 0000000..133358c --- /dev/null +++ b/static/js/dist/msg/ig.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/is.d.ts b/static/js/dist/msg/is.d.ts new file mode 100644 index 0000000..88bfa07 --- /dev/null +++ b/static/js/dist/msg/is.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly is locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/is.js b/static/js/dist/msg/is.js new file mode 100644 index 0000000..9860b54 --- /dev/null +++ b/static/js/dist/msg/is.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/it.d.ts b/static/js/dist/msg/it.d.ts new file mode 100644 index 0000000..0bff1ff --- /dev/null +++ b/static/js/dist/msg/it.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly it locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/it.js b/static/js/dist/msg/it.js new file mode 100644 index 0000000..42ce096 --- /dev/null +++ b/static/js/dist/msg/it.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Area di lavoro di Blockly"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ja.d.ts b/static/js/dist/msg/ja.d.ts new file mode 100644 index 0000000..ed76fdf --- /dev/null +++ b/static/js/dist/msg/ja.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ja locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ja.js b/static/js/dist/msg/ja.js new file mode 100644 index 0000000..e5075a8 --- /dev/null +++ b/static/js/dist/msg/ja.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "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"] = "X:%1 Y:%2のaran2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "点 (X, Y) の逆関数を -180 度から 180度まで返します。"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/kab.d.ts b/static/js/dist/msg/kab.d.ts new file mode 100644 index 0000000..98747fa --- /dev/null +++ b/static/js/dist/msg/kab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly kab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/kab.js b/static/js/dist/msg/kab.js new file mode 100644 index 0000000..e3f8369 --- /dev/null +++ b/static/js/dist/msg/kab.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "rkec"; +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-a, sakin kemmel allus d-itteddun."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Ɣur-k: Iḥder-a 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 armi d amḍan n taggara, s tmerna n usurif yettunefken, sakin selkem tinaḍin yettunefken."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Rnu 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 asmizzwer n tgezmiyin akken ad talseḍ tawila n yiḥder-a 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"] = "mayella azal d idetti, ihi selkem kra n tinaḍin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Mayella azal d idetti, selkem iḥder amezwaru. Neɣ ma ulac, selkem iḥder wis sin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Mayella 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"] = "Mayella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ, mayella azal wis sin d idetti, selkem iḥder wis sin. Mayella ula d yiwen seg-sen ur yelli 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 tikkal"; +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 armi"; +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ḥedran"; +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 yiḥder-a 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 ɣer tebdart."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ad yernu tabdart s umḍan n yiferdisen."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "amezwaru"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# si taggara"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "awi"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "awi rnu 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 yettwamlen 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 syin ad d-yerr aferdis n wadig yettwamlen 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 yettwamlen 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 taggara"; +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 taggara"; +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 yettwamlen 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"] = "af-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 amezwaru 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 mayella 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 yettwamlen deg tabdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ad yernu aferdis ar taggara 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 yettwamlen 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 yiwen s usnabraz."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Ad yegzem aḍris ɣef ddeqs n tebdarin n yiḍ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 yinekcam d imegduya."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ad d-yerr idetti ma anekcam amezwaru meqqer ɣef wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ad d-yerr idetti ma anekcam amezwaru meqqer neɣ yegda wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy ɣef wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy neɣ yegda wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ad d-yerr idetti mayella i sin n yinekcam 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 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 inekcam d idettiyen."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ad d-yerr idetti ma ɣarsum yiwen seg yinekcam 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 d ucciḍ"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ma d idetti"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Senqed tawtilt deg 'sekyed'. Ma 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 yimiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Ad d-yerr aful n sin n yimḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ad d-yerr tmernit n sin n yimiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Ad d-yerr tukksa gar sin n yimiḍ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 umḍ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 amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ubṭay ɣef kra n umḍan. Ad d-yerr idetti 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 yimḍ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"] = "Tiggtiwin 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 unammas 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 yiferdisen 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 yimḍ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ẓar uzmir sin n umḍ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' i yesbadu useqdac."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Selkem tawuri '%1' i yesbadu useqdac 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-a..."; +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-a ɣur-s iɣewwaṛen usligen."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Sebrureq 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-a yezmer ur yettwaseqdac ara anagar deg tebadut n twuri-a."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "isem n unekcum:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "rnu anekcam ɣer twuri-a."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "inekcam"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Rnu, kkes neɣ ales asmizzwer n yinekcam i twuri-a."; +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 ɣer %1"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Rnu aḍris ɣer 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 taggara"; +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 yettwamlen."; +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 wayeḍ."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Rnu aferdis ɣer 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 yiḥder-a."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "armi d asekkil # si taggara"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "armi d asekkil #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "armi 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 taggara"; +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 yettwamlen 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 amezwaru deg uḍris wis sin. Ad d-yerr %1 ma yella ulac aḍris."; +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ḍris s"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Ad yernu taceqquft n uḍris s usdukel gar yal amḍan n yiferdisen."; +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 yisekkilen (ddan 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"] = "Ad 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 yisekkilen 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 yisekkilen imellalen seg sin n yidisan"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "tukksa n yisekkilen seg uzelmaḍ"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "tukksa n yisekkilen seg uyeffus"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Ad d-yerr anɣel n uḍris s yisekkilen ilmawen yettwakksen seg yixf neɣ i sin."; +Blockly.Msg["TODAY"] = "Ass-a"; +Blockly.Msg["UNDO"] = "Err-d"; +Blockly.Msg["UNNAMED_KEY"] = "war isem"; +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-a."; +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-a 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"] = "Tallunt n umahel Blockly"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/kn.d.ts b/static/js/dist/msg/kn.d.ts new file mode 100644 index 0000000..9ac70f3 --- /dev/null +++ b/static/js/dist/msg/kn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly kn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/kn.js b/static/js/dist/msg/kn.js new file mode 100644 index 0000000..17a6880 --- /dev/null +++ b/static/js/dist/msg/kn.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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://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"] = "%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"] = "ಮೌಲ್ಯವು ಸತ್ಯವಾಗಿದ್ದರೆ, ಕೆಲವು ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡಿ."; +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"] = "ಸಾಲಿನಲ್ಲಿರುವ ಒಳಾoಶಗಳು"; +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://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"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "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://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"] = "ಪಟ್ಟಿಯಲ್ಲಿರುವ ಸಾಮಾನ್ಯ ಅಂಶಗಳ ಪಟ್ಟಿಯನ್ನು ಹಿಂತಿರುಗಿಸಿ."; +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"] = "ಒಂದು ಸಂಖ್ಯೆಯ 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"; +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"] = "ಒಳಾoಶದ ಹೆಸರು:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "ಕಾರ್ಯಘಟಕಕ್ಕೆ ಒಳಾoಶವನ್ನು ಸೇರಿಸಿ."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "ಒಳಾoಶಗಳು"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "ಈ ಕಾರ್ಯಕ್ಕೆ ಒಳಾoಶಗಳನ್ನು ಸೇರಿಸಿ, ತೆಗೆದುಹಾಕಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಿ."; +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"] = "%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 ಅನ್ನು ಹಿಂತಿರುಗಿಸುವುದು."; +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 ಅನ್ನು %3 ರಲ್ಲಿ %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://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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ko.d.ts b/static/js/dist/msg/ko.d.ts new file mode 100644 index 0000000..344002e --- /dev/null +++ b/static/js/dist/msg/ko.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ko locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ko.js b/static/js/dist/msg/ko.js new file mode 100644 index 0000000..b8a024f --- /dev/null +++ b/static/js/dist/msg/ko.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "접힌 블록이 경고를 포함하고 있습니다."; +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"] = "구문 허가"; +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"] = "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"; +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"] = "다른 텍스트 내에서 일부 텍스트의 모든 발생을 치환합니다."; +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 워크스페이스"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/lb.d.ts b/static/js/dist/msg/lb.d.ts new file mode 100644 index 0000000..0eee88e --- /dev/null +++ b/static/js/dist/msg/lb.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lb locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/lb.js b/static/js/dist/msg/lb.js new file mode 100644 index 0000000..15db77d --- /dev/null +++ b/static/js/dist/msg/lb.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/lki.d.ts b/static/js/dist/msg/lki.d.ts new file mode 100644 index 0000000..9559de1 --- /dev/null +++ b/static/js/dist/msg/lki.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lki locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/lki.js b/static/js/dist/msg/lki.js new file mode 100644 index 0000000..b3af5f1 --- /dev/null +++ b/static/js/dist/msg/lki.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/lo.d.ts b/static/js/dist/msg/lo.d.ts new file mode 100644 index 0000000..5a9071c --- /dev/null +++ b/static/js/dist/msg/lo.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lo locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/lo.js b/static/js/dist/msg/lo.js new file mode 100644 index 0000000..74179d3 --- /dev/null +++ b/static/js/dist/msg/lo.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/lrc.d.ts b/static/js/dist/msg/lrc.d.ts new file mode 100644 index 0000000..044134a --- /dev/null +++ b/static/js/dist/msg/lrc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lrc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/lrc.js b/static/js/dist/msg/lrc.js new file mode 100644 index 0000000..72f537c --- /dev/null +++ b/static/js/dist/msg/lrc.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/lt.d.ts b/static/js/dist/msg/lt.d.ts new file mode 100644 index 0000000..9cc7516 --- /dev/null +++ b/static/js/dist/msg/lt.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lt locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/lt.js b/static/js/dist/msg/lt.js new file mode 100644 index 0000000..bff03e5 --- /dev/null +++ b/static/js/dist/msg/lt.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/lv.d.ts b/static/js/dist/msg/lv.d.ts new file mode 100644 index 0000000..88b41c7 --- /dev/null +++ b/static/js/dist/msg/lv.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lv locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/lv.js b/static/js/dist/msg/lv.js new file mode 100644 index 0000000..67e445d --- /dev/null +++ b/static/js/dist/msg/lv.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "nenosaukts"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/mk.d.ts b/static/js/dist/msg/mk.d.ts new file mode 100644 index 0000000..951b027 --- /dev/null +++ b/static/js/dist/msg/mk.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly mk locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/mk.js b/static/js/dist/msg/mk.js new file mode 100644 index 0000000..d56fc29 --- /dev/null +++ b/static/js/dist/msg/mk.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/mnw.d.ts b/static/js/dist/msg/mnw.d.ts new file mode 100644 index 0000000..962b8c5 --- /dev/null +++ b/static/js/dist/msg/mnw.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly mnw locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/mnw.js b/static/js/dist/msg/mnw.js new file mode 100644 index 0000000..a462683 --- /dev/null +++ b/static/js/dist/msg/mnw.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ms.d.ts b/static/js/dist/msg/ms.d.ts new file mode 100644 index 0000000..f154c4e --- /dev/null +++ b/static/js/dist/msg/ms.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ms locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ms.js b/static/js/dist/msg/ms.js new file mode 100644 index 0000000..40ca7d0 --- /dev/null +++ b/static/js/dist/msg/ms.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/msg.d.ts b/static/js/dist/msg/msg.d.ts new file mode 100644 index 0000000..65d7808 --- /dev/null +++ b/static/js/dist/msg/msg.d.ts @@ -0,0 +1,444 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly Messages. + * @author samelh@google.com (Sam El-Husseini) + */ + + +declare namespace Blockly.Msg { + let ADD_COMMENT : string ; + let CANNOT_DELETE_VARIABLE_PROCEDURE : string ; + let CHANGE_VALUE_TITLE : string ; + let CLEAN_UP : string ; + let COLLAPSED_WARNINGS_WARNING : string ; + let COLLAPSE_ALL : string ; + let COLLAPSE_BLOCK : string ; + let COLOUR_BLEND_COLOUR1 : string ; + let COLOUR_BLEND_COLOUR2 : string ; + let COLOUR_BLEND_HELPURL : string ; + let COLOUR_BLEND_RATIO : string ; + let COLOUR_BLEND_TITLE : string ; + let COLOUR_BLEND_TOOLTIP : string ; + let COLOUR_HUE : string ; + let COLOUR_PICKER_HELPURL : string ; + let COLOUR_PICKER_TOOLTIP : string ; + let COLOUR_RANDOM_HELPURL : string ; + let COLOUR_RANDOM_TITLE : string ; + let COLOUR_RANDOM_TOOLTIP : string ; + let COLOUR_RGB_BLUE : string ; + let COLOUR_RGB_GREEN : string ; + let COLOUR_RGB_HELPURL : string ; + let COLOUR_RGB_RED : string ; + let COLOUR_RGB_TITLE : string ; + let COLOUR_RGB_TOOLTIP : string ; + let CONTROLS_FLOW_STATEMENTS_HELPURL : string ; + let CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK : string ; + let CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE : string ; + let CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK : string ; + let CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE : string ; + let CONTROLS_FLOW_STATEMENTS_WARNING : string ; + let CONTROLS_FOREACH_HELPURL : string ; + let CONTROLS_FOREACH_INPUT_DO : string ; + let CONTROLS_FOREACH_TITLE : string ; + let CONTROLS_FOREACH_TOOLTIP : string ; + let CONTROLS_FOR_HELPURL : string ; + let CONTROLS_FOR_INPUT_DO : string ; + let CONTROLS_FOR_TITLE : string ; + let CONTROLS_FOR_TOOLTIP : string ; + let CONTROLS_IF_ELSEIF_TITLE_ELSEIF : string ; + let CONTROLS_IF_ELSEIF_TOOLTIP : string ; + let CONTROLS_IF_ELSE_TITLE_ELSE : string ; + let CONTROLS_IF_ELSE_TOOLTIP : string ; + let CONTROLS_IF_HELPURL : string ; + let CONTROLS_IF_IF_TITLE_IF : string ; + let CONTROLS_IF_IF_TOOLTIP : string ; + let CONTROLS_IF_MSG_ELSE : string ; + let CONTROLS_IF_MSG_ELSEIF : string ; + let CONTROLS_IF_MSG_IF : string ; + let CONTROLS_IF_MSG_THEN : string ; + let CONTROLS_IF_TOOLTIP_1 : string ; + let CONTROLS_IF_TOOLTIP_2 : string ; + let CONTROLS_IF_TOOLTIP_3 : string ; + let CONTROLS_IF_TOOLTIP_4 : string ; + let CONTROLS_REPEAT_HELPURL : string ; + let CONTROLS_REPEAT_INPUT_DO : string ; + let CONTROLS_REPEAT_TITLE : string ; + let CONTROLS_REPEAT_TOOLTIP : string ; + let CONTROLS_WHILEUNTIL_HELPURL : string ; + let CONTROLS_WHILEUNTIL_INPUT_DO : string ; + let CONTROLS_WHILEUNTIL_OPERATOR_UNTIL : string ; + let CONTROLS_WHILEUNTIL_OPERATOR_WHILE : string ; + let CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL : string ; + let CONTROLS_WHILEUNTIL_TOOLTIP_WHILE : string ; + let DELETE_ALL_BLOCKS : string ; + let DELETE_BLOCK : string ; + let DELETE_VARIABLE : string ; + let DELETE_VARIABLE_CONFIRMATION : string ; + let DELETE_X_BLOCKS : string ; + let DISABLE_BLOCK : string ; + let DUPLICATE_BLOCK : string ; + let DUPLICATE_COMMENT : string ; + let ENABLE_BLOCK : string ; + let EXPAND_ALL : string ; + let EXPAND_BLOCK : string ; + let EXTERNAL_INPUTS : string ; + let HELP : string ; + let INLINE_INPUTS : string ; + let IOS_CANCEL : string ; + let IOS_ERROR : string ; + let IOS_OK : string ; + let IOS_PROCEDURES_ADD_INPUT : string ; + let IOS_PROCEDURES_ALLOW_STATEMENTS : string ; + let IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR : string ; + let IOS_PROCEDURES_INPUTS : string ; + let IOS_VARIABLES_ADD_BUTTON : string ; + let IOS_VARIABLES_ADD_VARIABLE : string ; + let IOS_VARIABLES_DELETE_BUTTON : string ; + let IOS_VARIABLES_EMPTY_NAME_ERROR : string ; + let IOS_VARIABLES_RENAME_BUTTON : string ; + let IOS_VARIABLES_VARIABLE_NAME : string ; + let LISTS_CREATE_EMPTY_HELPURL : string ; + let LISTS_CREATE_EMPTY_TITLE : string ; + let LISTS_CREATE_EMPTY_TOOLTIP : string ; + let LISTS_CREATE_WITH_CONTAINER_TITLE_ADD : string ; + let LISTS_CREATE_WITH_CONTAINER_TOOLTIP : string ; + let LISTS_CREATE_WITH_HELPURL : string ; + let LISTS_CREATE_WITH_INPUT_WITH : string ; + let LISTS_CREATE_WITH_ITEM_TITLE : string ; + let LISTS_CREATE_WITH_ITEM_TOOLTIP : string ; + let LISTS_CREATE_WITH_TOOLTIP : string ; + let LISTS_GET_INDEX_FIRST : string ; + let LISTS_GET_INDEX_FROM_END : string ; + let LISTS_GET_INDEX_FROM_START : string ; + let LISTS_GET_INDEX_GET : string ; + let LISTS_GET_INDEX_GET_REMOVE : string ; + let LISTS_GET_INDEX_HELPURL : string ; + let LISTS_GET_INDEX_INPUT_IN_LIST : string ; + let LISTS_GET_INDEX_LAST : string ; + let LISTS_GET_INDEX_RANDOM : string ; + let LISTS_GET_INDEX_REMOVE : string ; + let LISTS_GET_INDEX_TAIL : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_FIRST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_FROM : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_LAST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_RANDOM : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM : string ; + let LISTS_GET_SUBLIST_END_FROM_END : string ; + let LISTS_GET_SUBLIST_END_FROM_START : string ; + let LISTS_GET_SUBLIST_END_LAST : string ; + let LISTS_GET_SUBLIST_HELPURL : string ; + let LISTS_GET_SUBLIST_INPUT_IN_LIST : string ; + let LISTS_GET_SUBLIST_START_FIRST : string ; + let LISTS_GET_SUBLIST_START_FROM_END : string ; + let LISTS_GET_SUBLIST_START_FROM_START : string ; + let LISTS_GET_SUBLIST_TAIL : string ; + let LISTS_GET_SUBLIST_TOOLTIP : string ; + let LISTS_HUE : string ; + let LISTS_INDEX_FROM_END_TOOLTIP : string ; + let LISTS_INDEX_FROM_START_TOOLTIP : string ; + let LISTS_INDEX_OF_FIRST : string ; + let LISTS_INDEX_OF_HELPURL : string ; + let LISTS_INDEX_OF_INPUT_IN_LIST : string ; + let LISTS_INDEX_OF_LAST : string ; + let LISTS_INDEX_OF_TOOLTIP : string ; + let LISTS_INLIST : string ; + let LISTS_ISEMPTY_HELPURL : string ; + let LISTS_ISEMPTY_TITLE : string ; + let LISTS_ISEMPTY_TOOLTIP : string ; + let LISTS_LENGTH_HELPURL : string ; + let LISTS_LENGTH_TITLE : string ; + let LISTS_LENGTH_TOOLTIP : string ; + let LISTS_REPEAT_HELPURL : string ; + let LISTS_REPEAT_TITLE : string ; + let LISTS_REPEAT_TOOLTIP : string ; + let LISTS_REVERSE_HELPURL : string ; + let LISTS_REVERSE_MESSAGE0 : string ; + let LISTS_REVERSE_TOOLTIP : string ; + let LISTS_SET_INDEX_HELPURL : string ; + let LISTS_SET_INDEX_INPUT_IN_LIST : string ; + let LISTS_SET_INDEX_INPUT_TO : string ; + let LISTS_SET_INDEX_INSERT : string ; + let LISTS_SET_INDEX_SET : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_FROM : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_LAST : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_FIRST : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_FROM : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_LAST : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_RANDOM : string ; + let LISTS_SORT_HELPURL : string ; + let LISTS_SORT_ORDER_ASCENDING : string ; + let LISTS_SORT_ORDER_DESCENDING : string ; + let LISTS_SORT_TITLE : string ; + let LISTS_SORT_TOOLTIP : string ; + let LISTS_SORT_TYPE_IGNORECASE : string ; + let LISTS_SORT_TYPE_NUMERIC : string ; + let LISTS_SORT_TYPE_TEXT : string ; + let LISTS_SPLIT_HELPURL : string ; + let LISTS_SPLIT_LIST_FROM_TEXT : string ; + let LISTS_SPLIT_TEXT_FROM_LIST : string ; + let LISTS_SPLIT_TOOLTIP_JOIN : string ; + let LISTS_SPLIT_TOOLTIP_SPLIT : string ; + let LISTS_SPLIT_WITH_DELIMITER : string ; + let LOGIC_BOOLEAN_FALSE : string ; + let LOGIC_BOOLEAN_HELPURL : string ; + let LOGIC_BOOLEAN_TOOLTIP : string ; + let LOGIC_BOOLEAN_TRUE : string ; + let LOGIC_COMPARE_HELPURL : string ; + let LOGIC_COMPARE_TOOLTIP_EQ : string ; + let LOGIC_COMPARE_TOOLTIP_GT : string ; + let LOGIC_COMPARE_TOOLTIP_GTE : string ; + let LOGIC_COMPARE_TOOLTIP_LT : string ; + let LOGIC_COMPARE_TOOLTIP_LTE : string ; + let LOGIC_COMPARE_TOOLTIP_NEQ : string ; + let LOGIC_HUE : string ; + let LOGIC_NEGATE_HELPURL : string ; + let LOGIC_NEGATE_TITLE : string ; + let LOGIC_NEGATE_TOOLTIP : string ; + let LOGIC_NULL : string ; + let LOGIC_NULL_HELPURL : string ; + let LOGIC_NULL_TOOLTIP : string ; + let LOGIC_OPERATION_AND : string ; + let LOGIC_OPERATION_HELPURL : string ; + let LOGIC_OPERATION_OR : string ; + let LOGIC_OPERATION_TOOLTIP_AND : string ; + let LOGIC_OPERATION_TOOLTIP_OR : string ; + let LOGIC_TERNARY_CONDITION : string ; + let LOGIC_TERNARY_HELPURL : string ; + let LOGIC_TERNARY_IF_FALSE : string ; + let LOGIC_TERNARY_IF_TRUE : string ; + let LOGIC_TERNARY_TOOLTIP : string ; + let LOOPS_HUE : string ; + let MATH_ADDITION_SYMBOL : string ; + let MATH_ARITHMETIC_HELPURL : string ; + let MATH_ARITHMETIC_TOOLTIP_ADD : string ; + let MATH_ARITHMETIC_TOOLTIP_DIVIDE : string ; + let MATH_ARITHMETIC_TOOLTIP_MINUS : string ; + let MATH_ARITHMETIC_TOOLTIP_MULTIPLY : string ; + let MATH_ARITHMETIC_TOOLTIP_POWER : string ; + let MATH_ATAN2_HELPURL : string ; + let MATH_ATAN2_TITLE : string ; + let MATH_ATAN2_TOOLTIP : string ; + let MATH_CHANGE_HELPURL : string ; + let MATH_CHANGE_TITLE : string ; + let MATH_CHANGE_TITLE_ITEM : string ; + let MATH_CHANGE_TOOLTIP : string ; + let MATH_CONSTANT_HELPURL : string ; + let MATH_CONSTANT_TOOLTIP : string ; + let MATH_CONSTRAIN_HELPURL : string ; + let MATH_CONSTRAIN_TITLE : string ; + let MATH_CONSTRAIN_TOOLTIP : string ; + let MATH_DIVISION_SYMBOL : string ; + let MATH_HUE : string ; + let MATH_IS_DIVISIBLE_BY : string ; + let MATH_IS_EVEN : string ; + let MATH_IS_NEGATIVE : string ; + let MATH_IS_ODD : string ; + let MATH_IS_POSITIVE : string ; + let MATH_IS_PRIME : string ; + let MATH_IS_TOOLTIP : string ; + let MATH_IS_WHOLE : string ; + let MATH_MODULO_HELPURL : string ; + let MATH_MODULO_TITLE : string ; + let MATH_MODULO_TOOLTIP : string ; + let MATH_MULTIPLICATION_SYMBOL : string ; + let MATH_NUMBER_HELPURL : string ; + let MATH_NUMBER_TOOLTIP : string ; + let MATH_ONLIST_HELPURL : string ; + let MATH_ONLIST_OPERATOR_AVERAGE : string ; + let MATH_ONLIST_OPERATOR_MAX : string ; + let MATH_ONLIST_OPERATOR_MEDIAN : string ; + let MATH_ONLIST_OPERATOR_MIN : string ; + let MATH_ONLIST_OPERATOR_MODE : string ; + let MATH_ONLIST_OPERATOR_RANDOM : string ; + let MATH_ONLIST_OPERATOR_STD_DEV : string ; + let MATH_ONLIST_OPERATOR_SUM : string ; + let MATH_ONLIST_TOOLTIP_AVERAGE : string ; + let MATH_ONLIST_TOOLTIP_MAX : string ; + let MATH_ONLIST_TOOLTIP_MEDIAN : string ; + let MATH_ONLIST_TOOLTIP_MIN : string ; + let MATH_ONLIST_TOOLTIP_MODE : string ; + let MATH_ONLIST_TOOLTIP_RANDOM : string ; + let MATH_ONLIST_TOOLTIP_STD_DEV : string ; + let MATH_ONLIST_TOOLTIP_SUM : string ; + let MATH_POWER_SYMBOL : string ; + let MATH_RANDOM_FLOAT_HELPURL : string ; + let MATH_RANDOM_FLOAT_TITLE_RANDOM : string ; + let MATH_RANDOM_FLOAT_TOOLTIP : string ; + let MATH_RANDOM_INT_HELPURL : string ; + let MATH_RANDOM_INT_TITLE : string ; + let MATH_RANDOM_INT_TOOLTIP : string ; + let MATH_ROUND_HELPURL : string ; + let MATH_ROUND_OPERATOR_ROUND : string ; + let MATH_ROUND_OPERATOR_ROUNDDOWN : string ; + let MATH_ROUND_OPERATOR_ROUNDUP : string ; + let MATH_ROUND_TOOLTIP : string ; + let MATH_SINGLE_HELPURL : string ; + let MATH_SINGLE_OP_ABSOLUTE : string ; + let MATH_SINGLE_OP_ROOT : string ; + let MATH_SINGLE_TOOLTIP_ABS : string ; + let MATH_SINGLE_TOOLTIP_EXP : string ; + let MATH_SINGLE_TOOLTIP_LN : string ; + let MATH_SINGLE_TOOLTIP_LOG10 : string ; + let MATH_SINGLE_TOOLTIP_NEG : string ; + let MATH_SINGLE_TOOLTIP_POW10 : string ; + let MATH_SINGLE_TOOLTIP_ROOT : string ; + let MATH_SUBTRACTION_SYMBOL : string ; + let MATH_TRIG_ACOS : string ; + let MATH_TRIG_ASIN : string ; + let MATH_TRIG_ATAN : string ; + let MATH_TRIG_COS : string ; + let MATH_TRIG_HELPURL : string ; + let MATH_TRIG_SIN : string ; + let MATH_TRIG_TAN : string ; + let MATH_TRIG_TOOLTIP_ACOS : string ; + let MATH_TRIG_TOOLTIP_ASIN : string ; + let MATH_TRIG_TOOLTIP_ATAN : string ; + let MATH_TRIG_TOOLTIP_COS : string ; + let MATH_TRIG_TOOLTIP_SIN : string ; + let MATH_TRIG_TOOLTIP_TAN : string ; + let NEW_COLOUR_VARIABLE : string ; + let NEW_NUMBER_VARIABLE : string ; + let NEW_STRING_VARIABLE : string ; + let NEW_VARIABLE : string ; + let NEW_VARIABLE_TITLE : string ; + let NEW_VARIABLE_TYPE_TITLE : string ; + let ORDINAL_NUMBER_SUFFIX : string ; + let PROCEDURES_ALLOW_STATEMENTS : string ; + let PROCEDURES_BEFORE_PARAMS : string ; + let PROCEDURES_CALLNORETURN_HELPURL : string ; + let PROCEDURES_CALLNORETURN_TOOLTIP : string ; + let PROCEDURES_CALLRETURN_HELPURL : string ; + let PROCEDURES_CALLRETURN_TOOLTIP : string ; + let PROCEDURES_CALL_BEFORE_PARAMS : string ; + let PROCEDURES_CREATE_DO : string ; + let PROCEDURES_DEFNORETURN_COMMENT : string ; + let PROCEDURES_DEFNORETURN_DO : string ; + let PROCEDURES_DEFNORETURN_HELPURL : string ; + let PROCEDURES_DEFNORETURN_PROCEDURE : string ; + let PROCEDURES_DEFNORETURN_TITLE : string ; + let PROCEDURES_DEFNORETURN_TOOLTIP : string ; + let PROCEDURES_DEFRETURN_COMMENT : string ; + let PROCEDURES_DEFRETURN_DO : string ; + let PROCEDURES_DEFRETURN_HELPURL : string ; + let PROCEDURES_DEFRETURN_PROCEDURE : string ; + let PROCEDURES_DEFRETURN_RETURN : string ; + let PROCEDURES_DEFRETURN_TITLE : string ; + let PROCEDURES_DEFRETURN_TOOLTIP : string ; + let PROCEDURES_DEF_DUPLICATE_WARNING : string ; + let PROCEDURES_HIGHLIGHT_DEF : string ; + let PROCEDURES_HUE : string ; + let PROCEDURES_IFRETURN_HELPURL : string ; + let PROCEDURES_IFRETURN_TOOLTIP : string ; + let PROCEDURES_IFRETURN_WARNING : string ; + let PROCEDURES_MUTATORARG_TITLE : string ; + let PROCEDURES_MUTATORARG_TOOLTIP : string ; + let PROCEDURES_MUTATORCONTAINER_TITLE : string ; + let PROCEDURES_MUTATORCONTAINER_TOOLTIP : string ; + let REDO : string ; + let REMOVE_COMMENT : string ; + let RENAME_VARIABLE : string ; + let RENAME_VARIABLE_TITLE : string ; + let TEXTS_HUE : string ; + let TEXT_APPEND_HELPURL : string ; + let TEXT_APPEND_TITLE : string ; + let TEXT_APPEND_TOOLTIP : string ; + let TEXT_APPEND_VARIABLE : string ; + let TEXT_CHANGECASE_HELPURL : string ; + let TEXT_CHANGECASE_OPERATOR_LOWERCASE : string ; + let TEXT_CHANGECASE_OPERATOR_TITLECASE : string ; + let TEXT_CHANGECASE_OPERATOR_UPPERCASE : string ; + let TEXT_CHANGECASE_TOOLTIP : string ; + let TEXT_CHARAT_FIRST : string ; + let TEXT_CHARAT_FROM_END : string ; + let TEXT_CHARAT_FROM_START : string ; + let TEXT_CHARAT_HELPURL : string ; + let TEXT_CHARAT_LAST : string ; + let TEXT_CHARAT_RANDOM : string ; + let TEXT_CHARAT_TAIL : string ; + let TEXT_CHARAT_TITLE : string ; + let TEXT_CHARAT_TOOLTIP : string ; + let TEXT_COUNT_HELPURL : string ; + let TEXT_COUNT_MESSAGE0 : string ; + let TEXT_COUNT_TOOLTIP : string ; + let TEXT_CREATE_JOIN_ITEM_TITLE_ITEM : string ; + let TEXT_CREATE_JOIN_ITEM_TOOLTIP : string ; + let TEXT_CREATE_JOIN_TITLE_JOIN : string ; + let TEXT_CREATE_JOIN_TOOLTIP : string ; + let TEXT_GET_SUBSTRING_END_FROM_END : string ; + let TEXT_GET_SUBSTRING_END_FROM_START : string ; + let TEXT_GET_SUBSTRING_END_LAST : string ; + let TEXT_GET_SUBSTRING_HELPURL : string ; + let TEXT_GET_SUBSTRING_INPUT_IN_TEXT : string ; + let TEXT_GET_SUBSTRING_START_FIRST : string ; + let TEXT_GET_SUBSTRING_START_FROM_END : string ; + let TEXT_GET_SUBSTRING_START_FROM_START : string ; + let TEXT_GET_SUBSTRING_TAIL : string ; + let TEXT_GET_SUBSTRING_TOOLTIP : string ; + let TEXT_INDEXOF_HELPURL : string ; + let TEXT_INDEXOF_OPERATOR_FIRST : string ; + let TEXT_INDEXOF_OPERATOR_LAST : string ; + let TEXT_INDEXOF_TITLE : string ; + let TEXT_INDEXOF_TOOLTIP : string ; + let TEXT_ISEMPTY_HELPURL : string ; + let TEXT_ISEMPTY_TITLE : string ; + let TEXT_ISEMPTY_TOOLTIP : string ; + let TEXT_JOIN_HELPURL : string ; + let TEXT_JOIN_TITLE_CREATEWITH : string ; + let TEXT_JOIN_TOOLTIP : string ; + let TEXT_LENGTH_HELPURL : string ; + let TEXT_LENGTH_TITLE : string ; + let TEXT_LENGTH_TOOLTIP : string ; + let TEXT_PRINT_HELPURL : string ; + let TEXT_PRINT_TITLE : string ; + let TEXT_PRINT_TOOLTIP : string ; + let TEXT_PROMPT_HELPURL : string ; + let TEXT_PROMPT_TOOLTIP_NUMBER : string ; + let TEXT_PROMPT_TOOLTIP_TEXT : string ; + let TEXT_PROMPT_TYPE_NUMBER : string ; + let TEXT_PROMPT_TYPE_TEXT : string ; + let TEXT_REPLACE_HELPURL : string ; + let TEXT_REPLACE_MESSAGE0 : string ; + let TEXT_REPLACE_TOOLTIP : string ; + let TEXT_REVERSE_HELPURL : string ; + let TEXT_REVERSE_MESSAGE0 : string ; + let TEXT_REVERSE_TOOLTIP : string ; + let TEXT_TEXT_HELPURL : string ; + let TEXT_TEXT_TOOLTIP : string ; + let TEXT_TRIM_HELPURL : string ; + let TEXT_TRIM_OPERATOR_BOTH : string ; + let TEXT_TRIM_OPERATOR_LEFT : string ; + let TEXT_TRIM_OPERATOR_RIGHT : string ; + let TEXT_TRIM_TOOLTIP : string ; + let TODAY : string ; + let UNDO : string ; + let UNNAMED_KEY : string ; + let VARIABLES_DEFAULT_NAME : string ; + let VARIABLES_DYNAMIC_HUE : string ; + let VARIABLES_GET_CREATE_SET : string ; + let VARIABLES_GET_HELPURL : string ; + let VARIABLES_GET_TOOLTIP : string ; + let VARIABLES_HUE : string ; + let VARIABLES_SET : string ; + let VARIABLES_SET_CREATE_GET : string ; + let VARIABLES_SET_HELPURL : string ; + let VARIABLES_SET_TOOLTIP : string ; + let VARIABLE_ALREADY_EXISTS : string ; + let VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE : string ; + let WORKSPACE_ARIA_LABEL : string ; + let WORKSPACE_COMMENT_DEFAULT_TEXT : string ; +} + diff --git a/static/js/dist/msg/nb.d.ts b/static/js/dist/msg/nb.d.ts new file mode 100644 index 0000000..42aaa1b --- /dev/null +++ b/static/js/dist/msg/nb.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly nb locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/nb.js b/static/js/dist/msg/nb.js new file mode 100644 index 0000000..ca37e51 --- /dev/null +++ b/static/js/dist/msg/nb.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/nl.d.ts b/static/js/dist/msg/nl.d.ts new file mode 100644 index 0000000..5d383fb --- /dev/null +++ b/static/js/dist/msg/nl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly nl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/nl.js b/static/js/dist/msg/nl.js new file mode 100644 index 0000000..a15cb1e --- /dev/null +++ b/static/js/dist/msg/nl.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/oc.d.ts b/static/js/dist/msg/oc.d.ts new file mode 100644 index 0000000..f8eabb7 --- /dev/null +++ b/static/js/dist/msg/oc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly oc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/oc.js b/static/js/dist/msg/oc.js new file mode 100644 index 0000000..e00d25a --- /dev/null +++ b/static/js/dist/msg/oc.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/pl.d.ts b/static/js/dist/msg/pl.d.ts new file mode 100644 index 0000000..957f382 --- /dev/null +++ b/static/js/dist/msg/pl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/pl.js b/static/js/dist/msg/pl.js new file mode 100644 index 0000000..896a018 --- /dev/null +++ b/static/js/dist/msg/pl.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "Zwinięte bloki zawierają ostrzeżenia."; +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"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Zwraca arcus tangens punktu (X, Y) w stopniach od -180 do 180."; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/pms.d.ts b/static/js/dist/msg/pms.d.ts new file mode 100644 index 0000000..35df33e --- /dev/null +++ b/static/js/dist/msg/pms.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pms locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/pms.js b/static/js/dist/msg/pms.js new file mode 100644 index 0000000..9752297 --- /dev/null +++ b/static/js/dist/msg/pms.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/pt-br.d.ts b/static/js/dist/msg/pt-br.d.ts new file mode 100644 index 0000000..065d639 --- /dev/null +++ b/static/js/dist/msg/pt-br.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pt-br locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/pt-br.js b/static/js/dist/msg/pt-br.js new file mode 100644 index 0000000..6bf07ae --- /dev/null +++ b/static/js/dist/msg/pt-br.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/pt.d.ts b/static/js/dist/msg/pt.d.ts new file mode 100644 index 0000000..f89879c --- /dev/null +++ b/static/js/dist/msg/pt.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pt locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/pt.js b/static/js/dist/msg/pt.js new file mode 100644 index 0000000..1f7c5a3 --- /dev/null +++ b/static/js/dist/msg/pt.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/qqq.d.ts b/static/js/dist/msg/qqq.d.ts new file mode 100644 index 0000000..4c58a60 --- /dev/null +++ b/static/js/dist/msg/qqq.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly qqq locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ro.d.ts b/static/js/dist/msg/ro.d.ts new file mode 100644 index 0000000..f2183fa --- /dev/null +++ b/static/js/dist/msg/ro.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ro locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ro.js b/static/js/dist/msg/ro.js new file mode 100644 index 0000000..47e8665 --- /dev/null +++ b/static/js/dist/msg/ro.js @@ -0,0 +1,448 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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["DATASET_HUE"] = "500"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ru.d.ts b/static/js/dist/msg/ru.d.ts new file mode 100644 index 0000000..95ffc83 --- /dev/null +++ b/static/js/dist/msg/ru.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ru locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ru.js b/static/js/dist/msg/ru.js new file mode 100644 index 0000000..9f20daa --- /dev/null +++ b/static/js/dist/msg/ru.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sc.d.ts b/static/js/dist/msg/sc.d.ts new file mode 100644 index 0000000..2d5afcb --- /dev/null +++ b/static/js/dist/msg/sc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sc.js b/static/js/dist/msg/sc.js new file mode 100644 index 0000000..6e0ad72 --- /dev/null +++ b/static/js/dist/msg/sc.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sd.d.ts b/static/js/dist/msg/sd.d.ts new file mode 100644 index 0000000..cafc978 --- /dev/null +++ b/static/js/dist/msg/sd.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sd locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sd.js b/static/js/dist/msg/sd.js new file mode 100644 index 0000000..c33843e --- /dev/null +++ b/static/js/dist/msg/sd.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/shn.d.ts b/static/js/dist/msg/shn.d.ts new file mode 100644 index 0000000..07a5313 --- /dev/null +++ b/static/js/dist/msg/shn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly shn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/shn.js b/static/js/dist/msg/shn.js new file mode 100644 index 0000000..f13ade6 --- /dev/null +++ b/static/js/dist/msg/shn.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sk.d.ts b/static/js/dist/msg/sk.d.ts new file mode 100644 index 0000000..3c26e48 --- /dev/null +++ b/static/js/dist/msg/sk.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sk locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sk.js b/static/js/dist/msg/sk.js new file mode 100644 index 0000000..9dbde85 --- /dev/null +++ b/static/js/dist/msg/sk.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/skr-arab.d.ts b/static/js/dist/msg/skr-arab.d.ts new file mode 100644 index 0000000..4ddb30f --- /dev/null +++ b/static/js/dist/msg/skr-arab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly skr-arab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/skr-arab.js b/static/js/dist/msg/skr-arab.js new file mode 100644 index 0000000..82b4307 --- /dev/null +++ b/static/js/dist/msg/skr-arab.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sl.d.ts b/static/js/dist/msg/sl.d.ts new file mode 100644 index 0000000..51f1f56 --- /dev/null +++ b/static/js/dist/msg/sl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sl.js b/static/js/dist/msg/sl.js new file mode 100644 index 0000000..86a7271 --- /dev/null +++ b/static/js/dist/msg/sl.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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 tabeli %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Za vsak element v tabeli, 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"] = "Vsebuje delčke"; +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 prazno tabelo"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Vrne tabelo dolžine 0, ki ne vsebuje nobenih elementov."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "tabela"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Doda, odstrani ali spremeni vrstni red elementov tabele."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "ustvari tabelo iz"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Doda element v tabelo."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ustvari tabelo 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 tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Vrne element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Vrne zadnji element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Vrne naključni element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Odstrani in vrne prvi element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Odstrani in vrne element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Odstrani in vrne zadnji element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Odstrani in vrne naključni element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Odstrani prvi element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Odstrani element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Odstrani zadnji element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Odstrani naključni element tabele."; +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 novo tabelo, kot kopijo določenega dela tabele."; +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 tabeli. Če elementa ne najde, vrne %1."; +Blockly.Msg["LISTS_INLIST"] = "v tabeli"; +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 tabela prazna."; +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 tabele."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ustvari tabelo iz elementa %1, ki se ponovi %2 krat"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Ustvari tabelo iz danega elementa, ki se poljubno mnogokrat 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 tabele."; +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 tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Vstavi element na določeno mesto v tabeli."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Doda element na konec tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Vstavi element na naključno mesto v tabeli."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastavi prvi element tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastavi element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Nastavi zadnji element tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Nastavi naključni element tabele."; +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 tabele."; +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 tabelo iz besedila"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "ustvari besedilo iz tabele"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Združi tabelo besedil v eno besedilo, ločeno z ločilom."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Razdruži besedilo v tabelo 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 tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksimum tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimum tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modus tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "naključni element tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standardni odklon tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "vsota tabele"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Vrne povprečje (aritmetično sredino) števil v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Vrne največje število v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Vrne mediano števil v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Vrne najmanjše število v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vrne seznam najpogostejšega elementa(-ov) v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vrne naključno število izmed števil v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vrne standardni odklon elementov v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vrne vsoto vseh števil v tabeli."; +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"] = "vsebuje delčke"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sq.d.ts b/static/js/dist/msg/sq.d.ts new file mode 100644 index 0000000..e7997e2 --- /dev/null +++ b/static/js/dist/msg/sq.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sq locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sq.js b/static/js/dist/msg/sq.js new file mode 100644 index 0000000..b236dc4 --- /dev/null +++ b/static/js/dist/msg/sq.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sr-latn.d.ts b/static/js/dist/msg/sr-latn.d.ts new file mode 100644 index 0000000..f9bf064 --- /dev/null +++ b/static/js/dist/msg/sr-latn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sr-latn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sr-latn.js b/static/js/dist/msg/sr-latn.js new file mode 100644 index 0000000..4e407c4 --- /dev/null +++ b/static/js/dist/msg/sr-latn.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sr.d.ts b/static/js/dist/msg/sr.d.ts new file mode 100644 index 0000000..7d6ea16 --- /dev/null +++ b/static/js/dist/msg/sr.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sr locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sr.js b/static/js/dist/msg/sr.js new file mode 100644 index 0000000..ca2c93c --- /dev/null +++ b/static/js/dist/msg/sr.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/sv.d.ts b/static/js/dist/msg/sv.d.ts new file mode 100644 index 0000000..11018f2 --- /dev/null +++ b/static/js/dist/msg/sv.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sv locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/sv.js b/static/js/dist/msg/sv.js new file mode 100644 index 0000000..1fb7b76 --- /dev/null +++ b/static/js/dist/msg/sv.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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://sv.wikipedia.org/wiki/Modulär_aritmetik"; +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 namnet \"%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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/synonyms.d.ts b/static/js/dist/msg/synonyms.d.ts new file mode 100644 index 0000000..93e2197 --- /dev/null +++ b/static/js/dist/msg/synonyms.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly synonyms locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ta.d.ts b/static/js/dist/msg/ta.d.ts new file mode 100644 index 0000000..d74bd3c --- /dev/null +++ b/static/js/dist/msg/ta.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ta locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ta.js b/static/js/dist/msg/ta.js new file mode 100644 index 0000000..d045595 --- /dev/null +++ b/static/js/dist/msg/ta.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "இரத்து செய்"; +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"] = "+ மாறிலியினை சேர்"; +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"] = "காலி பட்டியல் பின்கொடு."; +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"] = "ஏறுவரிசை"; +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"] = "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"] = "உரையில் இருந்து பட்டியல் உருவாக்கு"; +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"] = "புதிய மாறிலியின் பெயர்:"; +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"] = "மீண்டும் செய்"; +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"] = "மீளமை"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/tcy.d.ts b/static/js/dist/msg/tcy.d.ts new file mode 100644 index 0000000..6427835 --- /dev/null +++ b/static/js/dist/msg/tcy.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tcy locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/tcy.js b/static/js/dist/msg/tcy.js new file mode 100644 index 0000000..71913f8 --- /dev/null +++ b/static/js/dist/msg/tcy.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/te.d.ts b/static/js/dist/msg/te.d.ts new file mode 100644 index 0000000..c7acfb0 --- /dev/null +++ b/static/js/dist/msg/te.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly te locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/te.js b/static/js/dist/msg/te.js new file mode 100644 index 0000000..e7d214b --- /dev/null +++ b/static/js/dist/msg/te.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/th.d.ts b/static/js/dist/msg/th.d.ts new file mode 100644 index 0000000..bf77eae --- /dev/null +++ b/static/js/dist/msg/th.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly th locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/th.js b/static/js/dist/msg/th.js new file mode 100644 index 0000000..2493dcd --- /dev/null +++ b/static/js/dist/msg/th.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +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://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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/tl.d.ts b/static/js/dist/msg/tl.d.ts new file mode 100644 index 0000000..0d51a38 --- /dev/null +++ b/static/js/dist/msg/tl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/tl.js b/static/js/dist/msg/tl.js new file mode 100644 index 0000000..53f1296 --- /dev/null +++ b/static/js/dist/msg/tl.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/tlh.d.ts b/static/js/dist/msg/tlh.d.ts new file mode 100644 index 0000000..5eb07eb --- /dev/null +++ b/static/js/dist/msg/tlh.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tlh locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/tlh.js b/static/js/dist/msg/tlh.js new file mode 100644 index 0000000..bd715df --- /dev/null +++ b/static/js/dist/msg/tlh.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/tr.d.ts b/static/js/dist/msg/tr.d.ts new file mode 100644 index 0000000..2b1a29a --- /dev/null +++ b/static/js/dist/msg/tr.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tr locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/tr.js b/static/js/dist/msg/tr.js new file mode 100644 index 0000000..d09a49f --- /dev/null +++ b/static/js/dist/msg/tr.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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 yalnızca 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://tr.wikipedia.org/wiki/Sıfırlanabilir_tip"; +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://tr.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"; +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/Sayı"; +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://tr.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://tr.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"] = "-"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ug-arab.d.ts b/static/js/dist/msg/ug-arab.d.ts new file mode 100644 index 0000000..f9445a5 --- /dev/null +++ b/static/js/dist/msg/ug-arab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ug-arab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ug-arab.js b/static/js/dist/msg/ug-arab.js new file mode 100644 index 0000000..0c88d56 --- /dev/null +++ b/static/js/dist/msg/ug-arab.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/uk.d.ts b/static/js/dist/msg/uk.d.ts new file mode 100644 index 0000000..1250e6c --- /dev/null +++ b/static/js/dist/msg/uk.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly uk locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/uk.js b/static/js/dist/msg/uk.js new file mode 100644 index 0000000..fab658c --- /dev/null +++ b/static/js/dist/msg/uk.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/ur.d.ts b/static/js/dist/msg/ur.d.ts new file mode 100644 index 0000000..b944aad --- /dev/null +++ b/static/js/dist/msg/ur.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ur locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/ur.js b/static/js/dist/msg/ur.js new file mode 100644 index 0000000..b66998b --- /dev/null +++ b/static/js/dist/msg/ur.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "نامعلوم"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/vi.d.ts b/static/js/dist/msg/vi.d.ts new file mode 100644 index 0000000..86a0e7d --- /dev/null +++ b/static/js/dist/msg/vi.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly vi locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/vi.js b/static/js/dist/msg/vi.js new file mode 100644 index 0000000..18fa023 --- /dev/null +++ b/static/js/dist/msg/vi.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "không tên"; +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"] = "Không gian làm việc Blockly"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/xmf.d.ts b/static/js/dist/msg/xmf.d.ts new file mode 100644 index 0000000..e230058 --- /dev/null +++ b/static/js/dist/msg/xmf.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly xmf locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/xmf.js b/static/js/dist/msg/xmf.js new file mode 100644 index 0000000..13b9de7 --- /dev/null +++ b/static/js/dist/msg/xmf.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"] = "კომენტარიშ დუბლირაფა"; +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"] = "ჯოხოშ უმუშო"; +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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/yo.d.ts b/static/js/dist/msg/yo.d.ts new file mode 100644 index 0000000..29120ab --- /dev/null +++ b/static/js/dist/msg/yo.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly yo locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/yo.js b/static/js/dist/msg/yo.js new file mode 100644 index 0000000..ce5a435 --- /dev/null +++ b/static/js/dist/msg/yo.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/zgh.d.ts b/static/js/dist/msg/zgh.d.ts new file mode 100644 index 0000000..be1d163 --- /dev/null +++ b/static/js/dist/msg/zgh.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly zgh locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/zh-hans.d.ts b/static/js/dist/msg/zh-hans.d.ts new file mode 100644 index 0000000..938f553 --- /dev/null +++ b/static/js/dist/msg/zh-hans.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly zh-hans locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/zh-hans.js b/static/js/dist/msg/zh-hans.js new file mode 100644 index 0000000..3946d0b --- /dev/null +++ b/static/js/dist/msg/zh-hans.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/msg/zh-hant.d.ts b/static/js/dist/msg/zh-hant.d.ts new file mode 100644 index 0000000..f2917aa --- /dev/null +++ b/static/js/dist/msg/zh-hant.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly zh-hant locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/dist/msg/zh-hant.js b/static/js/dist/msg/zh-hant.js new file mode 100644 index 0000000..6c094f7 --- /dev/null +++ b/static/js/dist/msg/zh-hant.js @@ -0,0 +1,447 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['../core'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('../core')); + } else { // Browser + root.Blockly.Msg = factory(root.Blockly); + } +}(this, function(Blockly) { + + var Blockly = {};Blockly.Msg={};// 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"; +return Blockly.Msg; +})); diff --git a/static/js/dist/node.js b/static/js/dist/node.js new file mode 100644 index 0000000..4fdbcda --- /dev/null +++ b/static/js/dist/node.js @@ -0,0 +1,35 @@ +/* eslint-disable */ +(function (Blockly, En, BlocklyBlocks, BlocklyJS, BlocklyPython, BlocklyPHP, BlocklyLua, BlocklyDart){ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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; +module.exports = Blockly; +})(require('./core'), require('./msg/en'), require('./blocks'), require('./javascript'), require('./python'), require('./php'), require('./lua'), require('./dart')); diff --git a/static/js/dist/package.json b/static/js/dist/package.json new file mode 100644 index 0000000..c7c4454 --- /dev/null +++ b/static/js/dist/package.json @@ -0,0 +1,63 @@ +{ + "name": "blockly", + "version": "4.20201217.0", + "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" + }, + "main": "./index.js", + "umd": "./blockly.min.js", + "unpkg": "./blockly.min.js", + "types": "./index.d.ts", + "browser": { + "./node.js": "./browser.js", + "./core.js": "./core-browser.js", + "./blockly-node.js": "./blockly.js" + }, + "license": "Apache-2.0", + "devDependencies": { + "blockly": "^3.20200123.1", + "@blockly/block-test": "^1.0.8", + "@blockly/dev-tools": "^2.0.10", + "@blockly/theme-modern": "^2.1.10", + "babel-eslint": "^10.1.0", + "chai": "^4.2.0", + "concurrently": "^5.3.0", + "eslint": "^7.6.0", + "eslint-plugin-es5": "^1.5.0", + "google-closure-compiler": "^20201102.0.1", + "google-closure-deps": "^20201102.0.1", + "gulp": "^4.0.2", + "gulp-concat": "^2.6.1", + "gulp-insert": "^0.5.0", + "gulp-rename": "^2.0.0", + "gulp-replace": "^1.0.0", + "gulp-series": "^1.0.2", + "gulp-shell": "^0.8.0", + "gulp-sourcemaps": "^3.0.0", + "gulp-umd": "^2.0.0", + "install-peers": "^1.0.3", + "js-green-licenses": "^2.0.1", + "mocha": "^8.1.1", + "rimraf": "^3.0.2", + "selenium-standalone": "^6.17.0", + "through2": "^4.0.2", + "typescript-closure-tools": "^0.0.7", + "webdriverio": "^6.5.2", + "yargs": "^16.0.3" + }, + "dependencies": { + "jsdom": "15.2.1" + } +} \ No newline at end of file diff --git a/static/js/dist/php.d.ts b/static/js/dist/php.d.ts new file mode 100644 index 0000000..75f2ef6 --- /dev/null +++ b/static/js/dist/php.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the PHP generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/dist/php.js b/static/js/dist/php.js new file mode 100644 index 0000000..8889eb8 --- /dev/null +++ b/static/js/dist/php.js @@ -0,0 +1,27 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./core', './php_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./core'), require('./php_compressed.js')); + } else { // Browser + root.BlocklyPHP = factory(root.Blockly, root.BlocklyPHP); + } +}(this, function(Blockly, BlocklyPHP) { +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview PHP Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.PHP = BlocklyPHP; + +return BlocklyPHP; +})); diff --git a/static/js/dist/php_compressed.js b/static/js/dist/php_compressed.js new file mode 100644 index 0000000..e6ba9f5 --- /dev/null +++ b/static/js/dist/php_compressed.js @@ -0,0 +1,103 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.PHP = factory(root.Blockly); + } +}(this, function(Blockly) { + '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_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.isInitialized=!1; +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_NONE)||0,c=Blockly.PHP.valueToCode(a,"GREEN",Blockly.PHP.ORDER_NONE)||0;a=Blockly.PHP.valueToCode(a,"BLUE",Blockly.PHP.ORDER_NONE)||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_NONE)||"'#000000'",c=Blockly.PHP.valueToCode(a,"COLOUR2",Blockly.PHP.ORDER_NONE)||"'#000000'";a=Blockly.PHP.valueToCode(a,"RATIO",Blockly.PHP.ORDER_NONE)||.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_NONE),c=Blockly.PHP.valueToCode(a,"DELIM",Blockly.PHP.ORDER_NONE)||"''";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_NONE)||"[]")+")",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_NONE)||"0",c=Blockly.PHP.valueToCode(a,"LOW",Blockly.PHP.ORDER_NONE)||"0";a=Blockly.PHP.valueToCode(a,"HIGH",Blockly.PHP.ORDER_NONE)||"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_NONE)||"0";a=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_NONE)||"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_NONE)||"0";return["atan2("+(Blockly.PHP.valueToCode(a,"Y",Blockly.PHP.ORDER_NONE)||"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.getVars().indexOf(c)&&b.push(Blockly.PHP.variableDB_.getName(c,Blockly.VARIABLE_CATEGORY_NAME));e=Blockly.Variables.allDeveloperVariables(d);for(f=0;f + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/dist/python.js b/static/js/dist/python.js new file mode 100644 index 0000000..b8faf86 --- /dev/null +++ b/static/js/dist/python.js @@ -0,0 +1,27 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./core', './python_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./core'), require('./python_compressed.js')); + } else { // Browser + root.BlocklyPython = factory(root.Blockly, root.BlocklyPython); + } +}(this, function(Blockly, BlocklyPython) { +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Python Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Python = BlocklyPython; + +return BlocklyPython; +})); diff --git a/static/js/dist/python_compressed.js b/static/js/dist/python_compressed.js new file mode 100644 index 0000000..dd9e02d --- /dev/null +++ b/static/js/dist/python_compressed.js @@ -0,0 +1,101 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.Python = factory(root.Blockly); + } +}(this, function(Blockly) { + 'use strict';Blockly.Python=new Blockly.Generator("Python");Blockly.Python.addReservedWords("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,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,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"); +Blockly.Python.ORDER_ATOMIC=0;Blockly.Python.ORDER_COLLECTION=1;Blockly.Python.ORDER_STRING_CONVERSION=1;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;Blockly.Python.ORDER_LOGICAL_NOT=12;Blockly.Python.ORDER_LOGICAL_AND=13;Blockly.Python.ORDER_LOGICAL_OR=14;Blockly.Python.ORDER_CONDITIONAL=15;Blockly.Python.ORDER_LAMBDA=16;Blockly.Python.ORDER_NONE=99; +Blockly.Python.ORDER_OVERRIDES=[[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_LOGICAL_NOT,Blockly.Python.ORDER_LOGICAL_NOT],[Blockly.Python.ORDER_LOGICAL_AND,Blockly.Python.ORDER_LOGICAL_AND],[Blockly.Python.ORDER_LOGICAL_OR,Blockly.Python.ORDER_LOGICAL_OR]]; +Blockly.Python.isInitialized=!1; +Blockly.Python.init=function(a){Blockly.Python.PASS=this.INDENT+"pass\n";Blockly.Python.definitions_=Object.create(null);Blockly.Python.functionNames_=Object.create(null);Blockly.Python.variableDB_?Blockly.Python.variableDB_.reset():Blockly.Python.variableDB_=new Blockly.Names(Blockly.Python.RESERVED_WORDS_);Blockly.Python.variableDB_.setVariableMap(a.getVariableMap());for(var b=[],c=Blockly.Variables.allDeveloperVariables(a),d=0;dc?"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 n="",k=function(){return Blockly.Python.provideFunction_("upRange", +["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start <= stop:"," yield start"," start += abs(step)"])},h=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(g,l,p){return"("+g+" <= "+l+") and "+k()+"("+g+", "+l+", "+p+") or "+h()+"("+g+", "+l+", "+p+")"};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.getVars().indexOf(c)&&b.push(Blockly.Python.variableDB_.getName(c,Blockly.VARIABLE_CATEGORY_NAME));e=Blockly.Variables.allDeveloperVariables(d);for(f=0;f|!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/static/js/generators/dart.js b/static/js/generators/dart.js new file mode 100644 index 0000000..a801a06 --- /dev/null +++ b/static/js/generators/dart.js @@ -0,0 +1,296 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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://dart.dev/guides/language/language-tour#operators + */ +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; // (...) + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.Dart.isInitialized = false; + +/** + * 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(', ') + ';'; + } + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +Blockly.Dart.multiline_quote_ = function (string) { + var lines = string.split(/\n/g).map(Blockly.Dart.quote_); + // Join with the following, plus a newline: + // + '\n' + + return lines.join(' + \'\\n\' + \n'); +}; + +/** + * 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. + * @protected + */ +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/static/js/generators/dart/colour.js b/static/js/generators/dart/colour.js new file mode 100644 index 0000000..b40fac7 --- /dev/null +++ b/static/js/generators/dart/colour.js @@ -0,0 +1,114 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/dart/lists.js b/static/js/generators/dart/lists.js new file mode 100644 index 0000000..bfd6e93 --- /dev/null +++ b/static/js/generators/dart/lists.js @@ -0,0 +1,447 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/dart/logic.js b/static/js/generators/dart/logic.js new file mode 100644 index 0000000..035ffbd --- /dev/null +++ b/static/js/generators/dart/logic.js @@ -0,0 +1,127 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/dart/loops.js b/static/js/generators/dart/loops.js new file mode 100644 index 0000000..4ab38ca --- /dev/null +++ b/static/js/generators/dart/loops.js @@ -0,0 +1,169 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/dart/math.js b/static/js/generators/dart/math.js new file mode 100644 index 0000000..251047f --- /dev/null +++ b/static/js/generators/dart/math.js @@ -0,0 +1,485 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/dart/procedures.js b/static/js/generators/dart/procedures.js new file mode 100644 index 0000000..123685f --- /dev/null +++ b/static/js/generators/dart/procedures.js @@ -0,0 +1,111 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.Dart.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.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/static/js/generators/dart/text.js b/static/js/generators/dart/text.js new file mode 100644 index 0000000..65c5d62 --- /dev/null +++ b/static/js/generators/dart/text.js @@ -0,0 +1,343 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('+') != -1 ? Blockly.Dart.ORDER_ADDITIVE : + Blockly.Dart.ORDER_ATOMIC; + return [code, order]; +}; + +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 textOrder = (where == 'FIRST' || where == 'FROM_START') ? + Blockly.Dart.ORDER_UNARY_POSTFIX : Blockly.Dart.ORDER_NONE; + var text = Blockly.Dart.valueToCode(block, 'VALUE', textOrder) || '\'\''; + 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 where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var requiresLengthCall = (where1 != 'FROM_END' && where2 == 'FROM_START'); + var textOrder = requiresLengthCall ? Blockly.Dart.ORDER_UNARY_POSTFIX : + Blockly.Dart.ORDER_NONE; + var text = Blockly.Dart.valueToCode(block, 'STRING', textOrder) || '\'\''; + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + return [code, Blockly.Dart.ORDER_NONE]; + } else if (text.match(/^'?\w+'?$/) || requiresLengthCall) { + // 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_NONE) || '\'\''; + 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)'; + return [code, Blockly.Dart.ORDER_UNARY_PREFIX]; +}; diff --git a/static/js/generators/dart/variables.js b/static/js/generators/dart/variables.js new file mode 100644 index 0000000..2fe0a9e --- /dev/null +++ b/static/js/generators/dart/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2014 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/dart/variables_dynamic.js b/static/js/generators/dart/variables_dynamic.js new file mode 100644 index 0000000..7e4d791 --- /dev/null +++ b/static/js/generators/dart/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/javascript.js b/static/js/generators/javascript.js new file mode 100644 index 0000000..368a35a --- /dev/null +++ b/static/js/generators/javascript.js @@ -0,0 +1,324 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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] +]; + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.JavaScript.isInitialized = false; + +/** + * 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(', ') + ';'; + } + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +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. + * @protected + */ +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/static/js/generators/javascript/colour.js b/static/js/generators/javascript/colour.js new file mode 100644 index 0000000..248a9cb --- /dev/null +++ b/static/js/generators/javascript/colour.js @@ -0,0 +1,89 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || 0; + var green = Blockly.JavaScript.valueToCode(block, 'GREEN', + Blockly.JavaScript.ORDER_NONE) || 0; + var blue = Blockly.JavaScript.valueToCode(block, 'BLUE', + Blockly.JavaScript.ORDER_NONE) || 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_NONE) || '\'#000000\''; + var c2 = Blockly.JavaScript.valueToCode(block, 'COLOUR2', + Blockly.JavaScript.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.JavaScript.valueToCode(block, 'RATIO', + Blockly.JavaScript.ORDER_NONE) || 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/static/js/generators/javascript/lists.js b/static/js/generators/javascript/lists.js new file mode 100644 index 0000000..0311ad7 --- /dev/null +++ b/static/js/generators/javascript/lists.js @@ -0,0 +1,388 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || '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_NONE) || 'null'; + var repeatCount = Blockly.JavaScript.valueToCode(block, 'NUM', + Blockly.JavaScript.ORDER_NONE) || '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_NONE : + 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/static/js/generators/javascript/logic.js b/static/js/generators/javascript/logic.js new file mode 100644 index 0000000..de7b420 --- /dev/null +++ b/static/js/generators/javascript/logic.js @@ -0,0 +1,129 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/javascript/loops.js b/static/js/generators/javascript/loops.js new file mode 100644 index 0000000..595906f --- /dev/null +++ b/static/js/generators/javascript/loops.js @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/javascript/math.js b/static/js/generators/javascript/math.js new file mode 100644 index 0000000..2420a5a --- /dev/null +++ b/static/js/generators/javascript/math.js @@ -0,0 +1,409 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE] // 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_NONE) || '[]'; + code = 'Math.min.apply(null, ' + list + ')'; + break; + case 'MAX': + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_NONE) || '[]'; + 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_NONE) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'LOW', + Blockly.JavaScript.ORDER_NONE) || '0'; + var argument2 = Blockly.JavaScript.valueToCode(block, 'HIGH', + Blockly.JavaScript.ORDER_NONE) || '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_NONE) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', + Blockly.JavaScript.ORDER_NONE) || '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_NONE) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'Y', + Blockly.JavaScript.ORDER_NONE) || '0'; + return ['Math.atan2(' + argument1 + ', ' + argument0 + ') / Math.PI * 180', + Blockly.JavaScript.ORDER_DIVISION]; +}; diff --git a/static/js/generators/javascript/procedures.js b/static/js/generators/javascript/procedures.js new file mode 100644 index 0000000..9d4cc4a --- /dev/null +++ b/static/js/generators/javascript/procedures.js @@ -0,0 +1,113 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.JavaScript.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.JavaScript.valueToCode(block, 'ARG' + i, + Blockly.JavaScript.ORDER_NONE) || '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/static/js/generators/javascript/text.js b/static/js/generators/javascript/text.js new file mode 100644 index 0000000..8f669d7 --- /dev/null +++ b/static/js/generators/javascript/text.js @@ -0,0 +1,372 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('+') != -1 ? Blockly.JavaScript.ORDER_ADDITION : + Blockly.JavaScript.ORDER_ATOMIC; + return [code, order]; +}; + +/** + * Enclose the provided value in 'String(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {[string, number]} Array containing code evaluating to a string and + * the order of the returned code. + * @private + */ +Blockly.JavaScript.text.forceString_ = function(value) { + if (Blockly.JavaScript.text.forceString_.strRegExp.test(value)) { + return [value, Blockly.JavaScript.ORDER_ATOMIC]; + } + return ['String(' + value + ')', Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +/** + * 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 codeAndOrder = Blockly.JavaScript.text.forceString_(element); + return codeAndOrder; + 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)[0] + + ' + ' + Blockly.JavaScript.text.forceString_(element1)[0]; + 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_NONE) || '\'\''; + } + 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) || '\'\''; + var code = varName + ' += ' + + Blockly.JavaScript.text.forceString_(value)[0] + ';\n'; + return code; +}; + +Blockly.JavaScript['text_length'] = function(block) { + // String or array length. + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + 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 where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var requiresLengthCall = (where1 != 'FROM_END' && where1 != 'LAST' && + where2 != 'FROM_END' && where2 != 'LAST'); + var textOrder = requiresLengthCall ? Blockly.JavaScript.ORDER_MEMBER : + Blockly.JavaScript.ORDER_NONE; + var text = Blockly.JavaScript.valueToCode(block, 'STRING', + textOrder) || '\'\''; + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + return [code, Blockly.JavaScript.ORDER_NONE]; + } else if (text.match(/^'?\w+'?$/) || requiresLengthCall) { + // 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_NONE) || '\'\''; + 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_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_replace'] = function(block) { + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + 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. + */ + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.Lua.isInitialized = false; + +/** + * 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()); + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +Blockly.Lua.multiline_quote_ = function(string) { + var lines = string.split(/\n/g).map(Blockly.Lua.quote_); + // Join with the following, plus a newline: + // .. '\n' .. + return lines.join(' .. \'\\n\' ..\n'); +}; + +/** + * 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. + * @protected + */ +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/static/js/generators/lua/colour.js b/static/js/generators/lua/colour.js new file mode 100644 index 0000000..43db10d --- /dev/null +++ b/static/js/generators/lua/colour.js @@ -0,0 +1,76 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/lua/lists.js b/static/js/generators/lua/lists.js new file mode 100644 index 0000000..5c3831a --- /dev/null +++ b/static/js/generators/lua/lists.js @@ -0,0 +1,368 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_HIGH]; +}; + +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_HIGH]; +}; + +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/static/js/generators/lua/logic.js b/static/js/generators/lua/logic.js new file mode 100644 index 0000000..cac58c6 --- /dev/null +++ b/static/js/generators/lua/logic.js @@ -0,0 +1,127 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/lua/loops.js b/static/js/generators/lua/loops.js new file mode 100644 index 0000000..be95737 --- /dev/null +++ b/static/js/generators/lua/loops.js @@ -0,0 +1,173 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/lua/math.js b/static/js/generators/lua/math.js new file mode 100644 index 0000000..23f0485 --- /dev/null +++ b/static/js/generators/lua/math.js @@ -0,0 +1,423 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/lua/procedures.js b/static/js/generators/lua/procedures.js new file mode 100644 index 0000000..156c3c7 --- /dev/null +++ b/static/js/generators/lua/procedures.js @@ -0,0 +1,113 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.Lua.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.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/static/js/generators/lua/text.js b/static/js/generators/lua/text.js new file mode 100644 index 0000000..12ceefe --- /dev/null +++ b/static/js/generators/lua/text.js @@ -0,0 +1,355 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('..') != -1 ? Blockly.Lua.ORDER_CONCATENATION : + Blockly.Lua.ORDER_ATOMIC; + return [code, order]; +}; + +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_NONE) || '\'\''; + var code = 'string.reverse(' + text + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/static/js/generators/lua/variables.js b/static/js/generators/lua/variables.js new file mode 100644 index 0000000..9249a43 --- /dev/null +++ b/static/js/generators/lua/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2016 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/lua/variables_dynamic.js b/static/js/generators/lua/variables_dynamic.js new file mode 100644 index 0000000..ac4456d --- /dev/null +++ b/static/js/generators/lua/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/php.js b/static/js/generators/php.js new file mode 100644 index 0000000..326cc8e --- /dev/null +++ b/static/js/generators/php.js @@ -0,0 +1,324 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_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] +]; + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.PHP.isInitialized = false; + +/** + * 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'); + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +Blockly.PHP.multiline_quote_ = function (string) { + var lines = string.split(/\n/g).map(Blockly.PHP.quote_); + // Join with the following, plus a newline: + // . "\n" . + // Newline escaping only works in double-quoted strings. + return lines.join(' . \"\\n\" .\n'); +}; + +/** + * Common tasks for generating PHP from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The PHP code created for this block. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} PHP code with comments and subsequent blocks added. + * @protected + */ +Blockly.PHP.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.PHP.COMMENT_WRAP - 3); + commentCode += Blockly.PHP.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.PHP.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.PHP.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Blockly.PHP.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.PHP.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.PHP.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta > 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/static/js/generators/php/colour.js b/static/js/generators/php/colour.js new file mode 100644 index 0000000..a785fb3 --- /dev/null +++ b/static/js/generators/php/colour.js @@ -0,0 +1,91 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || 0; + var green = Blockly.PHP.valueToCode(block, 'GREEN', + Blockly.PHP.ORDER_NONE) || 0; + var blue = Blockly.PHP.valueToCode(block, 'BLUE', + Blockly.PHP.ORDER_NONE) || 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_NONE) || '\'#000000\''; + var c2 = Blockly.PHP.valueToCode(block, 'COLOUR2', + Blockly.PHP.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.PHP.valueToCode(block, 'RATIO', + Blockly.PHP.ORDER_NONE) || 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/static/js/generators/php/lists.js b/static/js/generators/php/lists.js new file mode 100644 index 0000000..a985ce4 --- /dev/null +++ b/static/js/generators/php/lists.js @@ -0,0 +1,498 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || '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_NONE) || 'null'; + var repeatCount = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '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_NONE) || '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_NONE) || '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_NONE) || 'array()'; + return 'array_unshift(' + list + ', ' + value + ');\n'; + } + break; + case 'LAST': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '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_NONE) || 'array()'; + return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n'; + } + break; + case 'FROM_END': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '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_NONE) || '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_NONE); + var value_delim = Blockly.PHP.valueToCode(block, 'DELIM', + Blockly.PHP.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!value_input) { + value_input = '\'\''; + } + var functionName = 'explode'; + } else if (mode == 'JOIN') { + if (!value_input) { + value_input = 'array()'; + } + var functionName = 'implode'; + } else { + throw 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_NONE) || '[]'; + var code = 'array_reverse(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/static/js/generators/php/logic.js b/static/js/generators/php/logic.js new file mode 100644 index 0000000..4519932 --- /dev/null +++ b/static/js/generators/php/logic.js @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/php/loops.js b/static/js/generators/php/loops.js new file mode 100644 index 0000000..265bbe6 --- /dev/null +++ b/static/js/generators/php/loops.js @@ -0,0 +1,170 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/php/math.js b/static/js/generators/php/math.js new file mode 100644 index 0000000..397dc5d --- /dev/null +++ b/static/js/generators/php/math.js @@ -0,0 +1,370 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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_NONE) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'LOW', + Blockly.PHP.ORDER_NONE) || '0'; + var argument2 = Blockly.PHP.valueToCode(block, 'HIGH', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_NONE) || '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_NONE) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'Y', + Blockly.PHP.ORDER_NONE) || '0'; + return ['atan2(' + argument1 + ', ' + argument0 + ') / pi() * 180', + Blockly.PHP.ORDER_DIVISION]; +}; diff --git a/static/js/generators/php/procedures.js b/static/js/generators/php/procedures.js new file mode 100644 index 0000000..d500047 --- /dev/null +++ b/static/js/generators/php/procedures.js @@ -0,0 +1,132 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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.getVars().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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.PHP.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i, + Blockly.PHP.ORDER_NONE) || '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/static/js/generators/php/text.js b/static/js/generators/php/text.js new file mode 100644 index 0000000..b598f7a --- /dev/null +++ b/static/js/generators/php/text.js @@ -0,0 +1,274 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('.') != -1 ? Blockly.PHP.ORDER_STRING_CONCAT : + Blockly.PHP.ORDER_ATOMIC; + return [code, order]; +}; + +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_NONE]; + } else if (block.itemCount_ == 2) { + var element0 = Blockly.PHP.valueToCode(block, 'ADD0', + Blockly.PHP.ORDER_STRING_CONCAT) || '\'\''; + var element1 = Blockly.PHP.valueToCode(block, 'ADD1', + Blockly.PHP.ORDER_STRING_CONCAT) || '\'\''; + 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_NONE) || '\'\''; + } + 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_NONE; + 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 where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var text = Blockly.PHP.valueToCode(block, 'STRING', + Blockly.PHP.ORDER_NONE) || '\'\''; + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + return [code, Blockly.PHP.ORDER_NONE]; + } 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_NONE) || '\'\''; + 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_NONE) || '\'\''; + 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_NONE) || '\'\''; + var code = 'strrev(' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/static/js/generators/php/variables.js b/static/js/generators/php/variables.js new file mode 100644 index 0000000..5ac4849 --- /dev/null +++ b/static/js/generators/php/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2015 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/php/variables_dynamic.js b/static/js/generators/php/variables_dynamic.js new file mode 100644 index 0000000..3b1584c --- /dev/null +++ b/static/js/generators/php/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/python.js b/static/js/generators/python.js new file mode 100644 index 0000000..9844b95 --- /dev/null +++ b/static/js/generators/python.js @@ -0,0 +1,329 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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] +]; + +/** + * Whether the init method has been called. + * @type {?boolean} + */ +Blockly.Python.isInitialized = false; + +/** + * 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'); + this.isInitialized = true; +}; + +/** + * 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. + * @protected + */ +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. + * @protected + */ +Blockly.Python.multiline_quote_ = function(string) { + var lines = string.split(/\n/g).map(Blockly.Python.quote_); + // Join with the following, plus a newline: + // + '\n' + + return lines.join(' + \'\\n\' + \n'); +}; + +/** + * 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. + * @protected + */ +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/static/js/generators/python/colour.js b/static/js/generators/python/colour.js new file mode 100644 index 0000000..6be61d3 --- /dev/null +++ b/static/js/generators/python/colour.js @@ -0,0 +1,72 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/python/lists.js b/static/js/generators/python/lists.js new file mode 100644 index 0000000..647cbc7 --- /dev/null +++ b/static/js/generators/python/lists.js @@ -0,0 +1,349 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/python/logic.js b/static/js/generators/python/logic.js new file mode 100644 index 0000000..67e06ac --- /dev/null +++ b/static/js/generators/python/logic.js @@ -0,0 +1,127 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/python/loops.js b/static/js/generators/python/loops.js new file mode 100644 index 0000000..792d887 --- /dev/null +++ b/static/js/generators/python/loops.js @@ -0,0 +1,214 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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(); + } else { + range = defineDownRange(); + } + range += '(' + startVar + ', ' + endVar + ', ' + incVar + ')'; + } else { + // We cannot determine direction statically. + range = generateUpDownRange(startVar, endVar, incVar); + } + } + 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/static/js/generators/python/math.js b/static/js/generators/python/math.js new file mode 100644 index 0000000..c5d3eb6 --- /dev/null +++ b/static/js/generators/python/math.js @@ -0,0 +1,385 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/python/procedures.js b/static/js/generators/python/procedures.js new file mode 100644 index 0000000..521b5e4 --- /dev/null +++ b/static/js/generators/python/procedures.js @@ -0,0 +1,134 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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.getVars().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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.length; i++) { + args[i] = Blockly.Python.variableDB_.getName(variables[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 = []; + var variables = block.getVars(); + for (var i = 0; i < variables.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/static/js/generators/python/text.js b/static/js/generators/python/text.js new file mode 100644 index 0000000..82fe8d0 --- /dev/null +++ b/static/js/generators/python/text.js @@ -0,0 +1,297 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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')); + var order = code.indexOf('+') != -1 ? Blockly.Python.ORDER_ADDITIVE : + Blockly.Python.ORDER_ATOMIC; + return [code, order]; +}; + +/** + * Enclose the provided value in 'str(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {[string, number]} Array containing code evaluating to a string and + * the order of the returned code. + * @private + */ +Blockly.Python.text.forceString_ = function(value) { + if (Blockly.Python.text.forceString_.strRegExp.test(value)) { + return [value, Blockly.Python.ORDER_ATOMIC]; + } + return ['str(' + value + ')', Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +/** + * 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 codeAndOrder = Blockly.Python.text.forceString_(element); + return codeAndOrder; + 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)[0] + ' + ' + + Blockly.Python.text.forceString_(element1)[0]; + 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)[0] + '\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 textOrder = (where == 'RANDOM') ? Blockly.Python.ORDER_NONE : + Blockly.Python.ORDER_MEMBER; + var text = Blockly.Python.valueToCode(block, 'VALUE', textOrder) || '\'\''; + 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_FUNCTION_CALL]; +}; + +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/static/js/generators/python/variables.js b/static/js/generators/python/variables.js new file mode 100644 index 0000000..f72f4c1 --- /dev/null +++ b/static/js/generators/python/variables.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/generators/python/variables_dynamic.js b/static/js/generators/python/variables_dynamic.js new file mode 100644 index 0000000..34fc1a4 --- /dev/null +++ b/static/js/generators/python/variables_dynamic.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/gulpfile.js b/static/js/gulpfile.js new file mode 100644 index 0000000..65f285c --- /dev/null +++ b/static/js/gulpfile.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp script to build Blockly for Node & NPM. + * Run this script by calling "npm install" in this directory. + */ + +var gulp = require('gulp'); + +var typings = require('./scripts/gulpfiles/typings'); +var buildTasks = require('./scripts/gulpfiles/build_tasks'); +var packageTasks = require('./scripts/gulpfiles/package_tasks'); +var gitTasks = require('./scripts/gulpfiles/git_tasks'); +var licenseTasks = require('./scripts/gulpfiles/license_tasks'); + +module.exports = { + default: buildTasks.build, + build: buildTasks.build, + buildCore: buildTasks.core, + buildBlocks: buildTasks.blocks, + buildLangfiles: buildTasks.langfiles, + buildUncompressed: buildTasks.uncompressed, + buildCompressed: buildTasks.compressed, + buildGenerators: buildTasks.generators, + buildAdvancedCompilationTest: buildTasks.advancedCompilationTest, + gitSyncDevelop: gitTasks.syncDevelop, + gitSyncMaster: gitTasks.syncMaster, + gitCreateRC: gitTasks.createRC, + gitPreCompile: gitTasks.preCompile, + gitPostCompile: gitTasks.postCompile, + gitUpdateGithubPages: gitTasks.updateGithubPages, + typings: gulp.series(typings.typings, typings.msgTypings), + package: packageTasks.package, + checkLicenses: licenseTasks.checkLicenses +}; diff --git a/static/js/javascript_compressed.js b/static/js/javascript_compressed.js new file mode 100644 index 0000000..b492f72 --- /dev/null +++ b/static/js/javascript_compressed.js @@ -0,0 +1,115 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.JavaScript = factory(root.Blockly); + } +}(this, function(Blockly) { + '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.isInitialized=!1; +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_NONE)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_NONE)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_NONE)||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_NONE)||"'#000000'",c=Blockly.JavaScript.valueToCode(a,"COLOUR2",Blockly.JavaScript.ORDER_NONE)||"'#000000'";a=Blockly.JavaScript.valueToCode(a,"RATIO",Blockly.JavaScript.ORDER_NONE)||.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_NONE]}[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_NONE)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";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_NONE)||"0",c=Blockly.JavaScript.valueToCode(a,"LOW",Blockly.JavaScript.ORDER_NONE)||"0";a=Blockly.JavaScript.valueToCode(a,"HIGH",Blockly.JavaScript.ORDER_NONE)||"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_NONE)||"0";a=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_NONE)||"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_NONE)||"0";return["Math.atan2("+(Blockly.JavaScript.valueToCode(a,"Y",Blockly.JavaScript.ORDER_NONE)||"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 h=[],l=a.getVars(),k=0;k5S_413-^&w3C0*Djhb23xn^V5J7*a`8)ASWpJ=BH$)Wu~SmB<7_k z6s6{7Rsh*al?v|p`RO^S3Z8k%djEe z|8W7JU6wwMzOKf4mKH^fXJM`pX;9&~;>5tv0CLC9h9lfCiIGA>B1ot=-=`$KfxBg% z!2xvxQN{%u1ZVItq(kKX|Nq&bz`W(yxy6|b2}}%!60c^lW>9qJNYT78cK7X1G`=?E8tc&Ve+j=v1Tvih0*@(UOg z)*t^hr9ta#q~@}-;m&2rD@0cDT)bT*!L`fq5ld(5;h8Pk2Y6UQCK#ON^K*&Q;bhss z9BrK3;2d=3SdT^1nUz-!lTNNk@Mmq?@6Ud%@A{J`(*oW^&e)mc81_B)Si14_drS7G zzq-2c_uuE{Khk^7tTS$rj-Ikr)v)XCym_1Z3znXKSJt+4_U@f=e}9{n-@o_q*!$1_ zEB<}`ef{>-}am~&Ni$6GlPLakVQmBho5g+#P@|YVu44#{>+Kski1s6Sk9!K zfj8soyG^C-EUk(PA#6;{Q6^WIn`c~D`^7+Hh82hGUKz=t+05gThWnaIbh@zJJ~KkT2if{=by{ zTQ@IoW{I(Pu>SSez~uDu?f?G|PglO@n5t)*8uVuWesE08RaG}_le~O;$&!upuPt3# z8=v`Re&nesyE{%Tj?H`UbN#;vFNOjJhOlWaokA)e6P3DTmN+f&5Mr6SvEXOSJm;zB zK{3S7d@XXazRmOo4h9AjU^KF=ZEbV+q!+WU9HsZvvK=+^CR?=u0PulcRlXv+U&QSpI=?S zCH&&rkF9I7s}8nGoo8jOQ&`u;r3EVh^^8^xAfUf1KrvLqe1L&*2{3~xKx1eCLtxZu H^bi05jng?> literal 0 HcmV?d00001 diff --git a/static/js/media/click.ogg b/static/js/media/click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e8ae42a6106dadbb6861981a696b7f8b8f64c9ae GIT binary patch literal 4865 zcmai13s_S}7QRu01OrA07;JQJkQ8nJB?w5^vgIL#1X3gS4T_I;7qX~&LkdY!roq9>%9EDy)D25XYk`Pxlv((8**}U z#o1|alvoJoq=LU(L2_mm9Gfpr$-seG>w~#rfncfM67Ukt;WA^nfwB3?l1y>FC>IQc zMzh&r?{Z@UV{>GZ6j1=YH9tQ$V9lCs+qSLF6-skt*+S{+97)<5Gr1<$tZ#FsShzVS z75tg>ZI+_?V0MmBoGKOx;pA)~ED>di-v_i{I~<;qla?uhnb|3;F^kM*A|au17zhh? zK#zj;MPt=G2qHkx78k^}HkFB}70qtj8x#>JrS~dtP?YOQDV21?uN~|obbufWsK^ah z)jGpWA7P}CT&pBa4Dq}E$6>3An0pM|UUfK=9WdBSh^3Q|5Q0U;mm%#95+KTK77P^uGokQ9MCKXd&>8ZzahK@t zJYwv9$Jd6%a@joa$dcjqkyK}B2>85OY zs&IPhz~*J8e+1TVnFE2Ok(+W-A*iJHtBT(Z!I=a6Yv$w;`wx+?9&(B7a$!$+T>H)^ z`l-*jeOQbSJJum-+(CBTQ55T!blq2UohOR|R`d6)D*0?0pyt%zTtz4-&eDsl~#rhAKv$f)QL&fp3irKO%xAJ;% zxl((fC3CQIzW4vO-!dm$;sP4ToG^*YYngM2P7Vdx)aAi`YPKoAo5T93;sexmRj|$F_D#%({#bDASwJxmR74-3 zUm;0Gm{*(DkI->P6ax%bb?pQb@vJAUMX2p|DGyYw6U?h^3Q}ankv6-OavfL%S%Kf; z=CNuAOb`)*1bB`$Qlj9DAT!mRLHa{7hs8LqiXCBKSI7tHmPd*Sh?*Qbg7lN+!@&<# z#bd#45CmVsfM1B4k1z}(xI*`GT}EqtB8k*U`>;`>Xv&^FRp)cf$2W${8?xt3a(QH3F_|s=jcu zF)OLzl_)mRB+8FB)#DqJ&x_%S61cpC0#U+qUc9j|5^!VLw;Xu99^S2IS-kqf`}w@2 zc+suryadNxiBl!_e<-|9LM2a4$^bXnC`vvjn|2c`#px|4v`ROvR-^67(st?+TjsPa z+QF_gZD+?|*Qt}8ne%|#c|zOeq1Aev?CN--^_cHDq3zWTcAakQJUQR<&Eh_f`QBV@ zXXnYTCn&d9H*d(B@AcZ*jtsS*eB7()?aiL=%^U8?BDZQEe@Yv=e0s3!oB7@~XJwQa zp6sq7=|McOBWv@vqlwQ;y0ZTIneN3P5HRsC#%K=t0$BD@_8VZ#@YMb7WdAC4niA|( zt83JrobSqZ@9UTkiQyF{)rqFpB_%A&o?cg#ICY>!`?!}j^eIq8|H6<%{@9D0bjJ@c zj&$i37p4q6$Bky(G331nc<_U)^%Nf0e-K~;gJQ#eFsPa0zM#k-16fjLiLnHl9?mCl z9>Z;1x+O*WE=x~VY+$8R6gOxFm|MjhP}SP8wjzoNj#aaI11qChVdP|-X}=-(2i)e! z5_>8p_~{zM4Swa)6oU6`n{b4QQ=df{K-6qgn{5b7-A0ULdBzO`Ah%8gM`+sYVwsw5 zAWGfl7|Ejd5EHZMMlx8@W|zoB48+(hPlIxm0S2P3qRLG=9yTa|sKdoIES9dWhBK_H zMMV`?v6x6t4J!)lip4rp!r^DqjVey2FW40jRl~~kH1HFnx@83ZV$-g4-EkS|Is;Hn zRg)rFXSy9TvgtF+Sz;ZkT%&hPtOCkoGkn{P=_n&HE6}KvvUJ89oCAQ7l67%Xx#OE( zEf=JF8jJ!Rs+@MFt_CQdxy`R+C?*6zR1K#RtVqnf&|aSo7)s9m?wQ-tOy3`F@HCpG*v^l>Od!G8h+ zXk_{p5CE(U{7{xozcHheqBaUTe5U}2yJwUcEWpUPb^(IESY!pAUie0spDPJR^AVbi zD1w0-E9s>~K?QwQ6^cdl4WPzpC!wVW_{gI5M`bpInXiiU2J`D{HT&ASP=X);J|LqNeAZzpheM;P>(Qg* z2A|~#WLr_yMov1=5`a~oy@9H_861JAjr{$dAmv!#RZ!_$$^ldKHw7K^wh0c%Pf|(; zNFaU&*m{O1(rpw}b_4%|6T&Fi?`z~QhVEtOLPZg$^GfU5KDs=9&lGD4D7HgP-bOD5 z91x2p6fKnXEPyH$BNRCZgLzC|{o5EJVAc#R0H|5>JjI3(6ST0+U<_FSK;~wmsDQ$m z3pf)P<#wQyQvk{4F@+t_VJhzw92AkjH7LUbRTG7ypzbnFrkK~FwIG1#Li7|~HRsYg z=$z?u|MJ2OTL)NB5gvl_Zl=#8#sOHblGjJdt0e@%>ZP0tM)(;~gp-~$si3Qgv7C%K zm7p>v`bY|k-q)dsW4RsLJ0a=lE*J*4Ulye}(Z z|4`ZVZ%wcniLe7ykR&P;Xa?3ye`rmfS;o8fNIphV@Yd>1J*zERk$4~57Gpga z<=6cB);VnYXJ`C7J-0We)Xha7T8y`ysj?3xx%%H^I3gFj%U+UniJ@KJCqCS5y>rni zlFjm)`(_I{MUkWvtD~$=xYzDuC9nF6h4|+M%XODn%|A6R!(={t4+r&aqtvTDTR6wt z(E0g6;iC!CUn5Q=F;lNCeU$BW|GOmSroE}z?jKvqe=MMt#x1$K^JVRVO9UB`AAH+?lzm%p z1{*OoyDC~2yvA{|wBY%m$HfoEr(eFDn~YrWN#O44%&c#(*VYUW8=}3SZR50+b&>qM zxcCR>eP4+5OETUHu=zUuse4@FjUC3L8u14ODJ0uU>gIE|zX`wiY2M#!by-+9-^KoO zeJ}QBQO_Ma+Ub;B>A9{pn|5Hj_BxTTyL(j`e$?g0&p8<2ox_Kd!;juM{mwD$hBLOe zpWo-*oe_@yVnOE*4^^(d)lrW|-?kAh+P0$SyGn*^ho|&;Rtx^% p7k4FIZ@TV#xbK&J-v%`HU5P#@S^9X{;VrAfeySU))r708{sTaExM%T7p^9ndf_EzHQ$3of#W9Y}f@)fC>4I3RdDtcslIgiiG%1X;f4SFXnB`9;I9I~b- zrOyo-my?z}N3M(>n_!iz#^ofOdL$jp?qnQ1dpf|4>)g67Yd zo3=>Kr!NkQ&CEjjXKl#}$p10a$V5G(8wK{$@Ms5jfg zCMe65Y!=5R8M|9{nFh1f@H+X0fT(NEuDtzh(?&i5>(uCyEx*a`2A+3pL=ew zJ;KpB)FYwl-`5+95B~h*a_z&Jrol5SE z-;;|EuE1x(hOgb1e_IE^OgtylbCY zHRnb2i_FR}+fJr>1^K76a(Sj2^0oKv2kc&&AKhjx@rw0f?kicf>yL)OnlGz^8~eG2 zQcp{r+coQU!8lQOvE6HY^eW1E5Br+j-A}tOu*9=pwSzXlrnKh2oXHq(EVX{` zcEdcJUE&>G>m1WvLjRr&R92fzrWfo4&eEMm1o@yqaN){Q6##71+Ch)r6M;odo>7B(Sh^KSdF7}Ad zC2b)MCt@-N;5Na;dwi+x(!SMKidoQuzF^tP0OM^X(ojRjpk3dr4bn=qX?!3ag9&6a z`HGAow_yN0!3G=wV<8;Ma2<9*1J;Ws@mTmtyBB#z+R~rNDDnXeMn$yZEA(W2vp$il zq7$j3UmH|qq;Z7eqE;Bj!?Z{>MV+OodNMAj;YzOYnsSUaLO=0X>#Ca7f%*;ngT7

    ~Kv18<{tYx#Fqpj22d0W|!J;axGqUq#0ju4-7Dk3onMvxkUB#{h-^Wq$Law|@T zTjT~s$)xQh1`32P|6H%s-{y2? z_zgDUY5W{1L_!tr!|j-cFGYb^B7T)S4#5+$lYUEIkaO@co)BZjFmXa;;#?R{@<|!k z(I2OaFmY7WVH%l7f1?Ewy@#=zn8%m$5HVJs*ll`@g|nrkBYN_y+6HZr?khsTm-b+N z*<17=grh|aF{vBq}uRHE|4vv3C@q1S-IW zz(q7lE@gZ=Cb}_ivVOk6sB0&$=iZvUr zfOK}x;4sv%U1YD&w0yNptx*O+O++NDtP^aEmRb@jykc?xh#&UBn$6MB?Z+%IF1{jzh&xewMElNAM{;Cb@Ja zEh4Ao+3&`AScG9P3;MuKoPb@i6~2v+Fb^JsfwUuCNqbTXn_(hkLjlZ%1{{jdM3tC= ze_{x%g6pscJfJH^i4s0Zyos&gZ@5Sn(oMAdpWP6KE5t&HxVu;igdUalOJp`wix>Pj zZ!J7A7p(Lxmd9RWA=E^CAqH2AY2u=oj5o0Z^acwY#HkpI^YNHO=R`OG=OG?;V7SaQ z0XJedh#)QKWLifCla=s`#6^in!fo(18A6xQN%RcaC)L5hyYpz?z@1_cY#|HiT56;n zNEdihYSS9whR<;`G(j1hg++i86#=M=R=5z$a0nDbAF_d5AU}~j(vo~6kytEOjF;s>G4Z4zHB$AZF3aG{5cv2*Z@#2m+j76}YMADvgCpiU6aiB=%akA#s_&S+J|EBxt zJ#ts}KTq7}ErdUwgIL;zxv|;wJ<=cIFkd3MS(M0H9MD}>w+-SkSS;lmc@L2&QJh4- zV1KbT>L_(u27`{*l-j0l8I!zL`qj!jRP^c36+(IVK>r?eQJwlY>C*&l3joqSuO5a^DRfLOl;fn$#^QEG!CUx+Z zRJ@xaTTBtXL{BkND%pGJC(%VncX^|PlJ})r4#knU8Vj)sBVj9?gY^>WQJ5r(`A%NV zFNj(UBtbO4X?WAt=1SWwJGURPZ?&Ja?{Q30?c!af$}P?N8y`RKjUL%FY+jdf>6iFU-b(BWZMZ8II+)C%5-x*G>roK}NdiRF$dR#`+p!ce|n z>#eEUSG>Dq9-;9p$?&#PqI{-g84~GAJf`?QN+xa9Gse_&oB3VU_Wg@wn2J z-NPsPZZ*o4=z6J+=SSc-!&LJR)&*{Zt-a*?KLFFT66az^f@81q4J}zT5sOk`++zwf zX@;{TR9sS{oZTGZjv!}ywO(%vomif7z<5r+WzMo}vI2cYF2BN0i&6|GGwE1%i*060 zs0TTXlSHFlqlIZ)&DYlGcX% literal 0 HcmV?d00001 diff --git a/static/js/media/delete.mp3 b/static/js/media/delete.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..442bd9c1f4c9cee39ca9cc776c7cd594c90f2795 GIT binary patch literal 3123 zcmeHJXH*m07M>&!dX=iEktT2fsh48B1PId6#Ly%{0to>Gg7l^YAtC|_JX+`=MMRMz z%|=4KfCcqIM5>~Qpi&e;ROW`Ku5}mx?vMBDy>G33W`Ad9&EEU$Z_XTRv@Q(b0CEUt zjnm;cq8u|14hsnK_YI^Vf`~!nV4SN3mNU!EF&!;!Z5$eF{&#xRLYqT*Id&|R9OOd` zG(Tc*&tbkC+rlwwSg;q_7~vBd8f1LnKtx1@W)LZa8WukCkYH%o-gs`WQe7$`+4l$5~2qp*kMsj@5D1;@IO7SNntOLC?!LRAvKcf9@ zv<~#9a;ON$-~b@t52$T}<95)t;p%n_ZwI&yoLEM7ruG)Pnns4fkO#lAk)SE^SeXF; zZ7UCz7B9tLH~v?yKN=(v=Ao(A3&8&P?V5oB77DOCAk1_{K7L_V>G{%k=1@Xx3l8dO zEQ;Xh5RJBl0zvil(`Yg2v9WKO`FktsM0UE{FSY4QEWT_XQxf{Lu#@iE>PKaz6z^1S#Kk6E| zG-kc6w!8meF>Y{bCCjCuXMue~ilz2C!X4IBS^mk%roZYV3EJ%*WEKJ4CXdY$UQ4Z)#EROyxblolH`S9mE z2QJKK*G*4-eWTyn(ffXymH0Jo*N+cx#lj%oWXLh=832^!1zpK5Gt?{Zu6~>g=Qj~g z;kv01&+284q4hmg6M7n=LU-_69`#Y6$IHWWue=~!%*zSP3s;u%z(unHZ6oA6>5wpA z0tUusc++ve)J0)^ot6*o<=*A4(6PhKg-GAljOBMKHQ4gC4?a(i7x@ucDN0>VX$46b zs_@PuxW{RY&!YHs-HH!6&(>VsY>jx?(Z1VQ#7!ci>cbIby!@Yaoay>{p&^lq}H#A~FK*Wpum_g(k9vo6T>j89*1Bax3k zbT?{hF?OPO2hY7UaB)<*`XH)mlCdl$c?$Zt#HhLHK)t*(Z)~hqV@I<0$hhCi6GisK zQqs=-E2aO0K*XV4AY z!)OJaCpY7M?urlK8Q0=@t2Y=qzcT^2a?j1DdZgooQGn>Jm3&*B3!-+(yl*41&FJb8 z%B8%lrQDQp^lfz);i~u6+0hrQ!-U4_E0AzUwT{P@C(xp^>g7$30wuI5Qm zHXns9?$9qO{c4Bl;se?U9=>zj5DZg2HdRcIS8=3SR_2nB?){D;FR_fg79G`}9cu4GN#xS_ z*Spjxg7uKy;zd=iJ1eai0tw$HESr@aaK;1VibBOdNH)79IuxFx*KgTjnc=sowdyWO zdL--2d_Pskq{g}N^Uu2^dq0TCWobt zdDo-+Bj7i)?x%kFm6xe+bkX}ZV63vAeH)8yy)9Sn`RKCQbD{H7^;pMaDv&aNv z+Z91w$7vqa(F7jXR5tS9Y%^%s3Iy|29127mmMeD7muocCUcW=X!}xolGP$F6HYPB4VL7_aI(MCd}qs6aUj^1?Gh@W3yLA@0ZwTW z)*=GR(#7yAd~pe<;oqly+u}=$xo>X5oPm`PV=M0;7|ng5ziXP)deG<5Gq{P zV8SlyRFD}Ba3lEn<>S3fCj@-K^~4@gX;D=``xW47B?H~p0+@o}Hz+)QUzwNroMxnk z)lGVO8nn%?1O%Cir7lCA5P6!OmOHWbu%2aEd}63QJr{mofy&9TTS;2wVmyFx{B`Eh m)Y*Qf`iFe0Ly8GZ08$|b00;okqjC1dfB267KmOlbfxiHkb?GSp literal 0 HcmV?d00001 diff --git a/static/js/media/delete.ogg b/static/js/media/delete.ogg new file mode 100644 index 0000000000000000000000000000000000000000..67f84ac19a05075a52de49829b3a2bc17af9e29c GIT binary patch literal 5731 zcmai12~<UMQkbya=Ux7sx%#2s1z zeSLnbQ<2iDyGCVU8(<01Y(^MI!h<=~eVuXuCMB-GTqP_2dL%0)9N*9zRD^ix|2aBlfNoisNpYyS00CJUftSg$j*} zi?K2>IdI^>mY5(;bbM40XG=6Y#AKN?VMIr>{H4M{AHwAL2XHvi>^No+iV__Z790kM zfT$o8n;98)5YUW6s9n*~ArVXzDJpOaOm5jKw4J>N3{nK@aV{uf(m)O!f)Eh2UmvZU z7feF)d1Xe23VBWvN@$u<$jcBS1G8|VKRXmY2$(DjB^klF6%(ZJK4J*ckjpM5hV8bj zMk!>vJte|#&20*ds%oiXMfIT#6jyu8K_Fx{PP%F8R7uA;p_`5b-H+PrPTlGf_Dal! z(&H=5I#DSuW^XFmDGe*C`i~auUBLX` z%_g)H1K9vy-ig(|6RYn?)xX0wR*-tQ69O@{p&AR>_+1?Q9nSZl?TT~g;Ow5$nCI8pWzRWwla;Vx0R=v8TrdhyWB3|g__)tbU$X#^wsv|fN%qPx!sOV11x zar#I~Mf_#zkZQ3)ea#>k)0!+%7HI{5d0~S^3N>S1V6FE+(Zq$T>VV4N6&to*r7g?* z3X7V3C4D!E&%la|2gR(ba6dqO3MzSb7cLq5Cwy!`+yX|CqO-?QiClSxx^9(j-iEkS z%6X-@PITplZ0=5SP0AjsmLWgxxYTkK1f?RRDE_mPLU|d*mARRiZlg=RWS>kB=mdk7WC=P5&pb z{>mH(Bu%O`CwYu4+?|q?-FEQh0RNdevFdkDYj>U2cW&0F3>x449q;-9e^1TP4Nq~` z@VloGKcvZYx9}SxFo)>O;RNPb8`Jl4qIcWZgjr6T@sap%GDngkdPMFEr(D^;GpE#u z``nVdk(8_NoxAB!K}beX&6#s=YRXssBXdGCs|z!$Ph?J>;2LEVgk=;7u9io1H%zzx z&-Pd5>|*PK1~SKyt^ZBt+`wtugKTOxrhHho(fS^6Xq@BPZvy~9H*%DmrRRtn6+28N z3{$amn)QFr7{DFIQ-<)svH1|B1wk7@kW&$v>>Rr&YcECIguYxEQNHXpGPN3Eu0&j| z7nfseXniG@*rD{{Db+~B!6hZzU@I53`c~Cm(kn|vaO}xKZV;4&>%`qgvinF~r4D^K z_*q^j(U6}vNJ3)^kmhKED%HRjB^86Du1X%#IrD6#YG6h^SOh76cU9Ryjt0y|9fBB2 z)RpKo9<>iWkwfjqz0#(ViPa_UeMCi_)NY*o*%SntukGH4zN4MmYx}AsWx&=5f>1YL z;I%Wt2RT9rL+ELYet#a`S>3={&9PsdIif}x$;aQt6WnO@9yR(fjs8%RLT@vms8J}h zG`gB2U4uSUK%uur_T!mjH2Pyr`fwZbq2>>s1@YtN6mRe;2Hg0Of<%9Dq+j7zQ51El zC=2>X8^JA(?nY;N)9Bs_Oz(NRr#R6WaNQ|m8gzOaeQYk0UXb`Kj_&8l9Gj2{NrcwIMo{9~Tq3r}E2 zr2m0)zVm6#k=uT$U+e|~1{a9^(b`wRvP)6x!IumO``L#^AUOn38&Buf}1uRE#kj=%^}aR}-Zs*;A2*X8Uc z3$=NB$l!yhe22 zCrc#|VK!MA)JKBzTOP$*5nOvWrOYJSmlZZ;;l1b>c zT(S$;6`6c7jp`GD6PHjU2w+!0R4zFJEAsJmX^ltttdj1kzSV;jUM~X54fsfB^2Jt7 zRupbx9XYICqP#|^>B|Mm-C2Yxakzxx8)+>r;*jgb_o>-{5g2)Wxai2Qe_GB6$BM*^ zdWmw(#r#~LeByym7Lhl|0HSiKSzv{4#MP>TaKI>{o@||Xz=b@i$y4K?#OHLktqYnO7%d59v=zf!dDLj zzD07B?J!z_eYQsE)IDSjIt@W48Sp{9y;2+0a}fhPFKw`)<#S}e5<>}>j*6q1VN_CG z$c8n^z@zo?01A9zuTOY=%czZFeVW+J*#JNxxc+vb&t?dE3pVstdX5-CISP;svI6KO zh9DTd#Mjz*a58GADq}+-=M%4nja@& z@Te;x2onP;q9(T>&hgWw;LKbB9g>`xWTHYDZzo!W;^k6-I$%-_TM771=pkY7eBPn} zG$IHI2mmXQk3G3w=*4Q#<%=10gb@JZ)`=n(88BFPuR_oxIR&UmX1$|@Arg+k2T6@c zLIF2s;nLL^nYhUkdquRc5Y#wTNJ;4dezKDKBMUIVrwA~JliHH5gv0&2F!`GTH;Df* zq6XAiDjwi(EkdqWT&~J@s!BftBfb{th0CAc)a-v(@BfYRWz_@7ecM4czpPY%mK4@| z?6O3!TV*V<5dp3;$c{p=V|ks_boA@WR1lsrdot0;0H6eo2JitH&GR9j;ZUg<1Ac+z z=(z7g#sb+227EC!9B8pp{TYsUQr?W2rfRjUlWim!Sm!HMu;Gx5rKjEyXf0hSmWfGm=sU zfPyan^XA)Pew_GLlnx z<7@qjZoLTnvs*HILOaP&k`e^Pj)qU8#hoZ&Nos*}Y7QI0*rGzsB<{M%bkY(chj}=@ zx;vHix`dJC=6W`ejO(c5d611xA0K4bwI=j}%PvY0GDYZ`C)>c(k)1$Msw^5RZMrdl z+bb*kQq^pw(#kujoWU>|2$9;UbozvslB${@xtw7IdF|cbsgR_Uo!xSB)oZgGa(<8E zQK=|d-4jBXdQMV`TGYYkt6i_$gj+fCm6z}4FlYk=<*r8Q=@k*V%BR-kAWo~~s^+Qj z0DK|nDJ*FXl%y|r;>3wyZbion8GVPK)XLj0WeuckNvEi|d{vQ^($c%T>_L@fw&dv~HI5XBh^yWBcWoiLfIa%=r^ zMtlX?5`SnuEBy^|;8NX((LLF5;R}{0pV{XH^G3$MpSXmCf?$oi&fH|KP}pW8`{Qc4 zKhBaKmG_R8-8A>WTp~XuGZ{3k?x|h{;qU%1NJ-1zb^S^!EqiW@j7{480+_18@$Z+8 zJ$@X$-6}sUoP7CRXTlE)Ew9%oRX1G9d;gqgc(-tNH&+P?(rTO=jXr*6h0AvZUf;KU z3GTzs-{trJ`*42RcW(T;&!s;`E*;b^{@!OpxU%Nj^9nnlW`g!^Erlvsn?>?_YU(Ga zT|HR%eXpPQGE-3k#5ziLcS*(7kHe2p2R;X1IC{?F{IjLGCHE@jMw2r)m&ShowDfA` z!g@O!?P-mhad);|_<`^IT~5jwn|CiZ973eyVII|iinxMJr~Yvi z3iI1ku@<7uG;Fm&466?IxD>)hnr4b?-(Q&Br*lrL=l2cAYhq`Zf;WE@-*ic6fFfWA z;Hpq|$|r2Hi*eSLi6IxyH=Gu=^Hx9k&YHxTKHl{2ExAzXug8V6mMV7_KOd71l54b0 z+N`x3ckiTJH&J7K-<*lxSYKP@sdu*8F^yh#aDCdHp@_sxh;kjz55v2zh(^AKr5U$cjWPrn9VL<_N63e zLT`BwArth|^Zmou^xorHnjF<#o_kN@Kh2H77Zjcygp9xZaAT$`h){=jl)te`bCGQx z>sIrU9Qx(M==|)b7T(~ovys;jN)>W(F#l&RR=Fwa$vNU%dMeP0p6s@vu7CoUZUaK~ z%~+WaBUgHIw>>QQf_Y>gc5DUhOT#Yf&Z5oP&8N}kHhO~bd5v{?N)Z9h1Bf~GSGQ-lb|*aYS|sWn=WgpR+|J*m zLA;Bw5k$>x8|RwBA>Qg9*)=A0E6Znw?b<&lCodU~CH^w{pzFD-!Gn>hsN0dT@`vaP zC(YHCtZQaBQ9?Xe-@$InIinOsvJRDv+q*TE)?b?YZI8vX>fHui$JlEhZs~Yvv5>Ma z$Ho4|wZrh*=zg8=s8HNYgX7yhL8Qh+JDHvA7eS`tX4180(lPl%OKaZ8`!41jM7!)z zs)e#vH?FW>Rh8iIc;D)7!FB5<;!j21#ls=^GEew#6``wK_s4opB6}aUB|26q?LU0P z_q8k(r_m^r5M+K;4d1}JXQNPCz_7-0F)n7KUX*#thF=Jrvx0SY`ARwp@wW%J9x!{G z_@JCD2OWhs+Rm6Bc5^BVRy(fsc1Ll~k&Lj@tZf!PqJ0a!T0bkJJpB->6@Pm7qw-!A z|C5BAG)46DlMq$N+SlXe#G5}Hyxt{uUz+CwLJ=arw{@GUiq;MoPsRVVd@jnKJDb6N zJNC{!%Itixz-0Fyi%tJj#)YfU`$$#-1uyocuBTLo{Bg0$<5d3%wyK}{qo_r!>P*?%2`8@z*%I5vsfd(Ix~S`4B4u7p z_2+r)Y&=Zxk4wLa+d;UzP(6R#z3%8E)djT*1LZEK^FyCTC-D$Zr_pAcv2KdVmo}R> z!zTOMCJ62cUoH<#e{}c=uZg++gvy;U9-ZjOhqDd|?VosUhwxgBhUc6xTyGYZg(9C~ z-d`-562E+s{(8vL>Bu9iGMi(6eBb0bfTbPdTz?C{?f7P!ucGnl9+{uMI6WTV{rou; vR`?Wo(2Qg0ZT{g!$8~yn$d@jH=kr;w_lFKSxWQO2W1GLb6Jt_4yA%39fAVYV literal 0 HcmV?d00001 diff --git a/static/js/media/delete.wav b/static/js/media/delete.wav new file mode 100644 index 0000000000000000000000000000000000000000..18debcf96d6f76e36f295feb6de2f09dffaec1f5 GIT binary patch literal 9164 zcmXAu2Yip$_s7qDzDa}-Dr%Jc>{XkXr6@AY+M`sB5G#loTWQP)MXjn$P^v{yVr#9^ z+N<`agpf$`eeU_c_5bRtvcAuK?mg#oKA+Dyw@pN7=+WXL9UFFN(r3`{BDqAw@L%H} zMW%N$;z%xO9?`a4BEOGl8QLnMWy2QlKhr2?#GoMq`$hLHGNi|l$QX%e*ruI7zi&G{ za!6EX zIe74Z?*FaCzkMTzb?-53*x;Dqk-dww7~H#GpMHGPBf58yn8-o>M)Q5o*dk$r2lpKq zStKI5S4DQ#s7+%(-d448l`0~=dkpW9Tuh{>Jk==s!uFI);v+-#qW&OvYgSyeKvfpSiNzigSQ0M7e{Yr*QV;L-YOb2tp95aXHv^Lgknr@%!TS*lw z*QBk~kf}0K{wJSGQPbP`)A4ckn_f;a&l}G`pPQZ!JTuJ;ov7BXaED|jW{mcJ@~P**n7iD4&>l^4i4v4E2rl+2d*CRFKE&wH@8Z-binV_pG<4+t8NL4jQ9DQpp54 zo6Iz+Wwtw)ozNTz2U%T3Qn1dkHtS zq?s*YE9*^ZWq#H{BdMr~uGkYc!8WuN?R`5{HW`o8*IDH>acYo@w7d(Tdn7ADmkH_OaX zGt%sl-V$W0nY8Yr9bfWARQ!Qq@nrFERaK5T4(96GTd}AyCj+%?6kk= z6Md$;^m83AwVjd1N2}Q{^tfD?cbceob*}hJG3}>6Ykx8)a+UXfVID}PmN2!PeUgnc z6_9Z02)=JvuidGiXq5Jpn>tvtkc}{1poOKB+yEJQrJMP{SeU0Uft3kR|m-$TU z6T_ieU2;oR>7?E4HG4pxNupfUe7x(n{I2nuF1<`ka~7QKkqIC#FFPA;3YqJ=&34jo zlW0z`pCOt_L`txuS$f8PrDvo#NZux;rMW)U?J`cfa;ioWDq%882ieV3X*E+@M91)s zmHM{~6xYV+J&88|>O?zC|BwZ;fxo?w2y;YcOI~RpIb}2TAEG<;kk*zeri}cif9ra( z^&7FQDAOf7Yd*J++$y$<+$CdKar(`=G0WazepI47Mz&jO#e zeg)pSPs1}x_(f>e)C(yGeRg~h?OQqRSw^(~S6N%AefLS`K2I;tK0V|4!E8?}oH|pp zd1~98Qp0zK^FQL6!&6u;xy^K-xo>8g+S=AT-u+E-m<;>MK9GabTKC!#`i{6pNqf`P z6ftq2X_F>M4>Q%glBJph45hdS>?~cZr|cR%4wto&6=tDnAiH(Bd?!_;EN7es&&`#7 zri$4BgKX05ve=Y0t#q;twta1V-jH2x>r3;k$8l!rY5OaYnr|cB!aB}uGds1s_F

  • byd!2eCa;2SN@P6|j{ouc39DL8n)mgA(AWS*wl45GVAr)vfIR$9pc?M5}O&^(~N zfh;A;or!ZS{MQ7wZKH=|s);w{q_+N}&1D5RD0h}U-As$X)#MC~r;skk$>Br#f6exRbd+r@BI7dUahejtyfj@e=6NM-SuH!@2GX$8He4YZRTWVeFF zSlJ|H%r%LXHs&vK5p23^FHN(TZA<i-D;w@mL2>c)157QM<~Q@C?1L8Ob@lE*3w6MPC~%mcN!)q*~uK)E#u{H z>Zcb^{YeD`$T=OWS*e*F)Yo;Md2MU!J@P)AoGj&;cI;^@NZAiA9_TdPt|RaZvFOJW zbl|w2QGY&>$lv|&MPubSPO7DFR{ans^2n|M^_B`Mp`oC$l-6a(=QO{345~)3&M)$p zgvdQT0#;J&c+Dz@rJ(r-U0AD2bq^eSjoqhlo_#t~e9UcjwTRDzkuQ-`c(>f>Y-4$( z)pU(smSN_hG?PUA*DkT4HpJG|1F-Wt&Cqr1`&ShFA$56F%dx^jy=7n8u~b|;YGprJ zZOI9mngPT!D{g4H#!&|$=stJ?{T|68KVgGgOB*rfCVOnIcWo$poTtOll5U(n8C(Q{ z+a6%*y-Ft8idqw0ze!I1C40rGfR!*#R;h^+9OT^RsqW=+5ijM3?rj9ajqm~w;g#H= zZ7)vp0_a<)|C5vYJr!RJp4@Jm5Sw0lAI0lMh0cThuBjt&8cY>mKoe6mCo%aQwI7DB z8Ni#KQXvyzvLqX;pGhP>_H+3PO!Q{Oi=1I7?Eg2s+d>|qABV~Ra4=dOHoOE<)^omv zI)a=;aLUnAjrPThTm6Kf5_|B3z$hmGe`0|hv5 z3^h{sKXy3CnI@3kDY_QS^p^^-W<2?iB3cWnivY=Be`R<_brALv2IvPDU4WzS^0}Qv zdlI@4MEsZ0sf;0G6^Z?3*z_A%c9mAql3G?<;n?P&bT3h?nQ-MaIJ&sZB@&4`AAi^Z zHtSAQ{vq#??7k_r9}CN`CwBKZOPD^ihrwQ^twU`jNFzB*2AkmER>3usi1i4W$f{4# zv-#{~2`uK-H^lERd&(Bm_nG=vM~k2NgF2`qgQ$$o)LC&!lP}~`IA$$)JB~^ngnRJRzo`34TD zLpGYDJrh8Db25?0ySGr!xlo=}ct5zWN0@y{8Ls%u{*lDSMu$ z=j>g&gz0Lv8YqjR=Iij}E8>8P$cN-FT&_?zd-ONiPfgt;DnWRga8%}JG_NW=Fw>h~ z%K3%*TrdeXTUz7vl1^KnzD|t!)9g26G|t^*Q&n`jx4$=+Gu`*O`P%+qbD_A~^s>{z zGtkVEv-UeT%%+3fCmKed*2tE1*Vu<>#}Y6!7%nR%bETY_fO5ArkM&zB<~e#C0|VrN zb6??CLS&7UGP&eOs;IDBu!*)c`ASDyHpzXMHcGz(vE5*!^YjNt@MJ&J8*Zi2qv^4C z@U@xDu$$aW>*1VBLBTNdt;u5?F<^Bu?rW%IGjo{-r0P`8ZE*r!aDg{KhFIc>)KnT5HlQ*B8d z{N9&?ybodh12Ezqay$?&86bsCLGxa#eTn=?J!*qF$sF|Mt}P;taV6MnHKXWF`_XZJ z3a(30y@$xdVcbYwyi881iWc7E`IWHQGrGwHobMGPw*b%jf{JNJ?G}KYtC5TQptm;f zjis)8;9uX^C~7#C3V225_B-|V3D^&(hMyAW#pLA#vGJAiOgoanP$0RBLziY!eYNRJ zr=f1OiDgMN{x9mbJzgl9xUYvh>dPZoVvl_ULN3@boa|p}X%3n+*tWPyM!UP< zmv-ZN66p8W!1*ECl`6lCcfKff&G)cYR`lVj&R~-D2aI>!Ueo+$qy&(q1S+;L9dSE+ z%tjoxrKY=rfl_#g>+~FZ;n63W#@ZeMf!FZiMg>*1G1@a`!P zUlZSRgSo~IdfPyFpoYrq1$@ghs*Yj`TB`~&)YVB!6! zXDvBm^P!4mrLhLs(Y6X6WjMXi2BstH!Xz8^%uLymdDREq}m4Kjm|T->W4mb7Cz~u z@>C33-V4o5(rnAE}3+U|DX$w7Khr)&5v$G_on7Jib zgYa5;%_q#-8p2VN>3oezCpZ16y~BK_s+_j(+!=NvRa?Z~VD_{K^gXxDsMOA8x)bf` z;*@4qx6S;|Ow`@3x&g3wJ3Z@8f)`ez%ke1fNNocLOr|CxaL%J70F~I!wDbu~JHY05 zqueRXj*GH#d3djr*T24-gZr4T^rUCcLX8LG^aJ2%MN10dUPjAH z+f7@UerBr9v@O^{s13JmI7jJ6jL+>B@k#A;J$8WNG z+B@I&V>YnYFh?-zoSE@duA{J{KeZb=_~W&^Z6{9XZnvjS$z z1a&vy;M%zAn!47V;+Dn3Ez&|%@PM1pU~4_$MoltRFmkjGA@K zIP`L;*@iP~Nv~9z&xYXEpV{h~kKWzaUb16!G~Rl?4WXwUKv#Ye9bjsw88*9}2BU*POpNJ~$FjxB?t@)y8(CZ6Oy;7RQ&l(L%T();;8AWj^yOs{ahO zZ*M=dLr|Jv(;Dn`r2Ah(C${CiZ$`hTagH&X(-yKR_8tBqQn#YdAxv_7wlzbY?oL4yrq?;gY5NymegpR>b2)8My=dp-FnZx+ zWAGw7@GA#k{&ecSIXZQS9_W$`Wy)X36X!fM<(aRinNym@7I7PU_j+4{fM8|`+27AN z#Mk(nV|vFust4jo7?T^ek3cMIZhvmw^eZgO`U(t zBOKEh9QjckxkrxKNp>fluOGjgq}7?0ZY1wv`Z@O;8$il_CL)JXkz35@SL4t9sie>7 z4uXuYv|#2Qhl^V0F82Oli{p}}+8#DVMw(O!z#lYo=6Q}fFPT9WWG1l-%qHpg(i|m9 z(98B~cZfULR*{iTYy4QK47KZ+-G+I5oL1asv~w&Kjly^DM*D{9WYf@DWu7>P%v_Y~FB$5b)l+VL`PM9v)wZX5+RbzmnY3JU^Vl?2 zsb_wbFPW+yq`&G6zll@abhp{v^)?I)uSPfG$>n<7%3S)mA@KHG3394>R&sMOgjd=K(Y;nLce0bC;9y zAr5OCRh2~d(_Z4W3s`>%oBU1pKZEJ^D{V`>(m~@bdW=JE6L!DRv^UeuR!_9&oE)Yy z#-XN1xLX>8#}1VXrk_*P$!Ct@FDs&*SLKXd?md@r(3`AXL1Ra)Z6DbEFve?rB0FK| ztf>DdPB}B0-ZCCcZKu;+&TO!j1UdzsmSz-n*2Vlzzxy@n6pjaS;f55AK%JMEf2lm! z7pMF{o|{c(f@X&y9>FjfoHD^Kb>mR6_xxWsP72yS>9 zp{l==$#Gi3cE%?k!#k(RBPYyxNSC+=Y}F&n=}h?M;@I;TW0LI?ZyYy+HQ=$~@J5dR zX8r}xl(9_g{)b|{;r1|)c&%qjc7jM`Fkk!*=UJ0USbkV*6P^Asy5pKQ*?Yx)VdA9= z{@dTFZ+h9S?rrWAv*8q1aI3oDGtB?0|FkSu{GxqhOtAghdo#U%+P=4*)Ub?J>f_nzyVtL--(8=9o@tK1 zr>@!Tje7Uf+mv@p^i!XY{eJS?*DKy5nT2gpIcVlPYvrVka9g^oaRIlTvi|4%Lyeo- z=j|KsN$0X>0v>3ytjBwF@Z5CTn?8EbUFS}*nQ-V`Rr>|J58B1nEvts)6kL3(4w?16YQE=pF8XzCTQWN zy(6A#p2Pt< zLwY%_q2vu5?z8g2#wU@v8{}`0`tu($D(z z_O!`d=l#&*>mTUzJabp(0R0vgy_UO)8E@m zQ_Mb1wBx<+xIGJUm)dbA$tmG<#3_|9xjkb|2dU}IaF)qo@0yHl?tYlFpDp8ty8U&P z>Fg8eyUBA_1HE;;HZwUrN5&vG5%*g~AG(FCzkFeGJHtH#oEqfErAN<7$HCnoY`fLx zwBH2ZV4p%hA2^Y2hm0i|MVPyEC z{mNwF7PcoH?Kr%aKet9-FvnbDb90kh-i*Z~*5&?W1-DFlZ6Q|a%XHG^etQ@`Yyth- zCH;#Ia-;oOe_`7HObR%?ogTP@OS+JIpJ*z-4Nui}DsqnyV=mBp1j%b|4N6E!4YYgQ zDcsvk<}S4zJR6Kog^Rz9&m5Y0*3I$X)U<|t!@d1BywU^i49l4?(?*Ws-8<`MTbQ~T zi(0%gskp;oOkzebkqTt(W9&JPd1-Q)bhti=X~uFpL3i7ywlV!yb?M9$rLfsezq!;t zgzHR1&Xi(+2WfY1I) R6c)kuZMgU8%=~+f{2#xTwtoNs literal 0 HcmV?d00001 diff --git a/static/js/media/disconnect.mp3 b/static/js/media/disconnect.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8cfaff6c06253a8b9bbe50dc0d5d05c4a25b6fb5 GIT binary patch literal 1586 zcmeZtF=l1}0w$Lb&k!RZLl%ew@(T(w^U@W3GE)@t(|}Y#QesZ7LU2iDa&}0hYY5S_413-^&w3C0*Djhb23xn^V5J7*a`8)ASWpJ=BH$)Wu~SmB<7_k z6s6{7Rsh*al?v|p`RO^S3Z8k%dPufLL`2Zb*8jgJ9D#TfiS*1%%Lj7#ftZPbf#nH9 z1F7IY$pC1VrH`YptFfM?MG@m!m}^8DR9FR^7#JEr?kM%Ux(OyRQfNp73G>`{+H$;s zxkPL2cI_uj3JklBc57@rmotr*p}~Z$azZxO{Z_Yd)K#$9}OR$+G?)epB%pW=1n=9LA9novfgAxAg&B5r3P5q7BqM|4 zJq4D7AL>8#cC<1JHasZM5n^`|XH`Cur-!_&v-`oU`xo3Bym%oMJl(@(rk zz5iKR$jfjc^J0afDaZf+KUaCe<-_}O-YGLgP8~^pYOepj{wS>@uLhL2WnW(a5)@E z;qYN#V4nZ`IVdr%T=9Upo1sI1`QigNhF35D#NOXq7r)0EB=yf3vo1*}J(-=+!+T*82Y~&8rv|a9m(8N=ka|z1Y&Q=V_j-ypvF)=>Ol7 zj&L(y^XzB(bG(6rfx!fnR0DrytVsHHc}i8-zc?)r;_ghVv{s;m3N-HP@+J()|YZPUw6 zn|9ZhUuJ*Q)NgIkxc0T_d*!`?(45zdVWj|ks@h9nmi z%S)9qm8`fNbA{=F@Q4NCr1+^mv3csb-{sYrRKuq0QWCzs`-*~Pi2QdT5?9s1IJ z==PG5{6ZNjD9%~u;^tHui`$awf>2-w+$7XmHPt9V5E_EK7KC{p$rE5EU3#yVk8dU8&-?e~lrL#vY_9vP49 zh1BJcBxd-IZ;wU8hI;^Wj z39OuIp-2^|iEKYi7o4GAKEu3nEhzcR&=lXuYa8N4Vxa_zI&)WrY_>u@TTz+TQj>AM zGVOd##?6|{r#0D(+Gq7|m3N+!)uB4-g0!vSH_u@mfiHJ_!tYqBsqI;UUOSub@|cd~naH!J^Ckp_lu;98(Y%m_n8|xxVY4YF=8i>|fWIJ!2ds25dQ6#vCmR ziYJ0bm7yLE3y&e-(-X#mgxPCe*dxNA*+s zCs+91`Uh>@^yAk*s23j(9_ns6?(ksYWWXHw5*t5eZ96ulS4|4M^d@I-pU-g*OZPO4 z1uPi6Z2{RZPd=^p=)ScZ)}~GA=T8pNp;xav9y~B4cJg}$i|*eVCO_ccgBA539ajud zGokmtxrWcLP|2~M!zTv(mVJ|9Yu%4lYTc!DRu}8Y>hia|kF;^eFyrb&+HH7u^-dxn z*i^pXp*e~m8kz&e&l?AnohUXo9pH?IygLzbIh1UAMkb>c`$lM6ytshk&`3b>p@I2# zRK5HJg=xT^zSg88aLnY4C~zv8+ZgK};0Ti17Uej00;1wY$NhKE)fKC*y-=_I4>QGw z4fR??m}o<^L@e1=QIz(!`u4e+%$w>vvz2#d4`r>a{W-9Hj2r}lM&pP{owR{FYN*~3 zM|C>*dE}JQM-MYE9S%zD4-!s?Uip%j{DgPSH$H_Y6!~Rd^HX26tGi>h6s$Ym4GDHIT+PQ=#*PkM%EkygtX6+h5Q&3vdul63z2hy z%iIFd)E_E*;?yzv8W^-Ze&ve}K#&WKUWtx#B!vi@AtGmpFo`(&mm>zKGd$sS9vJp0 zf&?JQ8gR0Pc0kz}R~)^Y!krItYv;SSf5_0Bpl$HtFApqlj17)H-^3sBdUBTt@!OhI zeTcnDi!Q&|^{U{(W(pj8u1E@kRB^|+A2O7af=g{%C%M#C-55XEbYxn9g*7uaVC*iR zoH;}1wBV9a$4ETTYV^sex4@n60_@P31iX$$5504b*JAEc=}L zPKaDDFX%XF)`ytQ-R8j}bFU?%yg?(G@xKYgmVa1p4zC(Zq#W^?GN{+@5m zp^Jkj&BK=Q{=VbArxpjlST+*6I9zJ(?LF21DM=l+EZWKzhr{3K!Y+56dOX}cJY2ju zTsARS#OyRb{xj$D#lG?WFBXT_pH;I`Bdi%;(lx^Vg50knR$C75L){!%PMomo>H$WZrjSfjhg#L-Fe!JI{Fr1 z!-d3#?|4i*YweP%%`S*LYk@AJaja-Ljd+Y2#awrmY6os*>UQDI> z_#R9*O?b4McH)Y5ot;pe>AE5P3^n@W@-W?WdO^4CMtZ}F99qPJF?UixHJv31z-pn* z=pBcfjPyi2EOi2a+&LYa&~5Y)3AzV>mC5Lzh;s+&8O2;X6IK{~G6a~7E-DJM>DSm$ zV0DQU?vU}IMF*^oRX5?dS`_kf}S`yF#nONF!Gxl={=;3MEFCf-WvKk6;7S1rASN_Rn|rxA!OLb))A8eIZZji z=TPG&_`%)Eq&N(dOvF;y1Cx9Vv)cI-w#h${6J||SU>Il-26=}gY~6+RRu|9ZX;fq@ zM6nHpbH_cv#HgNP80k5*KobM}Vxs4OZ5b->I8H#$WNZkg*@<(o8X7KOn;Aok4R(#6!I(| zwxmPu{V8ndQ^z^NMjAbk7)B?^<>%9+6a0rv9-NF!jW@?;sP>Md_`x>dUp2vph870| z$oJZ-p)u*ENdkdCLSYOum6HS=;fWv|NU|w?DY>fshuh%HT!QQ)&rF=}(XQKu*-%{* z0pdWVZlxF4&YDURbm^a>0FA=P3L3!5mc9kISa&OWSth%*Cvp}*JTR|U;6PAZ8A6bc z-8_)KrLV+q3}#R{yj+J8RVbLTfm=(L9^ft*woou@3*4E&<@k;9U&DhJ!LP;HI-jL{xw7`ztS7~aohei#!r+o{~4`BmJFbv=W z5v@zdkEsZP!!|XON5_qHJPdeyuuXQN0Hj1wOlNP9qHe|}U?zL|!7vCp96qHDk+lR& zvEG#SaE;Rh#3v)C2LdQv0b5suVFPw)!vNSHP6)g7V5B{L8FII{6sbz+E2}+feD~tD zyAEHoAlZ&{Sev{U5a5e85-qH)IG~Ee2ulNQaE@sje;lJlEjXbCfLd_Q)9s9NK#S52 zW7sMHS%{;@h91?Kz&XIE@qtuM2b`T_IvuB~7|+1#y7C{fsOj zz{;4>aZPj)p?GMJHl!rC=HT3s9$hLPa(Mr=vS*-T0`9^n1qr9IHoO_*LT8MDAdM@A zwDnz>;=bzYdfz9))5~*Iqneg4MQEBaufuh_y?lJlZ+1wdklnAoHs(>~b?DI9gUcR9 zTyV?$SdD5>S5}?Xh2B_I?OXi%C(D!1e?X0jH+eg+?k>n`1Zi511_tW+TJN`BYNQ=r z(d2W)R|oJ#kh?BbFCkSyZgq8adD_mAxuro{b2Y{f@4K=cWU`@9oL3cBN8fR^ckOfD z^bzuEPm1|>w_|Q@ksEjs-21DtM9a4bw(lQ$T^5vpsgAwh$FP0t|NZ&Yx3dg=Q~&Yn zAJV=b)&A*9)ZZKS*yVrF=6&{$>m@zWSvjBG{`^Ul@w@NlT+MCQ{&bV^hr2tr{ZT$- zSggN2;y3yIn$b~* zgNLCjQ~p{Ichf39wd%K1kN#Tqj|ZNc_CGQ$_ga3M+4TDSjg^T-Pu*T?{o>qrZ{M0< jxIK41^keCb2kVdh=ifJXu}>c?xOZB5^2z7YcaZ-Bex2=H literal 0 HcmV?d00001 diff --git a/static/js/media/disconnect.wav b/static/js/media/disconnect.wav new file mode 100644 index 0000000000000000000000000000000000000000..af5c25447cad1a7ebd705e0f28ffbc4ebec01f49 GIT binary patch literal 1492 zcmcgse@v8R9Djbiciaz^Ls1l@Ugwr2@*^}OGz~%I%0mZ-QkeuC2WQ9K0Y~UYx-47F z)a7)e;WE=P*TBL;@<+^7&eSBAzbaP~Jp?=m9rug(eV^y)IZjqvTYvVv`@Y}L_vh#P zJbT`^z?hr+qY8laS?g9>tKFgj008-u(+0r%#SkE10G3jBX{^8l;|l`D!a0onTPVYT zjz`0Yj0@sb5eq%430ME^iCE#-BZ5a!g$cYvq&iah&z=$Xi8(0Go0ux%n|SX7C&5lI z1!S^vdX^j{_sLm0#1i2gv|}`Hbic39e>I>4+5-Cmoq=NAm z757*5CG~X=Y#yd*dUkOB!04bbG7y*ptMvU-d*g)o z!*Q2mzS1Uuxxu#{T=!<*Upp*}PL;ag*HIUB8G1$YxZt2Kj_vVx_!yUOFg$qe#jha@$x#a7rNLuL`C~edGzGQDJ zRU_KN(#R1xLssM#vWV>l80F&%Ay;)rwO>^ul%Ym;TuGPC1qb|zeybk^)zT&6ga?G} z>K=86Y5~5=?kESO7sfV>d8I<~1^7;|YT9($^qIP)QOogcW|eP;wgiiUheJv7Myfz2 zJXE(tiBV(18JJAZNlQb?!SrBaXpS_j#DjTwi>h6HQr)HM#t!%{GtdTdo}8k+Y(6YU zX554K;?2kaJK3xBfif(o$g=mx9@%UCg$$znP}Z?ij~6^7tvkbrhpLYI>LN{doRHqqlu1AVXr?L-a~hdzSS z;Z}aT%h)j*P0x{5a)s2;Z4AR^^d(mC+c*Q|gH&o)n&ci?Anmjn%tLwjV?2ts!y(p5 zLqtn2(W@*LO0X66pbtfY)IQ>;>Iy84W0v%08u@{7HWWJJIJ@E1bYyKDmz_ zrFY3`VxX7lT}Hqle2=pip__04KZ|~5;S9O-8tEoU)K9->UEmm8Z7ejO;vcRtKX;8W zKg;wO$7`J~m(5WruC`f3rdropdown-arrow \ No newline at end of file diff --git a/static/js/media/handclosed.cur b/static/js/media/handclosed.cur new file mode 100644 index 0000000000000000000000000000000000000000..4851755a1690d6631be7c32dcc7e001e6372aafb GIT binary patch literal 326 zcmb`>ArgZy5QX7CK}5#YAc(B&4cephDBOgraFhrH5{cWsZDtreZ06gynH32{0;NO} z9j^cn;3-8u5_G)Ae{U_GW-~k8u8*mL%Q9^6c6*bRZdjrJa+LmXTW#6QRhg67=(=WB LR`K-RGPP%aOVoiS literal 0 HcmV?d00001 diff --git a/static/js/media/handdelete.cur b/static/js/media/handdelete.cur new file mode 100644 index 0000000000000000000000000000000000000000..170320fc281ab02ded109f0310aa180b77e465f0 GIT binary patch literal 766 zcmeHFF%AMD5F9v?Yp*cIl58w|z?Bw6?qT>6zj9Bx!ot!YtV7NVgxDBcCk(s8u)7HX zurTm`K#vX&3+w@$NKXdRz;P$&Z5XzMF{K1mWu^!r$3MP#feGL$h{26T0d9<;Xe$zH zyVWAc`hK=AyHX$`lT`DlMSN-BYBYYUZ7#3struI#()e@6fAbs8EI*J})n~VIF{(3v TWO5|WGG}sm$GKO%-`24&Q~QG0 literal 0 HcmV?d00001 diff --git a/static/js/media/handopen.cur b/static/js/media/handopen.cur new file mode 100644 index 0000000000000000000000000000000000000000..da44588b2fa68ee115deb843e1ce6802e58b3e30 GIT binary patch literal 198 zcmaLQu?>Sj429wUKPx#1ZP1_K>z@;j|==^1poj532;bRa{vGxhX4Q_hXIe}@nrx202p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-17k@~NpgWidAYDCB{xzCg$v62`}%y(^E=vS&YW}R zIA_L8olku(cINkc=DV|JXP$Y^G}Nh61N!>ipY&rB1d5HUQ4bI2$I282@AHyK}XVm^?T%-*F?qH)ui3Sa`u+&-jj0bVL zwS>a{9u)_eXS=n3rrYGvYrCUE(?!=C$~~N7r6r**{=hU$!eUp0yVzo-WuZ2a!0TLJ z0iUql$|6C1B7u*(z5;rzBr@u8tsXTG{K)kcu-Hl>Lr)@s-@87KpE%k|B12ESfhpGY zG3;Xh#!4!JzSsi~$FRVUt)wF8i#@RJaGEUzd1)mTL0=-D;U})oL-+S+_w|0zlStr` zuFper(`8l?8F~^4yx#Q{p!sm*rv^cNB7rAkezxBq-L6+#StO{BKd_+bit8;vSCCa0 zY5GT9Vu3rc*z{6o|2R&>lEK-ZSYTb=cIDcOqqBV;b;c*)Kx_XC+mZ<^Xw>uEh1?M3 z(Pi%y>IrxU>dAU7-oha91Qs;wR(&KlOzns-a2^KHg2vO_aMcrkV8KAcup6&q*zG$i z$pr2XgO0I1COn2=!MOfm$0Ig(ombIs%8m!4J6% z9;ps|z-91Ab>Mw2gGZ_Z?{yhGQXP1Y%ixjfz`I=rk5mWV=`whvI`DRv!6Vgyx48@+ zsSdowW$;LKV9hmx)X#9u;NY423}@~tk-6(|=I(Tvn@ePFwwAg1aOR#kGWSdu`sKLo z*8VwelZU<B?g=~xQY`6?zK#qG8~eHcB(eheOiAAE zE)4(M`_JqL@;D1TB8wRqxP?KOkzv*x37{Z*iKnkC`y)ekTZU8^Ck)Z(J+#Hpl_C8`@E!djcq-Ly@x zBTzylkXvz~n63)P!qy8)8Rakc|JeFrpULw(GmRfFOaJ>g@m}$>%6o-+icyuvlA~g# z-8f+KK4L!G`48+3hav)4p7 zzhyRSJ2=bg?S!2ha%)7txbUp$$h`W}H23r#(QStdzbxEfJ7dT8@RqkLEi4oc2y@w8&^UpAiJqTb`*wXihmckC(N^~E_!2Ny5bExE#6ALuRd zy)(Du_(8FG)eqW3W)~e^y#L7IcQ=lf^Y5Ly=2L%Cq3Y=y=WjMq@3mx?nq_!+$Msi{ z_qVCPzL>Gs^~U+0L-RJ--s&>VTfKC@$v?X(HxCQ4NiLkf_T=)i&OWx7p;d1f*Kx8c~vxSdwa$T$Bo=7>o=IEp!bmb&ZTe3@xpU%&bf-v<(cb3=AX= gELw!3AvZrIGp!Q0hRnHAazG6Xp00i_>zopr0ACYJfB*mh literal 0 HcmV?d00001 diff --git a/static/js/media/quote1.png b/static/js/media/quote1.png new file mode 100644 index 0000000000000000000000000000000000000000..826583e0ad72dd1424a2ffe9e21a8b653b596058 GIT binary patch literal 738 zcmV<80v-K{P)hppyUq0&_`3K~zY` zwU*CIR8bVizi%)dr%W2FnSNk}mX$CPQd80l=@=9tO1LP9gf>Aze?W_ZAd3nT+6Pk9 zB8q4gJZRIxeo$192pP3d(M`3B=|$fbGxNOndG9^1MQ3#neBSq+d(J)QUf@5Or#j4F zE9wy-zzpWS-|kPDMh6-ZAix6Vys`~za&kJm|imv7ub-TtLCa_4e4I5=UIc=oR zMZp~HHelG>w3R-sf=NDc2!CO_CY#_mUAB7>EzoVZHQ_FSe#`~{NC3zSC#Rbm6>q&j z@5Sbta9Kce=vKUpKxc5ECM?@Y)`jaPksjiTxWXwc3)c%Gy#>t`;U6*3bhw@s=`#LQ zgx|zK7hC@;CdDkb013dG#HfHafZ=eN#h56ZuI2a!d?)%Hf#Ti4gV;lk^&D{=`uAKH z>As_!bMQrNY%+xcO4tP87l0Fr(gz&zW+I^^kw+i4SLqVeU+?i=+xKuriC~HwgdGn= z_h&iBtV2O@KjE8@OLZ0puFhMItm66JPiMSI>{r}(jwa$xtr%TGBJ>G;*cI`RvVMxs zLL&On7Or35l|6!X?J)HV@n-o}p+{V2`o01_tPF04@MVR5#+7#Pn08lp2(l%u8a;OK zp!ISz(Yv&yU9p3`nyiop<}_K~ng$MQvd`J#lr2W)iTQcM6h}31f?4O#I;+uB+-3%Q z`0*cPJNYsaZJP;O!<&(@=W~@+w3!zp^n`Il@%WNyddXfg_AZ&jjk(TlN%G=_dLieUI)}5eKVv-52W;%U3({kc=kzi09cD^L9+|y1X;sFF|f& UTm9BGZ2$lO07*qoM6N<$g0UG+&Hw-a literal 0 HcmV?d00001 diff --git a/static/js/media/sprites.png b/static/js/media/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..20aadb6c4c31f4a46f0a3316241788687c2fc444 GIT binary patch literal 2595 zcmZ{mc|6mPAICr2%r$G9Gq=d~t=uisVbfeWBNdTjj>;KwOlgg3o6w=$VTiUQqA*5Z zqeBNdlP~3NLYQlgzWe@uzkj}e{Qh{qpO4r3{dzs#|Guftj@EE-1#tiX;I=k+7Xf_) zby-wM&<|a|;wpep5Y7Py09EO*O<$-$s}XEm8~}i*1puUE0N@Koq-g-SWB>qM9{@1R z0sy&)yoTe41PidAoi!f#eKY-ivp|VO*tkatF7^LYAPb$`IKfQF7LPj-H#nOY93tH> z^E&<2Kvrjs^Dl@_DIESu)`EnM*Bvjyqg;;QL)~h5irx$z88=G~Q?ZS;dNuY=N~)rP z!{UdRCeJC3|^p@Y^MmSaw|O zqcgnH`mt=(`nwksF1OpdRwptSWL&g;<#Vt5VHL)|uKRA9#vdbF_=0_?$=A_m z@F%rT_!cE|G&D6rw}mnJ1_l_g{vf!~zq1Xc|EB$kXZY!_p79<2K9Yrd(OT{Mb{mHR zIvKG63$q6jt50+|q)^*;#+gBVShnFY)z5nDzRVi4ozb?LsVO@_w2}`s^Nsd45NuI& zhpaC93Xq=!P!5F+t|m_?X^7vZ!l;zS{DCNSO=s(#>vwURfgYrFL(a3IT>5^I1^Q*X z;)RoYq>tsN>gj(j@5Vm}xi@}SsB{RVwp&HMV7`=duNpIAN9DD77D=bx@cS4V-&vPO zs5T{9CdzxiGP{x8MkGN(d=iBWQ`V%DcFT)=J1o)t)H3Td!oc1LAK_<(d3rW6p80;H z#aIj?rO_f63gW^WOh=(%{(Ndk<7FM|l3yoxnrDV*OW1=m7B0}%cYUk@slC;DWXDJ- zbzq}6+noaUhkMwYaDbO3K#1{=500{dhi6mjFD;htRSp}2)l%ASo_Jf3u6|gk06e31F|)O_QAS*Z)CL|=mx)^$~0VZ>4RvI2=-oxLwg~Smc)R? ziic42uNohoj(`9tgiNDgQA$gb7jWL6o!tQebl792!%r&rX2iIfd zwjCA3av?iKJ}2lJ8aH!`0%DB+fVum7^Xn%nzYa~JUtU>O2ppA|Zv3&d&9bUmk59Wz zU5`&9r68bYF9iuIr-eb;&1xz9u|eaG%lNMHX%7WXx1|oiTEa z>5u=TY{rZ?nC7g%a>`NFGkxo57ecI%fnP_0QMi=h$usgg0U#K-lzo4ICX2@=XH+sc z?g*KF0<%eFSi+hfrgUltlJ2H-Z zNgsLbj_fx9j~L$hL?f1QThz~tgbFXL+ABGfgeeV!y6)b(&XBAjndVe&>reu7Pyf=x zBRL88M z)}J=R;=En-&;r8ZUsGq!E5bTZI30ysLn0@>FMiMaxg|*of^qCKqJSvJ z0d>D!A)AgP2XVYFBbH^}&?+aq&<1wvLZ5NZF6a6EL3a$E&MWZh;|@dmkt_PPY2swc z+FZ<9_A}S`S(YM7D3}&ZL*Y5Un?gWzqSNAI^s+V*l+rQuSk)OZIwLDY;!Y&bp^z16 zThcLSRSRV}#c|Rc5zKweZ=hGB3IQi{K@~RcKnG~SYLwuCuxQAB7^l~i#Xn5RuLq`; z3x`vtuuU4;q_@_T}uEHsg z*4`$9M+;xYYtcWMNO>;}oflgzXxnCsdQ{_X0K-Pe{Ar=B2@EJBsZNI*_oq#3H~VyO z1+Z!ok$uzv#fhVV&1M?SNP)52x%dd@WR24 zUs;*7RYd??6)qAX(T^L;oAxHFSVQ#WgHm$*kXwB_I_3T3&DJ&FrTvwioMQ7?w}NWCd{15EH?+j(m|Bqcpc;aWOw>o##G#~R~B zUK2Wj&~kbSK&DkUi_rUF{iq$AEzUzRN$hp^Ov$CFzCgWie8o9+7{CS_K5>u>-XXU?4pmmDU ztF($Uj}mD;7m=xN*ZW;doJicbKz@!Nb9mH-kEnvphMGQMR4LxYt-BP2MOr8}%g{!FKX!$g&pF<7_#5Ou0bt>ToPvvMIf;;DVHCXEYR{K)FG zEnpihSH8kHUn+U2iLU)o$`?z z?v&TgUglV~^_d5mvWG1PRPvjab=@BKopM~Yml!&Z@v1m=-&Bk&>c>i&w<7pjKM_7i z4O-r^YC0m*I}`em?^|CtlgnTzZ-0t#cSAfpe}nN7yeacKvaa!Lc^~0`!h$)k2vJas zVl6|mN7CebXQZr}Ji;q~o8Mu*J6`Z0{e|F3(u}q|9qsQM9biU?3=jY?GB7mVXMovf zWPHL9V`hXlGcny`U|?oou(O3u|5qS1-2Z%F{QnP}&sR_p1myp@;2Itn9qStz0K~?| g>YWb@jw1L*1n7lF2IbBjQV^H`TT4g$QwtyR-{S78%>V!Z literal 0 HcmV?d00001 diff --git a/static/js/media/sprites.svg b/static/js/media/sprites.svg new file mode 100644 index 0000000..3f09ef3 --- /dev/null +++ b/static/js/media/sprites.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/js/msg/js/ab.js b/static/js/msg/js/ab.js new file mode 100644 index 0000000..c0e9d01 --- /dev/null +++ b/static/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/static/js/msg/js/ar.js b/static/js/msg/js/ar.js new file mode 100644 index 0000000..56cec0e --- /dev/null +++ b/static/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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +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"] = "https://www.december.com/html/spec/colorpercompact.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://ar.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 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://ar.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://ar.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://ar.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"] = "عودة قوس ظل النقطة (س، ص) بالدرجات من -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://ar.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"] = "تقيد %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://tr.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://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://ar.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://ar.wikipedia.org/wiki/توليد_الأعداد_العشوائية"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = " عدد صحيح عشوائي من %1 إلى %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ar.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://ar.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"] = "جيب تمام"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://ar.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"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اسمح بالبيانات"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "مع:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ar.wikipedia.org/wiki/دالة_(برمجة)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "تشغيل الدالة المعرفة من قبل المستخدم '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ar.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://ar.wikipedia.org/wiki/دالة_(برمجة)"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "القيام بشيء ما"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "إلى"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "انشئ دالة بدون مخرجات ."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://tr.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"] = "إذا كانت القيمة صحيحة ، اذان قم بارجاع القيمة الثانية."; +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://ar.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/static/js/msg/js/az.js b/static/js/msg/js/az.js new file mode 100644 index 0000000..d7a5443 --- /dev/null +++ b/static/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/static/js/msg/js/ba.js b/static/js/msg/js/ba.js new file mode 100644 index 0000000..0e2ca7b --- /dev/null +++ b/static/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/static/js/msg/js/bcc.js b/static/js/msg/js/bcc.js new file mode 100644 index 0000000..9e6888e --- /dev/null +++ b/static/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/static/js/msg/js/be-tarask.js b/static/js/msg/js/be-tarask.js new file mode 100644 index 0000000..64ceb12 --- /dev/null +++ b/static/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/static/js/msg/js/be.js b/static/js/msg/js/be.js new file mode 100644 index 0000000..dd82192 --- /dev/null +++ b/static/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/static/js/msg/js/bg.js b/static/js/msg/js/bg.js new file mode 100644 index 0000000..9fd8214 --- /dev/null +++ b/static/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/static/js/msg/js/bn.js b/static/js/msg/js/bn.js new file mode 100644 index 0000000..1a672ce --- /dev/null +++ b/static/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/static/js/msg/js/br.js b/static/js/msg/js/br.js new file mode 100644 index 0000000..a6fc39d --- /dev/null +++ b/static/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"] = "goulenn un destenn gant ur gemennadenn"; +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"] = "dizanv"; +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"] = "Takad labour Blockly"; +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/static/js/msg/js/ca.js b/static/js/msg/js/ca.js new file mode 100644 index 0000000..4a79936 --- /dev/null +++ b/static/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"] = "Els blocs plegats contenen avisos."; +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"] = "No es pot fer servir un nom de variable buit."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Reanomena"; +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"] = "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 l'element."; +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"] = "invertir %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Invertir la còpia d'una llista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendent"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendent"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordena la còpia d'una llista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabètic, ignorant majúscules"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numèric"; +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"] = "fer una llista d'un text"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "fer un text d'una llista"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Ajunta una llista de textos en un text, separats per un delimitador."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Parteix el text en una llista de textos, trencant-lo a cada delimitador."; +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://ca.wikipedia.org/wiki/Inverses_de_les_funcions_trigonom%C3%A8triques#L'arctangent_amb_dos_arguments"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Torna l'arctangent del punt (X,Y) en graus de -180 a 180."; +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"] = "en el text %1 %2"; +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"] = "comptar %1 en %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Compta quantes vegades hi ha un text dins d'un altre text."; +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"] = "substituir %1 amb %2 en %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Substitueix totes les aparicions d'un text dins d'un altre text."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "invertir %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverteix l'ordre dels caràcters en el text."; +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"] = "sense nom"; +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"] = "Espai de treball Blockly"; +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/static/js/msg/js/cs.js b/static/js/msg/js/cs.js new file mode 100644 index 0000000..44219ef --- /dev/null +++ b/static/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"] = "Storno"; +Blockly.Msg["IOS_ERROR"] = "Chyba"; +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"] = "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/static/js/msg/js/da.js b/static/js/msg/js/da.js new file mode 100644 index 0000000..2a53b43 --- /dev/null +++ b/static/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/static/js/msg/js/de.js b/static/js/msg/js/de.js new file mode 100644 index 0000000..272556d --- /dev/null +++ b/static/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"] = "um"; +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"] = "unbenannt"; +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 Arbeitsbereich"; +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/static/js/msg/js/diq.js b/static/js/msg/js/diq.js new file mode 100644 index 0000000..1a54f22 --- /dev/null +++ b/static/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"] = "Pê amarêno %1 %2 ra %3 rê , herg gam de %4 vurnayışi"; +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"] = "Na fonksiyon de dekerdeko mukerrer şınasiyao"; +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"] = "Lista de obcey sıfteyıni tadano"; +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"] = "Lista de obcey peyêni tadano"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Lista de obcey raşt ameyayi tadano"; +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"] = "Lista de obcey sıfteyıni wedareno"; +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"] = "Lista de obcey peyêni wedareno"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Lista de obcey raşt ameyayi wedareno"; +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"] = "Lista # ra lista bınên bıgêrê"; +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"] = "Lista de obcey sıfteyıni eyar keno"; +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"] = "Lista de obcey peyêni eyar keno"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Lista de obcey raşt ameyayi eyar keno"; +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"] = "Kopyay yew lista rêz kerê"; +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"] = "metini ra lista bıkerê"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "Lista ra metin bıkerê"; +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"] = "Arêdayışê dı amara tadê"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Letey iya dı amara tadê"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ferqê dı amara tadê"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Reyina dı amara tadê"; +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"] = "Standart ferqıziya lista"; +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"] = "Lista de amara tewr qıckeke tadê"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Lista ra amara werti tadê"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Lista de tewr qıckek amar tadê"; +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"] = "Ercê mutlaqê yew amarer tadê"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "E quwetê yew amar tadano."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Tebi algoritmaya yew amarer tadê"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Logaritmay 10i yew amari rê peyser tadê"; +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"] = "Karerêçê yew amarer tadê"; +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"] = "Derecey yew kosinusi tadê (radyan niyo)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Sinusi yew derece tadê (radyan niyo)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Tanjantê yew derecey tadê (radyan niyo)"; +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"] = "Seba yew numreya karber persiyê"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Seba tay metinan karberi persiyê"; +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 heruna ra zerrey %3 zerrey %2 ya bıvurne"; +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"] = "Ercê nê vurnayoği tadano"; +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 Caygurenayışi"; +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/static/js/msg/js/dty.js b/static/js/msg/js/dty.js new file mode 100644 index 0000000..e175073 --- /dev/null +++ b/static/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/static/js/msg/js/ee.js b/static/js/msg/js/ee.js new file mode 100644 index 0000000..1782e69 --- /dev/null +++ b/static/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/static/js/msg/js/el.js b/static/js/msg/js/el.js new file mode 100644 index 0000000..aec9b1d --- /dev/null +++ b/static/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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"; +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"; +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"; +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"; +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"; +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"; +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"; +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"; +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"; +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://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)"; +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"; +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"] = ""; // 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"; +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"; +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"] = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό."; +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"; // 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"; +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/static/js/msg/js/en-gb.js b/static/js/msg/js/en-gb.js new file mode 100644 index 0000000..5df6b17 --- /dev/null +++ b/static/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 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/static/js/msg/js/en.js b/static/js/msg/js/en.js new file mode 100644 index 0000000..307dc19 --- /dev/null +++ b/static/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/static/js/msg/js/eo.js b/static/js/msg/js/eo.js new file mode 100644 index 0000000..40c3598 --- /dev/null +++ b/static/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/static/js/msg/js/es.js b/static/js/msg/js/es.js new file mode 100644 index 0000000..7a21dda --- /dev/null +++ b/static/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"] = "Cambiar nombre"; +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/static/js/msg/js/et.js b/static/js/msg/js/et.js new file mode 100644 index 0000000..9ba0105 --- /dev/null +++ b/static/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"] = "Kokkuvajunud plokid sisaldavad hoiatusi."; +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"] = "Sellel funktsioonil on dubleerivad sisendid."; +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"] = "Loendi koopia ümberpööramine."; +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"] = "Pöörab tekstis tähemärkide järjestuse ümber."; +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"] = "nimetu"; +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 tööruum"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Ütle midagi..."; +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/static/js/msg/js/eu.js b/static/js/msg/js/eu.js new file mode 100644 index 0000000..a56dea9 --- /dev/null +++ b/static/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/static/js/msg/js/fa.js b/static/js/msg/js/fa.js new file mode 100644 index 0000000..76672cc --- /dev/null +++ b/static/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"] = "بدون نام"; +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/static/js/msg/js/fi.js b/static/js/msg/js/fi.js new file mode 100644 index 0000000..827ee88 --- /dev/null +++ b/static/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"] = "Blocklyn työnäkymä"; +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/static/js/msg/js/fr.js b/static/js/msg/js/fr.js new file mode 100644 index 0000000..27b0f85 --- /dev/null +++ b/static/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érifie 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 ne peut ê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 « set %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 « get %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/static/js/msg/js/gl.js b/static/js/msg/js/gl.js new file mode 100644 index 0000000..c8e0636 --- /dev/null +++ b/static/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"] = "Duplicar o comentario"; +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"] = "Crar unha variábel de cadea..."; +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"] = "innominada"; +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/static/js/msg/js/gor.js b/static/js/msg/js/gor.js new file mode 100644 index 0000000..1336541 --- /dev/null +++ b/static/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/static/js/msg/js/ha.js b/static/js/msg/js/ha.js new file mode 100644 index 0000000..f4da57b --- /dev/null +++ b/static/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/static/js/msg/js/he.js b/static/js/msg/js/he.js new file mode 100644 index 0000000..d51124d --- /dev/null +++ b/static/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"] = "קוביות מצומצמות מכילות אזהרות."; +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"] = "לעשות שהערך ‚%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"] = "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"] = "לאפשר פעולות"; +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"] = "#"; +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://he.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"] = "תחזיר אמת (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"] = "מחזיר את הארכטנגנס של נקודה (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://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"] = "הגבלת מספר כך שיהיה בין המגבלות שמוגדרות (כולל)."; +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://he.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://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"] = "סטיית תקן של רשימה"; +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"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "שבר אקראי"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "מחזיר שבר אקראי בין 0.0 (כולל) עד 1.0 (כולל)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://he.wikipedia.org/wiki/מחולל_מספרים_אקראיים"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "מספר שלם אקראי בין %1 ל-%2 (כולל)"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "החזרת מספר שלם, חיובי ואקראי בין שני הגבולות שהוגדרו, כולל."; +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"] = "החזרת הארק-קוסינוס של מספר."; +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://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"] = "הוספת טקסט למשתנה ‚%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://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"] = "ללא שם"; +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/static/js/msg/js/hi.js b/static/js/msg/js/hi.js new file mode 100644 index 0000000..4d02ef4 --- /dev/null +++ b/static/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/static/js/msg/js/hrx.js b/static/js/msg/js/hrx.js new file mode 100644 index 0000000..0c71bab --- /dev/null +++ b/static/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/static/js/msg/js/hu.js b/static/js/msg/js/hu.js new file mode 100644 index 0000000..ad1c8ef --- /dev/null +++ b/static/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"] = "Az összecsukott blokk figyelmeztetéseket tartalmaz."; +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://hu.wikipedia.org/wiki/Arctg2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "Arctg2 X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Az (X,Y) pont arkusz tangens értéke fokban -180 és 180 között."; +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"] = "Az új változó típusa:"; +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"] = "névtelen"; +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 munkaterület"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Mondj valamit..."; +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/static/js/msg/js/hy.js b/static/js/msg/js/hy.js new file mode 100644 index 0000000..95af326 --- /dev/null +++ b/static/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"] = "անանուն"; +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/static/js/msg/js/ia.js b/static/js/msg/js/ia.js new file mode 100644 index 0000000..6e39a01 --- /dev/null +++ b/static/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://ia.wikipedia.org/wiki/Bucla_for"; +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"] = "sin nomine"; +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/static/js/msg/js/id.js b/static/js/msg/js/id.js new file mode 100644 index 0000000..d7fd730 --- /dev/null +++ b/static/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"] = "Tidak bisa menghapus variabel '%1' karena variabel ini bagian dari sebuah definisi dari fungsi '%2'"; +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"] = "Duplikat Komentar"; +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"] = "Batal"; +Blockly.Msg["IOS_ERROR"] = "Kesalahan"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "tambah masukan"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Ijinkan pernyataan"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Fungsi ini memiliki masukan duplikat"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "Masukan"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Tambah"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "Tambah variabel"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Hapus"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Kamu tidak bisa menggunakan variabel kosong"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Ubah nama"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nama variabel"; +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"; +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."; // 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"] = "Buat variabel warna..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Buat variabel number..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Buat variabel string..."; +Blockly.Msg["NEW_VARIABLE"] = "Buat variabel..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nama variabel baru:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipe variabel baru:"; +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/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Menjalankan fungsi '%1' yang ditetapkan pengguna."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "tanpa nama"; +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"] = "Variabel yg bernama '%1' sudah ada untuk tipe lain: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Ucapkan sesuatu..."; +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/static/js/msg/js/ig.js b/static/js/msg/js/ig.js new file mode 100644 index 0000000..0719e75 --- /dev/null +++ b/static/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/static/js/msg/js/is.js b/static/js/msg/js/is.js new file mode 100644 index 0000000..9fb77f8 --- /dev/null +++ b/static/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/static/js/msg/js/it.js b/static/js/msg/js/it.js new file mode 100644 index 0000000..ca75e14 --- /dev/null +++ b/static/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"] = "Area di lavoro di Blockly"; +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/static/js/msg/js/ja.js b/static/js/msg/js/ja.js new file mode 100644 index 0000000..9049d70 --- /dev/null +++ b/static/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"] = "つぶしたブロックには警告が入っています。"; +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"] = "X:%1 Y:%2のaran2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "点 (X, Y) の逆関数を -180 度から 180度まで返します。"; +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/static/js/msg/js/kab.js b/static/js/msg/js/kab.js new file mode 100644 index 0000000..c4e3c45 --- /dev/null +++ b/static/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"] = "rkec"; +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-a, sakin kemmel allus d-itteddun."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Ɣur-k: Iḥder-a 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 armi d amḍan n taggara, s tmerna n usurif yettunefken, sakin selkem tinaḍin yettunefken."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Rnu 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 asmizzwer n tgezmiyin akken ad talseḍ tawila n yiḥder-a 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"] = "mayella azal d idetti, ihi selkem kra n tinaḍin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Mayella azal d idetti, selkem iḥder amezwaru. Neɣ ma ulac, selkem iḥder wis sin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Mayella 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"] = "Mayella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ, mayella azal wis sin d idetti, selkem iḥder wis sin. Mayella ula d yiwen seg-sen ur yelli 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 tikkal"; +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 armi"; +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ḥedran"; +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 yiḥder-a 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 ɣer tebdart."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ad yernu tabdart s umḍan n yiferdisen."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "amezwaru"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# si taggara"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "awi"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "awi rnu 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 yettwamlen 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 syin ad d-yerr aferdis n wadig yettwamlen 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 yettwamlen 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 taggara"; +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 taggara"; +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 yettwamlen 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"] = "af-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 amezwaru 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 mayella 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 yettwamlen deg tabdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ad yernu aferdis ar taggara 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 yettwamlen 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 yiwen s usnabraz."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Ad yegzem aḍris ɣef ddeqs n tebdarin n yiḍ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 yinekcam d imegduya."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ad d-yerr idetti ma anekcam amezwaru meqqer ɣef wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ad d-yerr idetti ma anekcam amezwaru meqqer neɣ yegda wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy ɣef wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy neɣ yegda wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ad d-yerr idetti mayella i sin n yinekcam 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 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 inekcam d idettiyen."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ad d-yerr idetti ma ɣarsum yiwen seg yinekcam 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 d ucciḍ"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ma d idetti"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Senqed tawtilt deg 'sekyed'. Ma 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 yimiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Ad d-yerr aful n sin n yimḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ad d-yerr tmernit n sin n yimiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Ad d-yerr tukksa gar sin n yimiḍ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 umḍ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 amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ubṭay ɣef kra n umḍan. Ad d-yerr idetti 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 yimḍ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"] = "Tiggtiwin 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 unammas 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 yiferdisen 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 yimḍ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ẓar uzmir sin n umḍ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' i yesbadu useqdac."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Selkem tawuri '%1' i yesbadu useqdac 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-a..."; +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-a ɣur-s iɣewwaṛen usligen."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Sebrureq 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-a yezmer ur yettwaseqdac ara anagar deg tebadut n twuri-a."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "isem n unekcum:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "rnu anekcam ɣer twuri-a."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "inekcam"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Rnu, kkes neɣ ales asmizzwer n yinekcam i twuri-a."; +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 ɣer %1"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Rnu aḍris ɣer 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 taggara"; +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 yettwamlen."; +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 wayeḍ."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Rnu aferdis ɣer 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 yiḥder-a."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "armi d asekkil # si taggara"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "armi d asekkil #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "armi 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 taggara"; +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 yettwamlen 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 amezwaru deg uḍris wis sin. Ad d-yerr %1 ma yella ulac aḍris."; +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ḍris s"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Ad yernu taceqquft n uḍris s usdukel gar yal amḍan n yiferdisen."; +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 yisekkilen (ddan 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"] = "Ad 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 yisekkilen 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 yisekkilen imellalen seg sin n yidisan"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "tukksa n yisekkilen seg uzelmaḍ"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "tukksa n yisekkilen seg uyeffus"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Ad d-yerr anɣel n uḍris s yisekkilen ilmawen yettwakksen seg yixf neɣ i sin."; +Blockly.Msg["TODAY"] = "Ass-a"; +Blockly.Msg["UNDO"] = "Err-d"; +Blockly.Msg["UNNAMED_KEY"] = "war isem"; +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-a."; +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-a 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"] = "Tallunt n umahel Blockly"; +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/static/js/msg/js/kn.js b/static/js/msg/js/kn.js new file mode 100644 index 0000000..2f3b8ff --- /dev/null +++ b/static/js/msg/js/kn.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://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"] = "%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"] = "ಮೌಲ್ಯವು ಸತ್ಯವಾಗಿದ್ದರೆ, ಕೆಲವು ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡಿ."; +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"] = "ಸಾಲಿನಲ್ಲಿರುವ ಒಳಾoಶಗಳು"; +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://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"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "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://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"] = "ಪಟ್ಟಿಯಲ್ಲಿರುವ ಸಾಮಾನ್ಯ ಅಂಶಗಳ ಪಟ್ಟಿಯನ್ನು ಹಿಂತಿರುಗಿಸಿ."; +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"] = "ಒಂದು ಸಂಖ್ಯೆಯ 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"; +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"] = "ಒಳಾoಶದ ಹೆಸರು:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "ಕಾರ್ಯಘಟಕಕ್ಕೆ ಒಳಾoಶವನ್ನು ಸೇರಿಸಿ."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "ಒಳಾoಶಗಳು"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "ಈ ಕಾರ್ಯಕ್ಕೆ ಒಳಾoಶಗಳನ್ನು ಸೇರಿಸಿ, ತೆಗೆದುಹಾಕಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಿ."; +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"] = "%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 ಅನ್ನು ಹಿಂತಿರುಗಿಸುವುದು."; +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 ಅನ್ನು %3 ರಲ್ಲಿ %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://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/static/js/msg/js/ko.js b/static/js/msg/js/ko.js new file mode 100644 index 0000000..a9ab176 --- /dev/null +++ b/static/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"] = "접힌 블록이 경고를 포함하고 있습니다."; +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"] = "구문 허가"; +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"] = "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"; +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"] = "다른 텍스트 내에서 일부 텍스트의 모든 발생을 치환합니다."; +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 워크스페이스"; +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/static/js/msg/js/lb.js b/static/js/msg/js/lb.js new file mode 100644 index 0000000..4fa4404 --- /dev/null +++ b/static/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/static/js/msg/js/lki.js b/static/js/msg/js/lki.js new file mode 100644 index 0000000..e5fe87d --- /dev/null +++ b/static/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/static/js/msg/js/lo.js b/static/js/msg/js/lo.js new file mode 100644 index 0000000..66f534d --- /dev/null +++ b/static/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/static/js/msg/js/lrc.js b/static/js/msg/js/lrc.js new file mode 100644 index 0000000..f265426 --- /dev/null +++ b/static/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/static/js/msg/js/lt.js b/static/js/msg/js/lt.js new file mode 100644 index 0000000..0b863c0 --- /dev/null +++ b/static/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/static/js/msg/js/lv.js b/static/js/msg/js/lv.js new file mode 100644 index 0000000..69bf2bf --- /dev/null +++ b/static/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"] = "nenosaukts"; +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/static/js/msg/js/mk.js b/static/js/msg/js/mk.js new file mode 100644 index 0000000..51c54df --- /dev/null +++ b/static/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/static/js/msg/js/mnw.js b/static/js/msg/js/mnw.js new file mode 100644 index 0000000..6c7f592 --- /dev/null +++ b/static/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/static/js/msg/js/ms.js b/static/js/msg/js/ms.js new file mode 100644 index 0000000..38b8354 --- /dev/null +++ b/static/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/static/js/msg/js/nb.js b/static/js/msg/js/nb.js new file mode 100644 index 0000000..8d74e63 --- /dev/null +++ b/static/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/static/js/msg/js/nl.js b/static/js/msg/js/nl.js new file mode 100644 index 0000000..adbda67 --- /dev/null +++ b/static/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/static/js/msg/js/oc.js b/static/js/msg/js/oc.js new file mode 100644 index 0000000..cd0e630 --- /dev/null +++ b/static/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/static/js/msg/js/pl.js b/static/js/msg/js/pl.js new file mode 100644 index 0000000..28f80c1 --- /dev/null +++ b/static/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"] = "Zwinięte bloki zawierają ostrzeżenia."; +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"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Zwraca arcus tangens punktu (X, Y) w stopniach od -180 do 180."; +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/static/js/msg/js/pms.js b/static/js/msg/js/pms.js new file mode 100644 index 0000000..5d27337 --- /dev/null +++ b/static/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/static/js/msg/js/pt-br.js b/static/js/msg/js/pt-br.js new file mode 100644 index 0000000..c40c383 --- /dev/null +++ b/static/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/static/js/msg/js/pt.js b/static/js/msg/js/pt.js new file mode 100644 index 0000000..7804f40 --- /dev/null +++ b/static/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/static/js/msg/js/ro.js b/static/js/msg/js/ro.js new file mode 100644 index 0000000..0464519 --- /dev/null +++ b/static/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/static/js/msg/js/ru.js b/static/js/msg/js/ru.js new file mode 100644 index 0000000..7843e1a --- /dev/null +++ b/static/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"] = "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/static/js/msg/js/sc.js b/static/js/msg/js/sc.js new file mode 100644 index 0000000..a6fdb17 --- /dev/null +++ b/static/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/static/js/msg/js/sd.js b/static/js/msg/js/sd.js new file mode 100644 index 0000000..5a5d253 --- /dev/null +++ b/static/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/static/js/msg/js/shn.js b/static/js/msg/js/shn.js new file mode 100644 index 0000000..f7436e4 --- /dev/null +++ b/static/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/static/js/msg/js/sk.js b/static/js/msg/js/sk.js new file mode 100644 index 0000000..c30f71e --- /dev/null +++ b/static/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/static/js/msg/js/skr-arab.js b/static/js/msg/js/skr-arab.js new file mode 100644 index 0000000..a17f700 --- /dev/null +++ b/static/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/static/js/msg/js/sl.js b/static/js/msg/js/sl.js new file mode 100644 index 0000000..f4c1113 --- /dev/null +++ b/static/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 tabeli %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Za vsak element v tabeli, 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"] = "Vsebuje delčke"; +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 prazno tabelo"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Vrne tabelo dolžine 0, ki ne vsebuje nobenih elementov."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "tabela"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Doda, odstrani ali spremeni vrstni red elementov tabele."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "ustvari tabelo iz"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Doda element v tabelo."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ustvari tabelo 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 tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Vrne element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Vrne zadnji element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Vrne naključni element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Odstrani in vrne prvi element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Odstrani in vrne element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Odstrani in vrne zadnji element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Odstrani in vrne naključni element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Odstrani prvi element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Odstrani element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Odstrani zadnji element tabele."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Odstrani naključni element tabele."; +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 novo tabelo, kot kopijo določenega dela tabele."; +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 tabeli. Če elementa ne najde, vrne %1."; +Blockly.Msg["LISTS_INLIST"] = "v tabeli"; +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 tabela prazna."; +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 tabele."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ustvari tabelo iz elementa %1, ki se ponovi %2 krat"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Ustvari tabelo iz danega elementa, ki se poljubno mnogokrat 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 tabele."; +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 tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Vstavi element na določeno mesto v tabeli."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Doda element na konec tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Vstavi element na naključno mesto v tabeli."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastavi prvi element tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastavi element na določenem mestu v tabeli."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Nastavi zadnji element tabele."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Nastavi naključni element tabele."; +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 tabele."; +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 tabelo iz besedila"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "ustvari besedilo iz tabele"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Združi tabelo besedil v eno besedilo, ločeno z ločilom."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Razdruži besedilo v tabelo 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 tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksimum tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimum tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modus tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "naključni element tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standardni odklon tabele"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "vsota tabele"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Vrne povprečje (aritmetično sredino) števil v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Vrne največje število v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Vrne mediano števil v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Vrne najmanjše število v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vrne seznam najpogostejšega elementa(-ov) v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vrne naključno število izmed števil v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vrne standardni odklon elementov v tabeli."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vrne vsoto vseh števil v tabeli."; +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"] = "vsebuje delčke"; +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/static/js/msg/js/sq.js b/static/js/msg/js/sq.js new file mode 100644 index 0000000..33def78 --- /dev/null +++ b/static/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/static/js/msg/js/sr-latn.js b/static/js/msg/js/sr-latn.js new file mode 100644 index 0000000..fce1ca3 --- /dev/null +++ b/static/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/static/js/msg/js/sr.js b/static/js/msg/js/sr.js new file mode 100644 index 0000000..22deafa --- /dev/null +++ b/static/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/static/js/msg/js/sv.js b/static/js/msg/js/sv.js new file mode 100644 index 0000000..5500b66 --- /dev/null +++ b/static/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://sv.wikipedia.org/wiki/Modulär_aritmetik"; +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 namnet \"%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/static/js/msg/js/ta.js b/static/js/msg/js/ta.js new file mode 100644 index 0000000..a035dc4 --- /dev/null +++ b/static/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"] = "இரத்து செய்"; +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"] = "+ மாறிலியினை சேர்"; +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"] = "காலி பட்டியல் பின்கொடு."; +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"] = "ஏறுவரிசை"; +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"] = "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"] = "உரையில் இருந்து பட்டியல் உருவாக்கு"; +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"] = "புதிய மாறிலியின் பெயர்:"; +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"] = "மீண்டும் செய்"; +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"] = "மீளமை"; +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/static/js/msg/js/tcy.js b/static/js/msg/js/tcy.js new file mode 100644 index 0000000..1b9b385 --- /dev/null +++ b/static/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/static/js/msg/js/te.js b/static/js/msg/js/te.js new file mode 100644 index 0000000..76371c2 --- /dev/null +++ b/static/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/static/js/msg/js/th.js b/static/js/msg/js/th.js new file mode 100644 index 0000000..f3cbd5a --- /dev/null +++ b/static/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"; +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://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/static/js/msg/js/tl.js b/static/js/msg/js/tl.js new file mode 100644 index 0000000..e88f511 --- /dev/null +++ b/static/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/static/js/msg/js/tlh.js b/static/js/msg/js/tlh.js new file mode 100644 index 0000000..5054a93 --- /dev/null +++ b/static/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/static/js/msg/js/tr.js b/static/js/msg/js/tr.js new file mode 100644 index 0000000..9dcae07 --- /dev/null +++ b/static/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 yalnızca 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://tr.wikipedia.org/wiki/Sıfırlanabilir_tip"; +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://tr.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"; +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/Sayı"; +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://tr.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://tr.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"] = "-"; +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/static/js/msg/js/ug-arab.js b/static/js/msg/js/ug-arab.js new file mode 100644 index 0000000..203e8d7 --- /dev/null +++ b/static/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/static/js/msg/js/uk.js b/static/js/msg/js/uk.js new file mode 100644 index 0000000..2a2e151 --- /dev/null +++ b/static/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/static/js/msg/js/ur.js b/static/js/msg/js/ur.js new file mode 100644 index 0000000..0cfec7a --- /dev/null +++ b/static/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"] = "نامعلوم"; +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/static/js/msg/js/vi.js b/static/js/msg/js/vi.js new file mode 100644 index 0000000..a38e730 --- /dev/null +++ b/static/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"] = "không tên"; +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"] = "Không gian làm việc Blockly"; +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/static/js/msg/js/xmf.js b/static/js/msg/js/xmf.js new file mode 100644 index 0000000..72b367a --- /dev/null +++ b/static/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"] = "კომენტარიშ დუბლირაფა"; +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"] = "ჯოხოშ უმუშო"; +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/static/js/msg/js/yo.js b/static/js/msg/js/yo.js new file mode 100644 index 0000000..968cf26 --- /dev/null +++ b/static/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/static/js/msg/js/zh-hans.js b/static/js/msg/js/zh-hans.js new file mode 100644 index 0000000..aa03e14 --- /dev/null +++ b/static/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/static/js/msg/js/zh-hant.js b/static/js/msg/js/zh-hant.js new file mode 100644 index 0000000..530a038 --- /dev/null +++ b/static/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/static/js/msg/json/ab.json b/static/js/msg/json/ab.json new file mode 100644 index 0000000..98771d4 --- /dev/null +++ b/static/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/static/js/msg/json/ar.json b/static/js/msg/json/ar.json new file mode 100644 index 0000000..3814a0c --- /dev/null +++ b/static/js/msg/json/ar.json @@ -0,0 +1,374 @@ +{ + "@metadata": { + "authors": [ + "Diyariq", + "DonAdnan", + "Meno25", + "Mido", + "Moud hosny", + "MuratTheTurkish", + "Samir", + "Test Create account", + "ديفيد", + "محمد أحمد عبد الفتاح", + "아라" + ] + }, + "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": "https://www.december.com/html/spec/colorpercompact.html", + "COLOUR_RGB_TITLE": "لون مع", + "COLOUR_RGB_RED": "أحمر", + "COLOUR_RGB_GREEN": "أخضر", + "COLOUR_RGB_BLUE": "أزرق", + "COLOUR_RGB_TOOLTIP": "إنشئ لون بالكمية المحددة من الأحمر, الأخضر والأزرق. بحيث يجب تكون كافة القيم بين 0 و 100.", + "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", + "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://ar.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://ar.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://ar.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://ar.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://ar.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://ar.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://ar.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://ar.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://tr.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://ar.wikipedia.org/wiki/توليد_الأعداد_العشوائية", + "MATH_RANDOM_INT_TITLE": " عدد صحيح عشوائي من %1 إلى %2", + "MATH_RANDOM_INT_TOOLTIP": "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا.", + "MATH_RANDOM_FLOAT_HELPURL": "https://ar.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": "عودة قوس ظل النقطة (س، ص) بالدرجات من -180 إلى 180.", + "TEXT_TEXT_HELPURL": "https://ar.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_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://ar.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://tr.wikipedia.org/wiki/دالة_(برمجة)", + "PROCEDURES_DEFRETURN_RETURN": "يرجع", + "PROCEDURES_DEFRETURN_TOOLTIP": "انشئ دالة مع المخرجات.", + "PROCEDURES_ALLOW_STATEMENTS": "اسمح بالبيانات", + "PROCEDURES_DEF_DUPLICATE_WARNING": "تحذير: هذه الدالة تحتوي على معلمات مكررة.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://ar.wikipedia.org/wiki/دالة_(برمجة)", + "PROCEDURES_CALLNORETURN_TOOLTIP": "تشغيل الدالة المعرفة من قبل المستخدم '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://ar.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/static/js/msg/json/az.json b/static/js/msg/json/az.json new file mode 100644 index 0000000..1f73a77 --- /dev/null +++ b/static/js/msg/json/az.json @@ -0,0 +1,358 @@ +{ + "@metadata": { + "authors": [ + "AZISS", + "Adil", + "Cekli829", + "Masalli qasimli" + ] + }, + "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/static/js/msg/json/ba.json b/static/js/msg/json/ba.json new file mode 100644 index 0000000..0aa986e --- /dev/null +++ b/static/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/static/js/msg/json/bcc.json b/static/js/msg/json/bcc.json new file mode 100644 index 0000000..9a13638 --- /dev/null +++ b/static/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/static/js/msg/json/be-tarask.json b/static/js/msg/json/be-tarask.json new file mode 100644 index 0000000..91c420c --- /dev/null +++ b/static/js/msg/json/be-tarask.json @@ -0,0 +1,353 @@ +{ + "@metadata": { + "authors": [ + "Jim-by", + "Nerogaf", + "Red Winged Duck", + "Renessaince" + ] + }, + "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/static/js/msg/json/be.json b/static/js/msg/json/be.json new file mode 100644 index 0000000..9758945 --- /dev/null +++ b/static/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/static/js/msg/json/bg.json b/static/js/msg/json/bg.json new file mode 100644 index 0000000..e9399f7 --- /dev/null +++ b/static/js/msg/json/bg.json @@ -0,0 +1,357 @@ +{ + "@metadata": { + "authors": [ + "Alpinistbg", + "Gkostov", + "InsomniHat", + "Miroslav35232", + "ShockD", + "StanProg", + "Vlad5250", + "Vodnokon4e" + ] + }, + "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/static/js/msg/json/bn.json b/static/js/msg/json/bn.json new file mode 100644 index 0000000..eaf9ade --- /dev/null +++ b/static/js/msg/json/bn.json @@ -0,0 +1,195 @@ +{ + "@metadata": { + "authors": [ + "Aftabuzzaman", + "MasterMinhaz", + "Rakibul", + "Rasal Lia", + "Tauhid16", + "আফতাবুজ্জামান", + "এম আবু সাঈদ" + ] + }, + "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/static/js/msg/json/br.json b/static/js/msg/json/br.json new file mode 100644 index 0000000..e596f2b --- /dev/null +++ b/static/js/msg/json/br.json @@ -0,0 +1,355 @@ +{ + "@metadata": { + "authors": [ + "Fohanno", + "Fulup", + "Gwenn-Ael", + "Vicng", + "Y-M D" + ] + }, + "VARIABLES_DEFAULT_NAME": "elfenn", + "UNNAMED_KEY": "dizanv", + "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": "goulenn un destenn gant ur gemennadenn", + "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...", + "WORKSPACE_ARIA_LABEL": "Takad labour Blockly", + "COLLAPSED_WARNINGS_WARNING": "Kemennoù-diwall zo er bloc'hadoù pleget." +} diff --git a/static/js/msg/json/ca.json b/static/js/msg/json/ca.json new file mode 100644 index 0000000..c45a704 --- /dev/null +++ b/static/js/msg/json/ca.json @@ -0,0 +1,353 @@ +{ + "@metadata": { + "authors": [ + "Alvaro Vidal-Abarca", + "Espertus", + "Fitoschido", + "Hiperpobla", + "Jaumeortola", + "Lluís Batlle", + "Mguix", + "Micobu", + "Quel.soler" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "UNNAMED_KEY": "sense nom", + "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", + "IOS_VARIABLES_VARIABLE_NAME": "Nom de la variable", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "No es pot fer servir un nom de variable buit.", + "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).", + "MATH_ATAN2_HELPURL": "https://ca.wikipedia.org/wiki/Inverses_de_les_funcions_trigonom%C3%A8triques#L'arctangent_amb_dos_arguments", + "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Torna l'arctangent del punt (X,Y) en graus de -180 a 180.", + "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_TITLE": "en el text %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "comptar %1 en %2", + "TEXT_COUNT_TOOLTIP": "Compta quantes vegades hi ha un text dins d'un altre text.", + "TEXT_REPLACE_MESSAGE0": "substituir %1 amb %2 en %3", + "TEXT_REPLACE_TOOLTIP": "Substitueix totes les aparicions d'un text dins d'un altre text.", + "TEXT_REVERSE_MESSAGE0": "invertir %1", + "TEXT_REVERSE_TOOLTIP": "Inverteix l'ordre dels caràcters en el 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 l'element.", + "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_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordenar %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordena la còpia d'una llista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendent", + "LISTS_SORT_ORDER_DESCENDING": "descendent", + "LISTS_SORT_TYPE_NUMERIC": "numèric", + "LISTS_SORT_TYPE_TEXT": "alfabètic", + "LISTS_SORT_TYPE_IGNORECASE": "alfabètic, ignorant majúscules", + "LISTS_SPLIT_LIST_FROM_TEXT": "fer una llista d'un text", + "LISTS_SPLIT_TEXT_FROM_LIST": "fer un text d'una llista", + "LISTS_SPLIT_WITH_DELIMITER": "amb delimitador", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Parteix el text en una llista de textos, trencant-lo a cada delimitador.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Ajunta una llista de textos en un text, separats per un delimitador.", + "LISTS_REVERSE_MESSAGE0": "invertir %1", + "LISTS_REVERSE_TOOLTIP": "Invertir la còpia d'una llista.", + "VARIABLES_GET_TOOLTIP": "Retorna el valor d'aquesta variable.", + "VARIABLES_GET_CREATE_SET": "Crea 'modifica %1'", + "VARIABLES_SET": "modifica %1 a %2", + "VARIABLES_SET_TOOLTIP": "Modifica aquesta variable al valor introduït.", + "VARIABLES_SET_CREATE_GET": "Crear 'recupera %1'", + "PROCEDURES_DEFNORETURN_TITLE": "a", + "PROCEDURES_DEFNORETURN_PROCEDURE": "fes alguna cosa", + "PROCEDURES_BEFORE_PARAMS": "amb:", + "PROCEDURES_CALL_BEFORE_PARAMS": "amb:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea una funció sense sortida.", + "PROCEDURES_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...", + "WORKSPACE_ARIA_LABEL": "Espai de treball Blockly", + "COLLAPSED_WARNINGS_WARNING": "Els blocs plegats contenen avisos." +} diff --git a/static/js/msg/json/constants.json b/static/js/msg/json/constants.json new file mode 100644 index 0000000..f2801d3 --- /dev/null +++ b/static/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/static/js/msg/json/cs.json b/static/js/msg/json/cs.json new file mode 100644 index 0000000..44b2385 --- /dev/null +++ b/static/js/msg/json/cs.json @@ -0,0 +1,345 @@ +{ + "@metadata": { + "authors": [ + "Chmee2", + "Clon", + "Dita", + "Dvorapa", + "Espertus", + "Ilimanaq29", + "Koo6", + "Matěj Grabovský", + "Patriccck", + "Robins7", + "Rosnicka.kacka", + "Utar", + "Vtmarvin" + ] + }, + "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_OK": "OK", + "IOS_CANCEL": "Storno", + "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/static/js/msg/json/da.json b/static/js/msg/json/da.json new file mode 100644 index 0000000..e4ed7e9 --- /dev/null +++ b/static/js/msg/json/da.json @@ -0,0 +1,351 @@ +{ + "@metadata": { + "authors": [ + "Christian List", + "Joedalton", + "JonNPoulsen", + "MGA73", + "Mads Haupt", + "RickiRunge", + "Saederup92", + "Tjernobyl" + ] + }, + "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/static/js/msg/json/de.json b/static/js/msg/json/de.json new file mode 100644 index 0000000..88e0170 --- /dev/null +++ b/static/js/msg/json/de.json @@ -0,0 +1,391 @@ +{ + "@metadata": { + "authors": [ + "Cvanca", + "Dan-yell", + "M165437", + "Metalhead64", + "Octycs", + "Sillyfreak", + "Sushi", + "THINK", + "Tiin", + "Zgtm", + "아라" + ] + }, + "VARIABLES_DEFAULT_NAME": "Element", + "UNNAMED_KEY": "unbenannt", + "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": "um", + "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…", + "WORKSPACE_ARIA_LABEL": "Blockly Arbeitsbereich", + "COLLAPSED_WARNINGS_WARNING": "Eingeklappte Blöcke enthalten Warnungen." +} diff --git a/static/js/msg/json/diq.json b/static/js/msg/json/diq.json new file mode 100644 index 0000000..2b7ec92 --- /dev/null +++ b/static/js/msg/json/diq.json @@ -0,0 +1,270 @@ +{ + "@metadata": { + "authors": [ + "1917 Ekim Devrimi", + "Gırd", + "Kumkumuk", + "Marmase", + "Mirzali", + "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_FOR_TITLE": "Pê amarêno %1 %2 ra %3 rê , herg gam de %4 vurnayışi", + "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_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Na fonksiyon de dekerdeko mukerrer şınasiyao", + "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_ARITHMETIC_TOOLTIP_ADD": "Arêdayışê dı amara tadê", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ferqê dı amara tadê", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Reyina dı amara tadê", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Letey iya dı amara tadê", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "karekok", + "MATH_SINGLE_TOOLTIP_ROOT": "Karerêçê yew amarer tadê", + "MATH_SINGLE_OP_ABSOLUTE": "mutlaq", + "MATH_SINGLE_TOOLTIP_ABS": "Ercê mutlaqê yew amarer tadê", + "MATH_SINGLE_TOOLTIP_NEG": "Nêrazibiyena yew amari açarne.", + "MATH_SINGLE_TOOLTIP_LN": "Tebi algoritmaya yew amarer tadê", + "MATH_SINGLE_TOOLTIP_LOG10": "Logaritmay 10i yew amari rê peyser tadê", + "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_SIN": "Sinusi yew derece tadê (radyan niyo)", + "MATH_TRIG_TOOLTIP_COS": "Derecey yew kosinusi tadê (radyan niyo)", + "MATH_TRIG_TOOLTIP_TAN": "Tanjantê yew derecey tadê (radyan niyo)", + "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_TOOLTIP_MIN": "Lista de tewr qıckek amar tadê", + "MATH_ONLIST_OPERATOR_MAX": "Tewr gırdê lista", + "MATH_ONLIST_TOOLTIP_MAX": "Lista de amara tewr qıckeke tadê", + "MATH_ONLIST_OPERATOR_AVERAGE": "Averacê lista", + "MATH_ONLIST_OPERATOR_MEDIAN": "Wertey lista", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Lista ra amara werti tadê", + "MATH_ONLIST_OPERATOR_MODE": "listey modi", + "MATH_ONLIST_OPERATOR_STD_DEV": "Standart ferqıziya lista", + "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_PROMPT_TOOLTIP_NUMBER": "Seba yew numreya karber persiyê", + "TEXT_PROMPT_TOOLTIP_TEXT": "Seba tay metinan karberi persiyê", + "TEXT_COUNT_MESSAGE0": "%1 miyan de %2 bımare", + "TEXT_REPLACE_MESSAGE0": "%1 heruna ra zerrey %3 zerrey %2 ya bıvurne", + "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_GET_INDEX_TOOLTIP_GET_FIRST": "Lista de obcey sıfteyıni tadano", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Lista de obcey peyêni tadano", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Lista de obcey raşt ameyayi tadano", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Lista de obcey sıfteyıni wedareno", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Lista de obcey peyêni wedareno", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Lista de obcey raşt ameyayi wedareno", + "LISTS_SET_INDEX_SET": "ca ke", + "LISTS_SET_INDEX_INSERT": "De fi", + "LISTS_SET_INDEX_INPUT_TO": "zey", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Lista de obcey sıfteyıni eyar keno", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Lista de obcey peyêni eyar keno", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Lista de obcey raşt ameyayi eyar keno", + "LISTS_GET_SUBLIST_START_FROM_START": "Lista # ra lista bınên bıgêrê", + "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_TOOLTIP": "Kopyay yew lista rêz kerê", + "LISTS_SORT_ORDER_ASCENDING": "zeydıyen", + "LISTS_SORT_ORDER_DESCENDING": "Kemeyen", + "LISTS_SORT_TYPE_NUMERIC": "Amoriyal", + "LISTS_SORT_TYPE_TEXT": "Alfabetik", + "LISTS_SPLIT_LIST_FROM_TEXT": "metini ra lista bıkerê", + "LISTS_SPLIT_TEXT_FROM_LIST": "Lista ra metin bıkerê", + "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_TOOLTIP": "Ercê nê vurnayoği tadano", + "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...", + "WORKSPACE_ARIA_LABEL": "Blockly Caygurenayışi" +} diff --git a/static/js/msg/json/dty.json b/static/js/msg/json/dty.json new file mode 100644 index 0000000..75ff112 --- /dev/null +++ b/static/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/static/js/msg/json/ee.json b/static/js/msg/json/ee.json new file mode 100644 index 0000000..c16f908 --- /dev/null +++ b/static/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/static/js/msg/json/el.json b/static/js/msg/json/el.json new file mode 100644 index 0000000..f209df2 --- /dev/null +++ b/static/js/msg/json/el.json @@ -0,0 +1,405 @@ +{ + "@metadata": { + "authors": [ + "Azountas", + "Espertus", + "Evropi", + "GR", + "Gchr", + "Geraki", + "Glavkos", + "KATRINE1992", + "Namatreasure", + "NikosLikomitros", + "Nikosgranturismogt", + "Norhorn", + "Sarri.greek", + "Sfyrakis", + "Stam.nikos", + "Themelis", + "Vicng", + "Ανώνυμος Βικιπαιδιστής", + "아라" + ] + }, + "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": "https://www.december.com/html/spec/colorpercompact.html", + "COLOUR_RGB_TITLE": "χρώμα με", + "COLOUR_RGB_RED": "κόκκινο", + "COLOUR_RGB_GREEN": "πράσινο", + "COLOUR_RGB_BLUE": "μπλε", + "COLOUR_RGB_TOOLTIP": "Δημιουργεί χρώμα με το συγκεκριμένο ποσό του κόκκινου, πράσινου και μπλε που ορίζεις. Όλες οι τιμές πρέπει να είναι μεταξύ 0 και 100.", + "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", + "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_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "επανάλαβε ενώ", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "επανάλαβε μέχρι", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Ενόσω μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Ενόσω μια τιμή είναι ψευδής, τότε εκτελεί κάποιες εντολές.", + "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", + "CONTROLS_FOR_TOOLTIP": "Η μεταβλητή «%1» παίρνει τιμές ξεκινώντας από τον αριθμό έναρξης μέχρι τον αριθμό τέλους αυξάνοντας κάθε φορά με το καθορισμένο βήμα και εκτελώντας το καθορισμένο μπλοκ.", + "CONTROLS_FOR_TITLE": "μέτρησε με %1 από το %2 έως το %3 ανά %4", + "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", + "CONTROLS_FOREACH_TITLE": "για κάθε στοιχείο %1 στη λίστα %2", + "CONTROLS_FOREACH_TOOLTIP": "Για κάθε στοιχείο σε μια λίστα, ορίζει τη μεταβλητή «%1» στο στοιχείο και, στη συνέχεια, εκτελεί κάποιες εντολές.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", + "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://github.com/google/blockly/wiki/IfElse", + "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_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", + "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_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", + "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_HELPURL": "https://en.wikipedia.org/wiki/Clamping_(graphics)", + "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 (ανοικτό).", + "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://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_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": "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.", + "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_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_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_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/static/js/msg/json/en-gb.json b/static/js/msg/json/en-gb.json new file mode 100644 index 0000000..cd8c59f --- /dev/null +++ b/static/js/msg/json/en-gb.json @@ -0,0 +1,225 @@ +{ + "@metadata": { + "authors": [ + "Aefgh39622", + "Andibing", + "Bjh21", + "Codynguyen1116", + "Shirayuki" + ] + }, + "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 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/static/js/msg/json/en.json b/static/js/msg/json/en.json new file mode 100644 index 0000000..66bf469 --- /dev/null +++ b/static/js/msg/json/en.json @@ -0,0 +1,408 @@ +{ + "@metadata": { + "author": "Ellen Spertus ", + "lastupdated": "2020-12-17 12:10:29.080541", + "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/static/js/msg/json/eo.json b/static/js/msg/json/eo.json new file mode 100644 index 0000000..dab0ddc --- /dev/null +++ b/static/js/msg/json/eo.json @@ -0,0 +1,350 @@ +{ + "@metadata": { + "authors": [ + "Cérilew", + "Etrapani", + "Mirin", + "Ochilov", + "Orikrin1998", + "Robin van der Vliet", + "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/static/js/msg/json/es.json b/static/js/msg/json/es.json new file mode 100644 index 0000000..413fdbb --- /dev/null +++ b/static/js/msg/json/es.json @@ -0,0 +1,365 @@ +{ + "@metadata": { + "authors": [ + "Codynguyen1116", + "Fitoschido", + "Harvest", + "Indiralena", + "Julián L", + "Ktranz", + "Luisangelrg", + "Macofe", + "MarcoAurelio", + "Martineduardo", + "Rubentl134", + "Ryo567", + "VegaDark", + "WeSiToS" + ] + }, + "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": "Cambiar nombre", + "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/static/js/msg/json/et.json b/static/js/msg/json/et.json new file mode 100644 index 0000000..60f548d --- /dev/null +++ b/static/js/msg/json/et.json @@ -0,0 +1,348 @@ +{ + "@metadata": { + "authors": [ + "Aivarannamaa", + "Hasso", + "Ilmarine", + "Masavi", + "Puik" + ] + }, + "VARIABLES_DEFAULT_NAME": "objekt", + "UNNAMED_KEY": "nimetu", + "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_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Sellel funktsioonil on dubleerivad sisendid.", + "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", + "TEXT_REVERSE_TOOLTIP": "Pöörab tekstis tähemärkide järjestuse ümber.", + "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.", + "LISTS_REVERSE_TOOLTIP": "Loendi koopia ümberpööramine.", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Ütle midagi...", + "WORKSPACE_ARIA_LABEL": "Blockly tööruum", + "COLLAPSED_WARNINGS_WARNING": "Kokkuvajunud plokid sisaldavad hoiatusi." +} diff --git a/static/js/msg/json/eu.json b/static/js/msg/json/eu.json new file mode 100644 index 0000000..03170a3 --- /dev/null +++ b/static/js/msg/json/eu.json @@ -0,0 +1,232 @@ +{ + "@metadata": { + "authors": [ + "Abacus", + "Amaia", + "An13sa", + "Asieriko", + "EukeneFL", + "Mikel Ibaiba", + "RFenichel", + "Subi" + ] + }, + "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/static/js/msg/json/fa.json b/static/js/msg/json/fa.json new file mode 100644 index 0000000..43b92bc --- /dev/null +++ b/static/js/msg/json/fa.json @@ -0,0 +1,350 @@ +{ + "@metadata": { + "authors": [ + "Alirezaaa", + "Arash.pt", + "AzorAhai", + "Dalba", + "Ebraminio", + "Hamisun", + "Hossein.safavi", + "Mehran", + "MohandesWiki", + "Nhzandi", + "Reza1615", + "Sunfyre" + ] + }, + "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": "تعداد %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/static/js/msg/json/fi.json b/static/js/msg/json/fi.json new file mode 100644 index 0000000..d7927cb --- /dev/null +++ b/static/js/msg/json/fi.json @@ -0,0 +1,372 @@ +{ + "@metadata": { + "authors": [ + "Actuallyisjoha", + "Espeox", + "Espertus", + "Hopea", + "KK", + "McSalama", + "Mikahama", + "Nike", + "PStudios", + "Pahkiqaz", + "Pettevi", + "Pyscowicz", + "SNuutti", + "Silvonen" + ] + }, + "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...", + "WORKSPACE_ARIA_LABEL": "Blocklyn työnäkymä", + "COLLAPSED_WARNINGS_WARNING": "Supistetut lohkot sisältävät varoituksia." +} diff --git a/static/js/msg/json/fr.json b/static/js/msg/json/fr.json new file mode 100644 index 0000000..ee9241e --- /dev/null +++ b/static/js/msg/json/fr.json @@ -0,0 +1,372 @@ +{ + "@metadata": { + "authors": [ + "Alacabe", + "Appr", + "Espertus", + "Fredlefred", + "Frigory", + "Gomoko", + "Grimault", + "Pititnatole", + "ProfGra", + "Rixed", + "RoboErikG", + "Thibaut120094", + "Urhixidur", + "Verdy p", + "Vexthedorito", + "Wladek92", + "Zarisi" + ] + }, + "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érifie 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 « set %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 « get %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 ne peut ê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/static/js/msg/json/gl.json b/static/js/msg/json/gl.json new file mode 100644 index 0000000..757cb0c --- /dev/null +++ b/static/js/msg/json/gl.json @@ -0,0 +1,157 @@ +{ + "@metadata": { + "authors": [ + "Antón Méixome", + "Chairego apc", + "Elisardojm", + "Iváns", + "Macofe", + "Toliño" + ] + }, + "VARIABLES_DEFAULT_NAME": "elemento", + "UNNAMED_KEY": "innominada", + "TODAY": "Hoxe", + "DUPLICATE_BLOCK": "Duplicar", + "ADD_COMMENT": "Engadir un comentario", + "REMOVE_COMMENT": "Eliminar o comentario", + "DUPLICATE_COMMENT": "Duplicar 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_STRING_VARIABLE": "Crar unha variábel de cadea...", + "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/static/js/msg/json/gor.json b/static/js/msg/json/gor.json new file mode 100644 index 0000000..214fdae --- /dev/null +++ b/static/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/static/js/msg/json/ha.json b/static/js/msg/json/ha.json new file mode 100644 index 0000000..eb1adad --- /dev/null +++ b/static/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/static/js/msg/json/he.json b/static/js/msg/json/he.json new file mode 100644 index 0000000..be5b8c2 --- /dev/null +++ b/static/js/msg/json/he.json @@ -0,0 +1,368 @@ +{ + "@metadata": { + "authors": [ + "Amire80", + "Deborahjay", + "Dorongol", + "Dvb", + "Elyashiv", + "Guycn2", + "Inkbug", + "LaG roiL", + "Motife", + "Noamrotem", + "Steeve815", + "YaronSh", + "Yona b", + "דגש חזק", + "נדב ס", + "아라" + ] + }, + "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": "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_TOOLTIP": "לעשות שהערך ‚%1’ יקבל את הערכים מהמספר ההתחלתי עד המספר הסופי, בהתאם למרווח שהוגדר, ולבצע את הקוביות הנבחרות.", + "CONTROLS_FOR_TITLE": "תספור עם %1 מ־%2 עד %3 בצעדי %4", + "CONTROLS_FOREACH_TITLE": "לכל פריט %1 ברשימה %2", + "CONTROLS_FOREACH_TOOLTIP": "לכל פריט ברשימה, להגדיר את המשתנה '%1' לפריט הזה, ולאחר מכן לעשות כמה פעולות.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "צא מהלולאה", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "המשך עם האיטרציה הבאה של הלולאה", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "צא אל מחוץ ללולאה הכוללת.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "דלג על שאר הלולאה והמשך עם האיטרציה הבאה.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "אזהרה: קוביה זו עשויה לשמש רק בתוך לולאה.", + "CONTROLS_IF_TOOLTIP_1": "אם ערך נכון, לבצע כמה פעולות.", + "CONTROLS_IF_TOOLTIP_2": "אם הערך הוא אמת, לבצע את קוביית הפעולות הראשונה. אחרת, לבצע את קוביית הפעולות השנייה.", + "CONTROLS_IF_TOOLTIP_3": "אם הערך הראשון הוא אמת, לבצע את קוביית הפעולות הראשונה. אחרת, אם הערך השני הוא אמת, לבצע את קוביית הפעולות השנייה.", + "CONTROLS_IF_TOOLTIP_4": "אם הערך הראשון הוא אמת, לבצע את קוביית הפעולות הראשונה. אחרת, אם הערך השני הוא אמת, לבצע את קוביית הפעולות השנייה. אם אף אחד מהם אינו נכון, לבצע את קוביית הפעולות האחרונה.", + "CONTROLS_IF_MSG_IF": "אם", + "CONTROLS_IF_MSG_ELSEIF": "אחרת אם", + "CONTROLS_IF_MSG_ELSE": "אחרת", + "CONTROLS_IF_IF_TOOLTIP": "ניתן להוסיף, למחוק או לסדר מחדש כדי להגדיר מחדש את קוביית ההתניה (If).", + "CONTROLS_IF_ELSEIF_TOOLTIP": "תוסיף תנאי לבלוק If.", + "CONTROLS_IF_ELSE_TOOLTIP": "ניתן להוסיף תנאי סופי שלוכד את כולם לקוביית ההתניה (If).", + "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://he.wikipedia.org/wiki/אי-שוויון_(מתמטיקה)", + "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_TRIG_TOOLTIP_ASIN": "החזרת הארק-סינוס של מספר.", + "MATH_TRIG_TOOLTIP_ACOS": "החזרת הארק-קוסינוס של מספר.", + "MATH_TRIG_TOOLTIP_ATAN": "החזרת הארק-טנגנס של מספר.", + "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_IS_TOOLTIP": "בדיקה האם מספר הוא זוגי, אי־זוגי, ראשוני, שלם, חיובי, שלילי או אם ניתן לחלק אותו במספר כלשהו. מחזירה אמת או שקר.", + "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_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://he.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://he.wikipedia.org/wiki/מחולל_מספרים_אקראיים", + "MATH_RANDOM_INT_TITLE": "מספר שלם אקראי בין %1 ל-%2 (כולל)", + "MATH_RANDOM_INT_TOOLTIP": "החזרת מספר שלם, חיובי ואקראי בין שני הגבולות שהוגדרו, כולל.", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "שבר אקראי", + "MATH_RANDOM_FLOAT_TOOLTIP": "מחזיר שבר אקראי בין 0.0 (כולל) עד 1.0 (כולל).", + "MATH_ATAN2_TOOLTIP": "מחזיר את הארכטנגנס של נקודה (X, Y) במעלות מ־‎-180 עד 180.", + "TEXT_TEXT_HELPURL": "https://he.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_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_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": "סביבת העבודה בלוקלי", + "COLLAPSED_WARNINGS_WARNING": "קוביות מצומצמות מכילות אזהרות." +} diff --git a/static/js/msg/json/hi.json b/static/js/msg/json/hi.json new file mode 100644 index 0000000..0262f52 --- /dev/null +++ b/static/js/msg/json/hi.json @@ -0,0 +1,345 @@ +{ + "@metadata": { + "authors": [ + "Bl707", + "Earlyengineers", + "Nilesh shukla", + "Phoenix303", + "Sachinkatiyar", + "Sfic", + "संजीव कुमार" + ] + }, + "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/static/js/msg/json/hrx.json b/static/js/msg/json/hrx.json new file mode 100644 index 0000000..6380c0e --- /dev/null +++ b/static/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/static/js/msg/json/hu.json b/static/js/msg/json/hu.json new file mode 100644 index 0000000..d498320 --- /dev/null +++ b/static/js/msg/json/hu.json @@ -0,0 +1,363 @@ +{ + "@metadata": { + "authors": [ + "BanKris", + "Csega", + "Dj", + "Espertus", + "Fitoschido", + "Grin", + "Lajthabalazs", + "MeskoBalazs", + "Máté", + "Notramo", + "Rodrigo", + "Tacsipacsi", + "Takács Viktor László", + "Urbalazs", + "ViDam" + ] + }, + "VARIABLES_DEFAULT_NAME": "változó", + "UNNAMED_KEY": "névtelen", + "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_TYPE_TITLE": "Az új változó típusa:", + "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.", + "MATH_ATAN2_HELPURL": "https://hu.wikipedia.org/wiki/Arctg2", + "MATH_ATAN2_TITLE": "Arctg2 X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Az (X,Y) pont arkusz tangens értéke fokban -180 és 180 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ó.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Mondj valamit...", + "WORKSPACE_ARIA_LABEL": "Blockly munkaterület", + "COLLAPSED_WARNINGS_WARNING": "Az összecsukott blokk figyelmeztetéseket tartalmaz." +} diff --git a/static/js/msg/json/hy.json b/static/js/msg/json/hy.json new file mode 100644 index 0000000..7810349 --- /dev/null +++ b/static/js/msg/json/hy.json @@ -0,0 +1,337 @@ +{ + "@metadata": { + "authors": [ + "A.kolyan", + "Armenoid", + "Kareyac", + "Nona", + "Xelgen" + ] + }, + "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": "Վերանվանել փոփոխականը...", + "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/static/js/msg/json/ia.json b/static/js/msg/json/ia.json new file mode 100644 index 0000000..e009161 --- /dev/null +++ b/static/js/msg/json/ia.json @@ -0,0 +1,337 @@ +{ + "@metadata": { + "authors": [ + "Fanjiayi", + "Karmwiki", + "McDutchie" + ] + }, + "VARIABLES_DEFAULT_NAME": "cosa", + "UNNAMED_KEY": "sin nomine", + "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://ia.wikipedia.org/wiki/Bucla_for", + "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/static/js/msg/json/id.json b/static/js/msg/json/id.json new file mode 100644 index 0000000..e539da9 --- /dev/null +++ b/static/js/msg/json/id.json @@ -0,0 +1,358 @@ +{ + "@metadata": { + "authors": [ + "Adisetiawan", + "Arifin.wijaya", + "Kasimtan", + "Kenrick95", + "Marwan Mohamad", + "Mirws", + "아라" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "UNNAMED_KEY": "tanpa nama", + "TODAY": "Hari ini", + "DUPLICATE_BLOCK": "Duplikat", + "ADD_COMMENT": "Tambahkan Komentar", + "REMOVE_COMMENT": "Hapus Komentar", + "DUPLICATE_COMMENT": "Duplikat 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_STRING_VARIABLE": "Buat variabel string...", + "NEW_NUMBER_VARIABLE": "Buat variabel number...", + "NEW_COLOUR_VARIABLE": "Buat variabel warna...", + "NEW_VARIABLE_TYPE_TITLE": "Tipe variabel baru:", + "NEW_VARIABLE_TITLE": "Nama variabel baru:", + "VARIABLE_ALREADY_EXISTS": "Sebuah variabel dengan nama '%1' sudah ada.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Variabel yg bernama '%1' sudah ada untuk tipe lain: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Hapus %1 yang digunakan pada variabel '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Tidak bisa menghapus variabel '%1' karena variabel ini bagian dari sebuah definisi dari fungsi '%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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Batal", + "IOS_ERROR": "Kesalahan", + "IOS_PROCEDURES_INPUTS": "Masukan", + "IOS_PROCEDURES_ADD_INPUT": "tambah masukan", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Ijinkan pernyataan", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Fungsi ini memiliki masukan duplikat", + "IOS_VARIABLES_ADD_VARIABLE": "Tambah variabel", + "IOS_VARIABLES_ADD_BUTTON": "Tambah", + "IOS_VARIABLES_RENAME_BUTTON": "Ubah nama", + "IOS_VARIABLES_DELETE_BUTTON": "Hapus", + "IOS_VARIABLES_VARIABLE_NAME": "Nama variabel", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Kamu tidak bisa menggunakan variabel kosong", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Ucapkan sesuatu..." +} diff --git a/static/js/msg/json/ig.json b/static/js/msg/json/ig.json new file mode 100644 index 0000000..7f4fc2b --- /dev/null +++ b/static/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/static/js/msg/json/is.json b/static/js/msg/json/is.json new file mode 100644 index 0000000..57eab20 --- /dev/null +++ b/static/js/msg/json/is.json @@ -0,0 +1,374 @@ +{ + "@metadata": { + "authors": [ + "Gaddi00", + "Jonbg", + "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/static/js/msg/json/it.json b/static/js/msg/json/it.json new file mode 100644 index 0000000..eb1ae3a --- /dev/null +++ b/static/js/msg/json/it.json @@ -0,0 +1,360 @@ +{ + "@metadata": { + "authors": [ + "Albe Albe 460", + "Albe Albe460", + "Beta16", + "Espertus", + "Federico Mugnaini", + "Gbonanome", + "Gianfranco", + "Greis", + "JackLantern", + "Nerimic", + "Samuele2002", + "Sarah Bernabei", + "Selven" + ] + }, + "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...", + "WORKSPACE_ARIA_LABEL": "Area di lavoro di Blockly", + "COLLAPSED_WARNINGS_WARNING": "I blocchi compressi contengono avvertimenti." +} diff --git a/static/js/msg/json/ja.json b/static/js/msg/json/ja.json new file mode 100644 index 0000000..449b975 --- /dev/null +++ b/static/js/msg/json/ja.json @@ -0,0 +1,386 @@ +{ + "@metadata": { + "authors": [ + "Aefgh39622", + "Gimite", + "Gulpin", + "Kebhr", + "Oda", + "Omotecho", + "Otokoume", + "Sgk", + "Shirayuki", + "Suiato", + "Sujiniku", + "TAKAHASHI Shuuji", + "ネイ", + "아라" + ] + }, + "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未満の範囲の乱数を返します。", + "MATH_ATAN2_TITLE": "X:%1 Y:%2のaran2", + "MATH_ATAN2_TOOLTIP": "点 (X, Y) の逆関数を -180 度から 180度まで返します。", + "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ワークスペース", + "COLLAPSED_WARNINGS_WARNING": "つぶしたブロックには警告が入っています。" +} diff --git a/static/js/msg/json/kab.json b/static/js/msg/json/kab.json new file mode 100644 index 0000000..1958e0c --- /dev/null +++ b/static/js/msg/json/kab.json @@ -0,0 +1,350 @@ +{ + "@metadata": { + "authors": [ + "Alem", + "Amaziɣ maziɣ", + "Belkacem77", + "K Messaoudi", + "SlimaneAmiri", + "YubaWissin" + ] + }, + "VARIABLES_DEFAULT_NAME": "aferdis", + "UNNAMED_KEY": "war isem", + "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ḥedran", + "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": "rkec", + "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 tikkal", + "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 armi", + "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 armi d amḍan n taggara, s tmerna n usurif yettunefken, sakin selkem tinaḍ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-a, sakin kemmel allus d-itteddun.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Ɣur-k: Iḥder-a yessefk ad yettwaseqdec di tneddict.", + "CONTROLS_IF_TOOLTIP_1": "mayella azal d idetti, ihi selkem kra n tinaḍin.", + "CONTROLS_IF_TOOLTIP_2": "Mayella azal d idetti, selkem iḥder amezwaru. Neɣ ma ulac, selkem iḥder wis sin.", + "CONTROLS_IF_TOOLTIP_3": "Mayella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ ma azal wis sin d ucciḍ, selkem iḥder wis sin.", + "CONTROLS_IF_TOOLTIP_4": "Mayella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ, mayella azal wis sin d idetti, selkem iḥder wis sin. Mayella ula d yiwen seg-sen ur yelli 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 asmizzwer n tgezmiyin akken ad talseḍ tawila n yiḥder-a ma.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Rnu 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 yinekcam d imegduya.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Ad d-yerr idetti mayella i sin n yinekcam mačči d imegduya.", + "LOGIC_COMPARE_TOOLTIP_LT": "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy ɣef wis sin.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy neɣ yegda wis sin.", + "LOGIC_COMPARE_TOOLTIP_GT": "Ad d-yerr idetti ma anekcam amezwaru meqqer ɣef wis sin.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Ad d-yerr idetti ma anekcam amezwaru meqqer neɣ yegda wis sin.", + "LOGIC_OPERATION_TOOLTIP_AND": "Ad d-yerr idetti ma inekcam d idettiyen.", + "LOGIC_OPERATION_AND": "akked", + "LOGIC_OPERATION_TOOLTIP_OR": "Ad d-yerr idetti ma ɣarsum yiwen seg yinekcam d idetti.", + "LOGIC_OPERATION_OR": "neɣ", + "LOGIC_NEGATE_TITLE": "mačči %1", + "LOGIC_NEGATE_TOOLTIP": "Ad d-yerr idetti ma 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 d ucciḍ", + "LOGIC_TERNARY_TOOLTIP": "Senqed tawtilt deg 'sekyed'. Ma 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 yimiḍanen.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ad d-yerr tmernit n sin n yimiḍanen.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ad d-yerr tukksa gar sin n yimiḍanen.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ad d-yerr aful n sin n yimḍ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ẓar uzmir sin n umḍ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 amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ubṭay ɣef kra n umḍan. Ad d-yerr idetti 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 yimḍ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 unammas n tebdart.", + "MATH_ONLIST_OPERATOR_MODE": "Tiggtiwin n tebdart", + "MATH_ONLIST_TOOLTIP_MODE": "Ad d-yerr tabdart n yiferdisen 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 yimḍanen.", + "MATH_CONSTRAIN_TITLE": "Err tamara i %1 gar %2 akked %3", + "MATH_CONSTRAIN_TOOLTIP": "Err tamara n umḍ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ḍris s", + "TEXT_JOIN_TOOLTIP": "Ad yernu taceqquft n uḍris s usdukel gar yal amḍan n yiferdisen.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "sdukkel", + "TEXT_CREATE_JOIN_TOOLTIP": "Rnu, kkes, neɣ ales asmizzwer n tgezmiyin akken ad talseḍ tawila n yiḥder-a.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Rnu aferdis ɣer uḍris.", + "TEXT_APPEND_TITLE": "Rnu aḍris %2 ɣer %1", + "TEXT_APPEND_TOOLTIP": "Rnu aḍris ɣer umutti '%1'.", + "TEXT_LENGTH_TITLE": "teɣzi n %1", + "TEXT_LENGTH_TOOLTIP": "Ad d-yerr amḍan n yisekkilen (ddan 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 amezwaru deg uḍris wis sin. Ad d-yerr %1 ma yella ulac aḍris.", + "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 taggara", + "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 yettwamlen.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Ad d-yerr aḥric yettwamlen 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 taggara", + "TEXT_GET_SUBSTRING_START_FIRST": "awi-d azrir asnawan seg usekkil amezwaru", + "TEXT_GET_SUBSTRING_END_FROM_START": "armi d asekkil #", + "TEXT_GET_SUBSTRING_END_FROM_END": "armi d asekkil # si taggara", + "TEXT_GET_SUBSTRING_END_LAST": "armi 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 yisekkilen ilmawen yettwakksen seg yixf neɣ i sin.", + "TEXT_TRIM_OPERATOR_BOTH": "Tukksa n yisekkilen imellalen seg sin n yidisan", + "TEXT_TRIM_OPERATOR_LEFT": "tukksa n yisekkilen seg uzelmaḍ", + "TEXT_TRIM_OPERATOR_RIGHT": "tukksa n yisekkilen 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 wayeḍ.", + "TEXT_REPLACE_MESSAGE0": "semselsi %1 s %2 di %3", + "TEXT_REPLACE_TOOLTIP": "Ad isemselsi akk timeḍriwin n uḍris s wayeḍ.", + "TEXT_REVERSE_MESSAGE0": "tti %1", + "TEXT_REVERSE_TOOLTIP": "Ad yetti asmizzwer n yisekkilen 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 yiferdisen.", + "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 yiḥder-a n tebdart.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ad yernu aferdis ɣer 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 mayella tabdart d tilemt.", + "LISTS_INLIST": "di tebdart", + "LISTS_INDEX_OF_FIRST": "af-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 amezwaru deg tebdart. Ad d-yerr %1 ma yella ulac aferdis.", + "LISTS_GET_INDEX_GET": "awi", + "LISTS_GET_INDEX_GET_REMOVE": "awi rnu kkes", + "LISTS_GET_INDEX_REMOVE": "kkes", + "LISTS_GET_INDEX_FROM_END": "# si taggara", + "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 yettwamlen 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 syin ad d-yerr aferdis n wadig yettwamlen 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 yettwamlen 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 yettwamlen 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 yettwamlen 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 taggara 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 taggara", + "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 taggara", + "LISTS_GET_SUBLIST_TOOLTIP": "Ad yernu anɣel n uḥric yettwamlen 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 yiḍrisen, s unegzum yal anabraz.", + "LISTS_SPLIT_TOOLTIP_JOIN": "ad yesdukel tabdart n yiḍrisen deg yiwen s usnabraz.", + "LISTS_REVERSE_MESSAGE0": "tti %1", + "LISTS_REVERSE_TOOLTIP": "Tti anɣel n tebdart.", + "VARIABLES_GET_TOOLTIP": "Ad d-yerr azal n umutti-a.", + "VARIABLES_GET_CREATE_SET": "Rnu 'sbadu %1'", + "VARIABLES_SET": "sbadu %1 ar %2", + "VARIABLES_SET_TOOLTIP": "Ad yesbadu amutti-a 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-a...", + "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-a ɣur-s iɣewwaṛen usligen.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Selkem tawuri '%1' i yesbadu useqdac.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Selkem tawuri '%1' i yesbadu useqdac sakin seqdec agmuḍ-is.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "inekcam", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Rnu, kkes neɣ ales asmizzwer n yinekcam i twuri-a.", + "PROCEDURES_MUTATORARG_TITLE": "isem n unekcum:", + "PROCEDURES_MUTATORARG_TOOLTIP": "rnu anekcam ɣer twuri-a.", + "PROCEDURES_HIGHLIGHT_DEF": "Sebrureq 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-a yezmer ur yettwaseqdac ara anagar deg tebadut n twuri-a.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Ini kra...", + "WORKSPACE_ARIA_LABEL": "Tallunt n umahel Blockly", + "COLLAPSED_WARNINGS_WARNING": "Iḥedran yettin gebren ilɣa." +} diff --git a/static/js/msg/json/kn.json b/static/js/msg/json/kn.json new file mode 100644 index 0000000..f10b13d --- /dev/null +++ b/static/js/msg/json/kn.json @@ -0,0 +1,352 @@ +{ + "@metadata": { + "authors": [ + "Ananth subray", + "Anoop rao", + "Ksh31", + "Ksramwiki1957", + "Mahadevaiah Siddaiah", + "Nayvik", + "Niekiran", + "VASANTH S.N." + ] + }, + "VARIABLES_DEFAULT_NAME": "ಅಂಶ", + "UNNAMED_KEY": "ಹೆಸರಿಡದ", + "TODAY": "ಇಂದು", + "DUPLICATE_BLOCK": "ಪ್ರತಿ", + "ADD_COMMENT": "ಟಿಪ್ಪಣಿ ಸೇರಿಸು", + "REMOVE_COMMENT": "ಟಿಪ್ಪಣಿ ಅಳಿಸು", + "DUPLICATE_COMMENT": "ಟಿಪ್ಪಣಿಯ ಪ್ರತಿ ಮಾಡು", + "EXTERNAL_INPUTS": "ಬಾಹ್ಯ ಒಳಾಂಶಗಳು", + "INLINE_INPUTS": "ಸಾಲಿನಲ್ಲಿರುವ ಒಳಾoಶಗಳು", + "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": "ನಿರ್ದಿಷ್ಟ ಪ್ರಮಾಣದಲ್ಲಿ ಕೆಂಪು, ಹಸಿರು ಮತ್ತು ನೀಲಿಯನ್ನು ಹೊಂದಿದ ಒಂದು ಬಣ್ಣವನ್ನು ರಚಿಸಿ. ಎಲ್ಲಾ ಮೌಲ್ಯಗಳು 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": "%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": "ಅಂತಿಮವಾದ, ಎಲ್ಲವನ್ನೂ-ಹಿಡಿ ಷರತ್ತನ್ನು 'ಆಗಿದ್ದರೆ' ಬ್ಲಾಕ್ ಗೆ ಸೇರಿಸಿ.", + "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/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": "ಒಂದು ಸಂಖ್ಯೆಯ 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": "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": "%2 ರಲ್ಲಿ %1 ಅನ್ನು ಎಣಿಸಿ", + "TEXT_COUNT_TOOLTIP": "ಬೇರೆ ಕೆಲವು ಪಠ್ಯಗಳಲ್ಲಿ ಕೆಲವು ಪಠ್ಯವು ಎಷ್ಟು ಬಾರಿ ಸಂಭವಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಎಣಿಸಿ.", + "TEXT_REPLACE_MESSAGE0": "%1 ಅನ್ನು %3 ರಲ್ಲಿ %2 ರೊಂದಿಗೆ ಬದಲಾಯಿಸಿ.", + "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://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": "ಒಳಾoಶಗಳು", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "ಈ ಕಾರ್ಯಕ್ಕೆ ಒಳಾoಶಗಳನ್ನು ಸೇರಿಸಿ, ತೆಗೆದುಹಾಕಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಿ.", + "PROCEDURES_MUTATORARG_TITLE": "ಒಳಾoಶದ ಹೆಸರು:", + "PROCEDURES_MUTATORARG_TOOLTIP": "ಕಾರ್ಯಘಟಕಕ್ಕೆ ಒಳಾoಶವನ್ನು ಸೇರಿಸಿ.", + "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/static/js/msg/json/ko.json b/static/js/msg/json/ko.json new file mode 100644 index 0000000..9113856 --- /dev/null +++ b/static/js/msg/json/ko.json @@ -0,0 +1,422 @@ +{ + "@metadata": { + "authors": [ + "Alex00728", + "Codenstory", + "Gongsoonyee", + "Hym411", + "JeonHK", + "Jerrykim306", + "Kurousagi", + "Lemondoge", + "Liuxinyu970226", + "Nuevo Paso", + "Onebone", + "Peurocs4", + "Priviet", + "Revi", + "SeoJeongHo", + "Ykhwong", + "아라" + ] + }, + "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_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://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", + "MATH_ATAN2_TITLE": "X:%1 Y:%2의 atan2", + "MATH_ATAN2_TOOLTIP": "점 (X, Y)의 아크탄젠트를 -180에서 180까지 도 단위로 반환합니다.", + "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_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_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": "말해 보세요...", + "WORKSPACE_ARIA_LABEL": "Blockly 워크스페이스", + "COLLAPSED_WARNINGS_WARNING": "접힌 블록이 경고를 포함하고 있습니다." +} diff --git a/static/js/msg/json/lb.json b/static/js/msg/json/lb.json new file mode 100644 index 0000000..745d5da --- /dev/null +++ b/static/js/msg/json/lb.json @@ -0,0 +1,145 @@ +{ + "@metadata": { + "authors": [ + "Les Meloures", + "Robby", + "Soued031" + ] + }, + "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/static/js/msg/json/lki.json b/static/js/msg/json/lki.json new file mode 100644 index 0000000..e27c575 --- /dev/null +++ b/static/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/static/js/msg/json/lo.json b/static/js/msg/json/lo.json new file mode 100644 index 0000000..ec7aabb --- /dev/null +++ b/static/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/static/js/msg/json/lrc.json b/static/js/msg/json/lrc.json new file mode 100644 index 0000000..ff4f0be --- /dev/null +++ b/static/js/msg/json/lrc.json @@ -0,0 +1,136 @@ +{ + "@metadata": { + "authors": [ + "Lorestani", + "Mogoeilor" + ] + }, + "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/static/js/msg/json/lt.json b/static/js/msg/json/lt.json new file mode 100644 index 0000000..c477527 --- /dev/null +++ b/static/js/msg/json/lt.json @@ -0,0 +1,323 @@ +{ + "@metadata": { + "authors": [ + "Eitvys200", + "Jurgis", + "Nuodas", + "Zygimantus" + ] + }, + "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/static/js/msg/json/lv.json b/static/js/msg/json/lv.json new file mode 100644 index 0000000..c206623 --- /dev/null +++ b/static/js/msg/json/lv.json @@ -0,0 +1,321 @@ +{ + "@metadata": { + "authors": [ + "Elomage", + "Janis", + "Papuass", + "RFenichel", + "Silraks" + ] + }, + "VARIABLES_DEFAULT_NAME": "vienums", + "UNNAMED_KEY": "nenosaukts", + "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/static/js/msg/json/mk.json b/static/js/msg/json/mk.json new file mode 100644 index 0000000..8ae40bd --- /dev/null +++ b/static/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/static/js/msg/json/mnw.json b/static/js/msg/json/mnw.json new file mode 100644 index 0000000..6988a70 --- /dev/null +++ b/static/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/static/js/msg/json/ms.json b/static/js/msg/json/ms.json new file mode 100644 index 0000000..b10332d --- /dev/null +++ b/static/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/static/js/msg/json/nb.json b/static/js/msg/json/nb.json new file mode 100644 index 0000000..d62ec0d --- /dev/null +++ b/static/js/msg/json/nb.json @@ -0,0 +1,373 @@ +{ + "@metadata": { + "authors": [ + "Cocu", + "Jon Harald Søby", + "Kingu", + "SuperPotato", + "아라" + ] + }, + "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/static/js/msg/json/nl.json b/static/js/msg/json/nl.json new file mode 100644 index 0000000..d5ca300 --- /dev/null +++ b/static/js/msg/json/nl.json @@ -0,0 +1,405 @@ +{ + "@metadata": { + "authors": [ + "Elroy", + "Festina90", + "JaapDeKleine", + "Jeleniccz", + "Klaas van Buiten", + "KlaasZ4usV", + "Lemondoge", + "Marcelhospers", + "McDutchie", + "MedShot", + "Optilete", + "Patio", + "Ribert", + "Siebrand", + "Sjoerddebruin", + "아라" + ] + }, + "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/static/js/msg/json/oc.json b/static/js/msg/json/oc.json new file mode 100644 index 0000000..758ae13 --- /dev/null +++ b/static/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/static/js/msg/json/pl.json b/static/js/msg/json/pl.json new file mode 100644 index 0000000..245b6e5 --- /dev/null +++ b/static/js/msg/json/pl.json @@ -0,0 +1,391 @@ +{ + "@metadata": { + "authors": [ + "Chrumps", + "Cirasean", + "Cotidianis", + "Expert3222", + "Faren", + "Fringoo", + "InternerowyGołąb", + "Krottyianock", + "Krzyz23", + "Liuxinyu970226", + "Mateon1", + "Mazab IZW", + "Pbz", + "Pio387", + "Rail", + "Stojex", + "Teeed", + "Vengir", + "WaldiSt", + "Wojtas", + "Woytecr", + "아라" + ] + }, + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TOOLTIP": "Zwraca arcus tangens punktu (X, Y) w stopniach od -180 do 180.", + "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ś...", + "COLLAPSED_WARNINGS_WARNING": "Zwinięte bloki zawierają ostrzeżenia." +} diff --git a/static/js/msg/json/pms.json b/static/js/msg/json/pms.json new file mode 100644 index 0000000..c89b503 --- /dev/null +++ b/static/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/static/js/msg/json/pt-br.json b/static/js/msg/json/pt-br.json new file mode 100644 index 0000000..3da9fa7 --- /dev/null +++ b/static/js/msg/json/pt-br.json @@ -0,0 +1,390 @@ +{ + "@metadata": { + "authors": [ + "Almondega", + "Amgauna", + "BarbaraAckles", + "Cainamarques", + "Caçador de Palavras", + "Cristofer Alves", + "EVinente", + "Eduardo Addad de Oliveira", + "Espertus", + "Fasouzafreitas", + "Felipe L. Ewald", + "Lowvy", + "Luk3", + "Mauricio", + "McDutchie", + "Mordecaista", + "Prilopes", + "Rodrigo codignoli", + "Rogerio Melfi", + "TheGabrielZaum", + "Trigonometria87", + "Tuliouel", + "Webysther", + "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/static/js/msg/json/pt.json b/static/js/msg/json/pt.json new file mode 100644 index 0000000..91db928 --- /dev/null +++ b/static/js/msg/json/pt.json @@ -0,0 +1,384 @@ +{ + "@metadata": { + "authors": [ + "Athena in Wonderland", + "Diniscoelho", + "Fúlvio", + "Hamilton Abreu", + "Imperadeiro98", + "Mansil", + "Mansil alfalb", + "Mauricio", + "McDutchie", + "MokaAkashiyaPT", + "Nicola Nascimento", + "Vicng", + "Vitorvicentevalente", + "Waldir", + "Waldyrious", + "Önni", + "아라" + ] + }, + "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/static/js/msg/json/qqq.json b/static/js/msg/json/qqq.json new file mode 100644 index 0000000..f2b7d17 --- /dev/null +++ b/static/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/static/js/msg/json/ro.json b/static/js/msg/json/ro.json new file mode 100644 index 0000000..4c73585 --- /dev/null +++ b/static/js/msg/json/ro.json @@ -0,0 +1,368 @@ +{ + "@metadata": { + "authors": [ + "Ely en", + "Hugbear", + "MSClaudiu", + "Minisarm", + "Wintereu", + "Ykhwong", + "아라" + ] + }, + "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/static/js/msg/json/ru.json b/static/js/msg/json/ru.json new file mode 100644 index 0000000..df4d136 --- /dev/null +++ b/static/js/msg/json/ru.json @@ -0,0 +1,368 @@ +{ + "@metadata": { + "authors": [ + "Espertus", + "Facenapalm", + "Helpau", + "MS", + "Mailman", + "Mouse21", + "Movses", + "Okras", + "Phil Rigovanov", + "RedFox", + "Redredsonia", + "Silovan", + "SimondR", + "Teretalexev", + "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": "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/static/js/msg/json/sc.json b/static/js/msg/json/sc.json new file mode 100644 index 0000000..903516a --- /dev/null +++ b/static/js/msg/json/sc.json @@ -0,0 +1,297 @@ +{ + "@metadata": { + "authors": [ + "Taxandru", + "Uharteko", + "Via maxima" + ] + }, + "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/static/js/msg/json/sd.json b/static/js/msg/json/sd.json new file mode 100644 index 0000000..666d470 --- /dev/null +++ b/static/js/msg/json/sd.json @@ -0,0 +1,158 @@ +{ + "@metadata": { + "authors": [ + "Aursani", + "Indus Asia", + "Mehtab ahmed", + "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/static/js/msg/json/shn.json b/static/js/msg/json/shn.json new file mode 100644 index 0000000..fcea65b --- /dev/null +++ b/static/js/msg/json/shn.json @@ -0,0 +1,109 @@ +{ + "@metadata": { + "authors": [ + "Saimawnkham", + "Saosukham" + ] + }, + "VARIABLES_DEFAULT_NAME": "ဢၼ်", + "TODAY": "မိူဝ်ႈၼႆႉ", + "DUPLICATE_BLOCK": "ထုတ်ႇ", + "ADD_COMMENT": "သႂ်ႇၶေႃႈၶႆႈၸႂ်", + "REMOVE_COMMENT": "ထွၼ်ပႅတ်ႈ ၶေႃႈၶႆႈၸႂ်", + "EXTERNAL_INPUTS": "ၶိူင်ႈဢၼ်လုၵ်ႉတၢင်းၼွၵ်ႈၶဝ်ႈမႃး", + "INLINE_INPUTS": "ၶိူင်ႈဢၼ်ၶဝ်ႈမႃးၸွမ်းလႅင်း", + "DELETE_BLOCK": "မွတ်ႇပလွၵ်ႉ", + "DELETE_X_BLOCKS": "မွတ်ႇလွင်ႈႁႄႉတတ်း %1", + "COLLAPSE_BLOCK": "လွင်ႈႁႄႉတတ်းလႅဝ်", + "COLLAPSE_ALL": "လွင်ႈႁႄႉတတ်းၸိူဝ်းလႅဝ်", + "EXPAND_BLOCK": "ၶႂၢၵ်ႈလွင်ႈႁႄႉတတ်း", + "EXPAND_ALL": "ၶႂၢၵ်ႈၸိူဝ်းႁႄႉတတ်း", + "DISABLE_BLOCK": "ဢိုတ်းၸႂ်ႉ လွင်ႈႁႄႉတတ်း", + "ENABLE_BLOCK": "ပိုတ်ႇၸႂ်ႉ လွင်ႈႁႄႉတတ်း", + "HELP": "ၸွႆႈထႅမ်", + "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/static/js/msg/json/sk.json b/static/js/msg/json/sk.json new file mode 100644 index 0000000..9fedf51 --- /dev/null +++ b/static/js/msg/json/sk.json @@ -0,0 +1,357 @@ +{ + "@metadata": { + "authors": [ + "Adams", + "Genhis", + "Jaroslav.micek", + "Kusavica", + "Lexected", + "Marian.stano", + "Mark", + "Nykta 1917", + "Pmikolas44", + "TomášPolonec" + ] + }, + "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/static/js/msg/json/skr-arab.json b/static/js/msg/json/skr-arab.json new file mode 100644 index 0000000..b1b0c3f --- /dev/null +++ b/static/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/static/js/msg/json/sl.json b/static/js/msg/json/sl.json new file mode 100644 index 0000000..a21e0a2 --- /dev/null +++ b/static/js/msg/json/sl.json @@ -0,0 +1,401 @@ +{ + "@metadata": { + "authors": [ + "Anzeljg", + "Dbc334", + "HairyFotr", + "Igor.pesek", + "LoveMortuus", + "MaxiMouse", + "Miloš Košir" + ] + }, + "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 tabeli %2", + "CONTROLS_FOREACH_TOOLTIP": "Za vsak element v tabeli, 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": "Vsebuje delčke", + "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 tabele", + "MATH_ONLIST_TOOLTIP_SUM": "Vrne vsoto vseh števil v tabeli.", + "MATH_ONLIST_OPERATOR_MIN": "minimum tabele", + "MATH_ONLIST_TOOLTIP_MIN": "Vrne najmanjše število v tabeli.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum tabele", + "MATH_ONLIST_TOOLTIP_MAX": "Vrne največje število v tabeli.", + "MATH_ONLIST_OPERATOR_AVERAGE": "povprečje tabele", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrne povprečje (aritmetično sredino) števil v tabeli.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediana tabele", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrne mediano števil v tabeli.", + "MATH_ONLIST_OPERATOR_MODE": "modus tabele", + "MATH_ONLIST_TOOLTIP_MODE": "Vrne seznam najpogostejšega elementa(-ov) v tabeli.", + "MATH_ONLIST_OPERATOR_STD_DEV": "standardni odklon tabele", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrne standardni odklon elementov v tabeli.", + "MATH_ONLIST_OPERATOR_RANDOM": "naključni element tabele", + "MATH_ONLIST_TOOLTIP_RANDOM": "Vrne naključno število izmed števil v tabeli.", + "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 prazno tabelo", + "LISTS_CREATE_EMPTY_TOOLTIP": "Vrne tabelo dolžine 0, ki ne vsebuje nobenih elementov.", + "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_CREATE_WITH_TOOLTIP": "Ustvari tabelo s poljubnim številom elementov.", + "LISTS_CREATE_WITH_INPUT_WITH": "ustvari tabelo iz", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "tabela", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tabele.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Doda element v tabelo.", + "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_REPEAT_TOOLTIP": "Ustvari tabelo iz danega elementa, ki se poljubno mnogokrat ponovi.", + "LISTS_REPEAT_TITLE": "ustvari tabelo iz elementa %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 tabele.", + "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 tabela prazna.", + "LISTS_INLIST": "v tabeli", + "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 tabeli. Č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 tabeli.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrne prvi element tabele.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrne zadnji element tabele.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrne naključni element tabele.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstrani in vrne element na določenem mestu v tabeli.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstrani in vrne prvi element tabele.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstrani in vrne zadnji element tabele.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstrani in vrne naključni element tabele.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odstrani element na določenem mestu v tabeli.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstrani prvi element tabele.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstrani zadnji element tabele.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstrani naključni element tabele.", + "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 tabeli.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastavi prvi element tabele.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastavi zadnji element tabele.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastavi naključni element tabele.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vstavi element na določeno mesto v tabeli.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vstavi element na začetek tabele.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Doda element na konec tabele.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vstavi element na naključno mesto v tabeli.", + "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 novo tabelo, kot kopijo določenega dela tabele.", + "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 tabele.", + "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 tabelo iz besedila", + "LISTS_SPLIT_TEXT_FROM_LIST": "ustvari besedilo iz tabele", + "LISTS_SPLIT_WITH_DELIMITER": "z ločilom", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Razdruži besedilo v tabelo besedil. Za razdruževanje besedila uporabi ločilo.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Združi tabelo besedil v eno besedilo, ločeno z ločilom.", + "LISTS_REVERSE_MESSAGE0": "obrni %1", + "LISTS_REVERSE_TOOLTIP": "Obrne kopijo tabele.", + "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": "vsebuje delčke", + "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/static/js/msg/json/sq.json b/static/js/msg/json/sq.json new file mode 100644 index 0000000..bdd0334 --- /dev/null +++ b/static/js/msg/json/sq.json @@ -0,0 +1,359 @@ +{ + "@metadata": { + "authors": [ + "Arianit", + "Liridon", + "아라" + ] + }, + "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/static/js/msg/json/sr-latn.json b/static/js/msg/json/sr-latn.json new file mode 100644 index 0000000..e06a531 --- /dev/null +++ b/static/js/msg/json/sr-latn.json @@ -0,0 +1,357 @@ +{ + "@metadata": { + "authors": [ + "Kizule", + "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/static/js/msg/json/sr.json b/static/js/msg/json/sr.json new file mode 100644 index 0000000..437ec93 --- /dev/null +++ b/static/js/msg/json/sr.json @@ -0,0 +1,384 @@ +{ + "@metadata": { + "authors": [ + "Acamicamacaraca", + "BadDog", + "Kizule", + "Nikola Smolenski", + "Obsuser", + "Perevod16", + "Rancher", + "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/static/js/msg/json/sv.json b/static/js/msg/json/sv.json new file mode 100644 index 0000000..6b87be5 --- /dev/null +++ b/static/js/msg/json/sv.json @@ -0,0 +1,378 @@ +{ + "@metadata": { + "authors": [ + "Aaoo", + "Abbedabb", + "Eldaria", + "Jopparn", + "Sabelöga", + "Smuda", + "WikiPhoenix", + "아라" + ] + }, + "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 namnet \"%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://sv.wikipedia.org/wiki/Modulär_aritmetik", + "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/static/js/msg/json/synonyms.json b/static/js/msg/json/synonyms.json new file mode 100644 index 0000000..944aa9b --- /dev/null +++ b/static/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/static/js/msg/json/ta.json b/static/js/msg/json/ta.json new file mode 100644 index 0000000..6c0ed1d --- /dev/null +++ b/static/js/msg/json/ta.json @@ -0,0 +1,314 @@ +{ + "@metadata": { + "authors": [ + "Aswn", + "ElangoRamanujam", + "Ezhillang", + "Karuthan", + "Mahir78", + "Thangamani-arun" + ] + }, + "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": "உதவி", + "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_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_OK": "சரி", + "IOS_CANCEL": "இரத்து செய்", + "IOS_ERROR": "பிழை", + "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_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_SORT_ORDER_ASCENDING": "ஏறுவரிசை", + "LISTS_SORT_ORDER_DESCENDING": "இறங்குவரிசை", + "LISTS_SORT_TYPE_NUMERIC": "எண்வரிசை", + "LISTS_SORT_TYPE_TEXT": "அகரவரிசை", + "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/static/js/msg/json/tcy.json b/static/js/msg/json/tcy.json new file mode 100644 index 0000000..17b2442 --- /dev/null +++ b/static/js/msg/json/tcy.json @@ -0,0 +1,328 @@ +{ + "@metadata": { + "authors": [ + "BHARATHESHA ALASANDEMAJALU", + "Bharathesha Alasandemajalu", + "Kiranpoojary", + "Ravi Mundkur", + "Vishwanatha Badikana" + ] + }, + "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/static/js/msg/json/te.json b/static/js/msg/json/te.json new file mode 100644 index 0000000..9ee0c18 --- /dev/null +++ b/static/js/msg/json/te.json @@ -0,0 +1,98 @@ +{ + "@metadata": { + "authors": [ + "Naidugari Jayanna", + "Veeven", + "WP MANIKHANTA" + ] + }, + "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/static/js/msg/json/th.json b/static/js/msg/json/th.json new file mode 100644 index 0000000..c6c32f1 --- /dev/null +++ b/static/js/msg/json/th.json @@ -0,0 +1,352 @@ +{ + "@metadata": { + "authors": [ + "Aefgh39622", + "Azpirin", + "Horus", + "Karit", + "Nantapat", + "Octahedron80", + "Roysheng", + "Trisorn Triboon" + ] + }, + "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_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://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/static/js/msg/json/tl.json b/static/js/msg/json/tl.json new file mode 100644 index 0000000..fc643d3 --- /dev/null +++ b/static/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/static/js/msg/json/tlh.json b/static/js/msg/json/tlh.json new file mode 100644 index 0000000..4306c45 --- /dev/null +++ b/static/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/static/js/msg/json/tr.json b/static/js/msg/json/tr.json new file mode 100644 index 0000000..e695e70 --- /dev/null +++ b/static/js/msg/json/tr.json @@ -0,0 +1,394 @@ +{ + "@metadata": { + "authors": [ + "Alpkant", + "Azerhan Özen", + "BaRaN6161 TURK", + "Bulgu", + "By erdo can", + "Grkn gll", + "Gurkanht", + "HakanIST", + "Hedda", + "Imabadplayer", + "Joseph", + "Kumkumuk", + "Mavrikant", + "McAang", + "Meelo", + "MuratTheTurkish", + "Stonecy", + "Uncitoyen", + "Uğurkent", + "Watermelon juice", + "WikiBronze", + "아라" + ] + }, + "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 yalnızca 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://tr.wikipedia.org/wiki/Sıfırlanabilir_tip", + "LOGIC_NULL": "boş", + "LOGIC_NULL_TOOLTIP": "Boş değerini döndürür.", + "LOGIC_TERNARY_HELPURL": "https://tr.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/Sayı", + "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", + "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": "-", + "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://tr.wikipedia.org/wiki/Alt_program", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Kullanıcı tanımlı '%1' işlevini çalıştırın.", + "PROCEDURES_CALLRETURN_HELPURL": "https://tr.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/static/js/msg/json/ug-arab.json b/static/js/msg/json/ug-arab.json new file mode 100644 index 0000000..9c9aebd --- /dev/null +++ b/static/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/static/js/msg/json/uk.json b/static/js/msg/json/uk.json new file mode 100644 index 0000000..9e81b2c --- /dev/null +++ b/static/js/msg/json/uk.json @@ -0,0 +1,372 @@ +{ + "@metadata": { + "authors": [ + "Andriykopanytsia", + "Base", + "Gzhegozh", + "Igor Zavadsky", + "Lxlalexlxl", + "Movses", + "Piramidion", + "SimondR", + "Visem", + "아라" + ] + }, + "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/static/js/msg/json/ur.json b/static/js/msg/json/ur.json new file mode 100644 index 0000000..d9e5100 --- /dev/null +++ b/static/js/msg/json/ur.json @@ -0,0 +1,119 @@ +{ + "@metadata": { + "authors": [ + "Abdulq", + "NajeebKhan", + "Obaid Raza", + "Rizwan", + "Sayam Asjad", + "عثمان خان شاہ", + "محمد افضل" + ] + }, + "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://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/static/js/msg/json/vi.json b/static/js/msg/json/vi.json new file mode 100644 index 0000000..91faedf --- /dev/null +++ b/static/js/msg/json/vi.json @@ -0,0 +1,357 @@ +{ + "@metadata": { + "authors": [ + "Baonguyen21022003", + "Dstream", + "Espertus", + "Leducthn", + "Nguyenvanduocit", + "Nguyễn Mạnh An", + "Qneutron", + "SierraNguyen", + "Withoutaname" + ] + }, + "VARIABLES_DEFAULT_NAME": "vật", + "UNNAMED_KEY": "không tên", + "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ì đó...", + "WORKSPACE_ARIA_LABEL": "Không gian làm việc Blockly", + "COLLAPSED_WARNINGS_WARNING": "Các khối bị sập có chứa cảnh báo." +} diff --git a/static/js/msg/json/xmf.json b/static/js/msg/json/xmf.json new file mode 100644 index 0000000..f6dd859 --- /dev/null +++ b/static/js/msg/json/xmf.json @@ -0,0 +1,94 @@ +{ + "@metadata": { + "authors": [ + "Narazeni", + "Silovan" + ] + }, + "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_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/static/js/msg/json/yo.json b/static/js/msg/json/yo.json new file mode 100644 index 0000000..678a678 --- /dev/null +++ b/static/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/static/js/msg/json/zgh.json b/static/js/msg/json/zgh.json new file mode 100644 index 0000000..d90c52d --- /dev/null +++ b/static/js/msg/json/zgh.json @@ -0,0 +1,102 @@ +{ + "@metadata": { + "authors": [ + "Amara-Amaziɣ", + "Aslmad mohamed belarhzali", + "Hakim1bal" + ] + }, + "VARIABLES_DEFAULT_NAME": "ⴰⴼⵔⴷⵉⵙ", + "UNNAMED_KEY": "ⴰⵔⵉⵙⵎ", + "TODAY": "ⴰⵙⵙⴰ", + "ADD_COMMENT": "ⵔⵏⵓ ⴰⵅⴼⴰⵡⴰⵍ", + "REMOVE_COMMENT": "ⴽⴽⵙ ⴰⵅⴼⴰⵡⴰⵍ", + "DELETE_BLOCK": "ⴽⴽⵙ ⴰⴱⵍⵓⴽ", + "DELETE_X_BLOCKS": "ⴽⴽⵙ %1 ⵉⴱⵍⵓⴽⵏ", + "DELETE_ALL_BLOCKS": "ⴽⴽⵙ %1 ⵉⴱⵍⵓⴽⵏ ⵎⴰⵕⵕⴰ?", + "HELP": "ⵜⵉⵡⵉⵙⵉ", + "UNDO": "ⵙⵔ", + "REDO": "ⴰⵍⵙ", + "CHANGE_VALUE_TITLE": "ⵙⵏⴼⵍ ⴰⵣⴰⵍ:", + "RENAME_VARIABLE": "ⵙⵏⴼⵍ ⵉⵙⵎ ⵏ ⵓⵎⵙⴽⵉⵍ...", + "RENAME_VARIABLE_TITLE": "ⵙⵏⴼⵍ ⵉⵎⵙⴽⵉⵍⵏ ⴰⴽⴽ '%1' ⵖⵔ:", + "NEW_VARIABLE": "ⵙⴽⵔ ⴰⵎⵙⴽⵉⵍ...", + "NEW_NUMBER_VARIABLE": "ⵙⴽⵔ ⴰⵎⴹⴰⵏ ⴰⵎⵙⴽⵉⵍ...", + "NEW_COLOUR_VARIABLE": "ⵙⴽⵔ ⴰⴽⵍⵓ ⴰⵎⵙⴽⵉⵍ...", + "NEW_VARIABLE_TYPE_TITLE": "ⴰⵏⴰⵡ ⴰⵎⴰⵢⵏⵓ ⵏ ⵓⵎⵙⴽⵉⵍ:", + "NEW_VARIABLE_TITLE": "ⵉⵙⵎ ⵏ ⵓⵎⵙⴽⵉⵍ ⴰⵎⴰⵢⵏⵓ:", + "DELETE_VARIABLE": "ⴽⴽⵙ ⴰⵎⵙⴽⵉⵍ '%1'", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "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": "ⴰⵙⵙⴰⵖ", + "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_WHILEUNTIL_TOOLTIP_WHILE": "ⴽⵓⴷ ⵉⴷⵜⵜⴰ ⵡⴰⵣⴰⵍ, ⵙⵙⵍⴽⵎ ⴽⵔⴰ ⵏ ⵡⴰⵏⴰⴹⵏ.", + "CONTROLS_IF_MSG_IF": "ⵎⴽ", + "CONTROLS_IF_MSG_ELSEIF": "ⵉⵙ", + "CONTROLS_IF_MSG_ELSE": "ⵎⴽ ⴷ ⵓⵀⵓ", + "IOS_OK": "ⵡⴰⵅⵅⴰ", + "IOS_CANCEL": "ⵙⵔ", + "IOS_ERROR": "ⴰⵣⴳⴰⵍ", + "IOS_PROCEDURES_INPUTS": "ⵉⵏⴽⵛⵓⵎⵏ", + "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_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_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_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_CHANGE_TITLE": "ⵙⵏⴼⵍ %1 ⵙ %2", + "MATH_CHANGE_TOOLTIP": "ⵔⵏⵓ ⵢⴰⵏ ⵓⵎⴹⴰⵏ ⵖⵔ ⵓⵎⵙⴽⵉⵍ '%1'", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 ⵙⴳ X:%1 Y:%2", + "TEXT_JOIN_TITLE_CREATEWITH": "ⵙⵏⴼⵍⵓⵍ ⴰⴹⵕⵉⵚ ⵙ", + "TEXT_CREATE_JOIN_TITLE_JOIN": "ⵍⴽⵎ", + "TEXT_LENGTH_TITLE": "ⵜⵉⵖⵣⵉ ⵏ %1", + "TEXT_INDEXOF_TITLE": "ⴳ ⵓⴹⵕⵉⵚ %1 %2 %3", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ⴳ ⵓⴹⵕⵉⵚ", + "TEXT_GET_SUBSTRING_END_LAST": "ⴰⵔ ⵓⵙⴽⴽⵉⵍ ⴰⵎⴳⴳⴰⵔⵓ", + "LISTS_LENGTH_TITLE": "ⵜⵉⵖⵣⵉ ⵏ %1", + "LISTS_INLIST": "ⴳ ⵜⵍⴳⴰⵎⵜ", + "LISTS_GET_INDEX_REMOVE": "ⵙⵉⵜⵜⵢ", + "LISTS_GET_INDEX_FROM_END": "# ⵙⴳ ⵜⵉⴳⵉⵔⴰ", + "LISTS_GET_INDEX_FIRST": "ⴰⵎⵣⵡⴰⵔⵓ", + "LISTS_GET_INDEX_LAST": "ⴰⵎⴳⴳⴰⵔⵓ", + "LISTS_SET_INDEX_INPUT_TO": "ⴰⵎ", + "LISTS_GET_SUBLIST_END_FROM_START": "ⴰⵔ #", + "LISTS_GET_SUBLIST_END_LAST": "ⴰⵔ ⵜⴳⵉⵔⴰ", + "LISTS_SORT_TYPE_NUMERIC": "ⴰⵎⵓⵟⵟⵓⵏ", + "PROCEDURES_DEFNORETURN_TITLE": "ⵉ", + "PROCEDURES_DEFNORETURN_PROCEDURE": "ⴳ ⴽⵔⴰ", + "PROCEDURES_BEFORE_PARAMS": "ⵙ:", + "PROCEDURES_CALL_BEFORE_PARAMS": "ⵙ:", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_MUTATORARG_TOOLTIP": "ⵔⵏⵓ ⴰⵏⴽⵛⴰⵎ ⵖⵔ ⵜⵙⵖⵏⵜ." +} diff --git a/static/js/msg/json/zh-hans.json b/static/js/msg/json/zh-hans.json new file mode 100644 index 0000000..e807a21 --- /dev/null +++ b/static/js/msg/json/zh-hans.json @@ -0,0 +1,382 @@ +{ + "@metadata": { + "authors": [ + "A Chinese Wikipedian", + "Ambeta", + "Deathkon", + "Duzc2", + "Espertus", + "Htq110219891", + "Hudafu", + "Liuxinyu970226", + "Luotiancheng", + "Muhaoying", + "Qiyue2001", + "Shatteredwind", + "Tonylianlong", + "WindWood", + "Xiaomingyan", + "Yfdyh000", + "佛壁灯", + "沈澄心", + "아라" + ] + }, + "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/static/js/msg/json/zh-hant.json b/static/js/msg/json/zh-hant.json new file mode 100644 index 0000000..b0e8bc2 --- /dev/null +++ b/static/js/msg/json/zh-hant.json @@ -0,0 +1,363 @@ +{ + "@metadata": { + "authors": [ + "Cwlin0416", + "Dnow", + "Dnowba", + "Gasolin", + "Jessica1213", + "Kasimtan", + "Kly", + "LNDDYL", + "Liuxinyu970226", + "Wehwei", + "和平至上", + "沈澄心" + ] + }, + "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/static/js/msg/messages.js b/static/js/msg/messages.js new file mode 100644 index 0000000..884c972 --- /dev/null +++ b/static/js/msg/messages.js @@ -0,0 +1,1630 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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): + * ../scripts/i18n/js_to_json.py + * to regenerate json/{en,qqq,synonyms}.json. + * + * To convert all of the json files to .js files, run: + * ../scripts/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/static/js/navigation.js b/static/js/navigation.js new file mode 100644 index 0000000..b6ea294 --- /dev/null +++ b/static/js/navigation.js @@ -0,0 +1,349 @@ +$('.dropdown-menu a.dropdown-toggle').on('click', function (e) { + if (!$(this).next().hasClass('show')) { + $(this).parents('.dropdown-menu').first().find('.show').removeClass("show"); + } + var $subMenu = $(this).next(".dropdown-menu"); + $subMenu.toggleClass('show'); + + + $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) { + $('.dropdown-submenu .show').removeClass("show"); + }); + + + return false; +}); + +function CloseAllNav() { + $('.dropdown-submenu .show').removeClass("show"); + +} + +var onDisp = [] +var onReport = [] + + +function getData() { + if (JSON.stringify(onDisp) != JSON.stringify(Object.keys(VarData)) || Object.keys(VarData) == "") { + onDisp = Object.keys(VarData); + var varDataStr = JSON.stringify(VarData); + $.ajax({ + url: '/DataViewer', + data: varDataStr, + type: 'POST', + success: function (response) { + + response = response.substring(2, response.length - 2); + var responseList = response.split("', '") + + + var keys = Object.keys(VarData); + + + var result = {}; + keys.forEach((key, i) => result[key] = responseList[i]); + + }, + error: function (error) { + console.log(error); + } + }); + } +}; + + +function getDataDownload() { + if (JSON.stringify(onDisp) != JSON.stringify(Object.keys(VarData)) || Object.keys(VarData) == "") { + onDisp = Object.keys(VarData); + var varDataStr = JSON.stringify(VarData); + + $.ajax({ + url: '/DataViewer', + data: varDataStr, + type: 'POST', + success: function (response) { + + response = response.substring(2, response.length - 2); + var responseList = response.split("', '") + + + var keys = Object.keys(VarData); + + + var result = {}; + keys.forEach((key, i) => result[key] = responseList[i]); + document.getElementById("DataFrameDownload").innerHTML = ""; + for (var i = 0; i < Object.keys(VarData).length; i++) { + (function () { + + var k = i; + var DataViewer = document.getElementById("DataFrameDownload"); + var li = document.createElement("li"); + + var a = document.createElement('a'); + + var link = document.createTextNode(Object.keys(VarData)[i]); + + a.appendChild(link); + + a.title = Object.keys(VarData)[i]; + + a.className = "dropdown-item"; + + + a.addEventListener('click', function () { + + var html = document.createElement("body"); + html.innerHTML = responseList[k]; + export_table_to_csv(html, Object.keys(VarData)[k] + ".csv"); + //sexport_table_to_csv(responseList[k],Object.keys(VarData)[i]+".csv"); + }); + + li.appendChild(a); + DataViewer.appendChild(li); + + + }()); + } + }, + error: function (error) { + console.log(error); + } + }); + } +}; + +function getReport() { + + + document.getElementById("DataFrameReportViewer").innerHTML = ""; + + + for (var i = 0; i < Object.keys(VarData).length; i++) { + (function () { + + var k = i; + var DataViewer = document.getElementById("DataFrameReportViewer"); + var a = document.createElement('a'); + var link = document.createTextNode(Object.keys(VarData)[i]) + + a.appendChild(link); + + a.title = Object.keys(VarData)[i] + a.className = "dropdown-item"; + a.addEventListener('click', function () { + displayHTMLReport(a); + }); + DataViewer.appendChild(a); + var breaker = document.createElement("br"); + DataViewer.appendChild(breaker); + }()); // immediate invocation + } + + +}; + + +function getReportDownload() { + var varDataStr = JSON.stringify(VarData); + + $.ajax({ + url: '/DataReport', + data: varDataStr, + type: 'POST', + success: function (response) { + + response = response.substring(2, response.length - 2); + + + var responseList = response.split("', '") + + + + var keys = Object.keys(VarData); + + + var result = {}; + keys.forEach((key, i) => result[key] = responseList[i]); + + + document.getElementById("DataFrameReportDownload").innerHTML = ""; + + + for (var i = 0; i < Object.keys(VarData).length; i++) { + (function () { + + var k = i; + var DataViewer = document.getElementById("DataFrameReportDownload"); + var a = document.createElement('a'); + var link = document.createTextNode(Object.keys(VarData)[i]) + + a.appendChild(link); + a.title = Object.keys(VarData)[i] + a.className = "dropdown-item"; + a.addEventListener('click', function () { + downloadHTMLReport(responseList[k], Object.keys(VarData)[k], VarData); + }); + DataViewer.appendChild(a); + var breaker = document.createElement("br"); + DataViewer.appendChild(breaker); + }()); // immediate invocation + } + }, + error: function (error) { + console.log(error); + } + }); + + +}; + +function downloadHTMLReport(stringdata, id, VarData) { + var div = document.createElement("body"); + div.innerHTML = stringdata; + var text = div.outerHTML; + var fileType = "html" + var fileName = id + ".html" + var blob = new Blob([text], { type: fileType }); + + var a = document.createElement('a'); + a.download = fileName; + a.href = URL.createObjectURL(blob); + a.dataset.downloadurl = [fileType, a.download, a.href].join(':'); + a.style.display = "none"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + setTimeout(function () { URL.revokeObjectURL(a.href); }, 1500); +}; + +function downloadPy(fileName) { + + var text = Blockly.Python.workspaceToCode(blockly.workspace); + var fileType = "text" + var blob = new Blob([text], { type: fileType }); + + var a = document.createElement('a'); + a.download = fileName; + a.href = URL.createObjectURL(blob); + a.dataset.downloadurl = [fileType, a.download, a.href].join(':'); + a.style.display = "none"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + setTimeout(function () { URL.revokeObjectURL(a.href); }, 1500); + +} + +function downloadIpynb(fileName) { + + var Codetext = Blockly.Python.workspaceToCode(blockly.workspace); + var text = ("{ \"cells\": [ \n { \n \"cell_type\": \"code\", \n\"execution_count\": 1,\n\"metadata\": {}, \n\"outputs\": [],\n \"source\": [\n" + JSON.stringify(Codetext) + "\n]\n}\n],\n \"metadata\": {\n \"kernelspec\": {\n\"display_name\": \"Python 3\",\n\"language\": \"python\",\n\"name\": \"python3\"\n},\n\"language_info\": {\"codemirror_mode\": { \"name\": \"ipython\",\n \"version\": 3 \n},\n \"file_extension\": \".py\",\n\"mimetype\": \"text/x-python\", \n\"name\": \"python\", \n\"nbconvert_exporter\": \"python\",\n\"pygments_lexer\": \"ipython3\",\n\"version\": \"3.8.5\"\n} \n}, \n\"nbformat\": 4, \n\"nbformat_minor\": 2 \n}"); + var fileType = "text" + var blob = new Blob([text], { type: fileType }); + var a = document.createElement('a'); + a.download = fileName; + a.href = URL.createObjectURL(blob); + a.dataset.downloadurl = [fileType, a.download, a.href].join(':'); + a.style.display = "none"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + setTimeout(function () { URL.revokeObjectURL(a.href); }, 1500); + +} + +function download_csv(csv, filename) { + var csvFile; + var downloadLink; + csvFile = new Blob([csv], { type: "text/csv" }); + downloadLink = document.createElement("a"); + downloadLink.download = filename; + downloadLink.href = window.URL.createObjectURL(csvFile); + downloadLink.style.display = "none"; + document.body.appendChild(downloadLink); + downloadLink.click(); +} + +function export_table_to_csv(html, filename) { + var csv = []; + var rows = html.querySelectorAll("table tr"); + + for (var i = 0; i < rows.length; i++) { + var row = [], + cols = rows[i].querySelectorAll("td, th"); + + for (var j = 0; j < cols.length; j++) + row.push(cols[j].innerText); + + csv.push(row.join(",")); + } + download_csv(csv.join("\n"), filename); +} + + +function displayHTMLTable(stringdata, id, VarData) { + var tableHtml = window.open("/DataViewer", "_blank", "width=" + screen.availWidth + ", height=" + screen.availHeight + ""); + + + tableHtml.onload = function () { + var div = tableHtml.document.getElementsByTagName("body")[0]; + + div.innerHTML = stringdata; + + } +}; + +function displayHTMLReport(a) { + console.log(VarData[String(a.title)]); + $.ajax({ + url: '/DataVisualizer', + data: String(VarData[String(a.title)]), + type: 'POST', + success: function (response) { + + window.open("/visualizer", "_blank"); + } + }); + + +}; + +function closeForm() { + document.getElementById("myForm").style.display = "none"; +}; + +function closeToolTip() { + document.getElementById("tip-popup").style.display = "none"; +}; + +function closeDownloadCode() { + document.getElementById("download-code-popup").style.display = "none"; +}; + +function downloadView() { + document.getElementById("download-code-popup").style.display = "block"; +} + + +function downloadPyIpynbCode() { + var filename = document.getElementById("download-code-fname").value; + var extention = document.getElementById("download-code-extention").value; + fileName = filename + extention; + if (extention == ".py") { + downloadPy(fileName) + } + if (extention == ".ipynb") { + downloadIpynb(fileName) + } + + document.getElementById("download-code-popup").style.display = "none"; +} + + +$(document).keyup(function (e) { + if (e.key === "Escape") { // escape key maps to keycode `27` + document.getElementById("tip-popup").style.display = "none"; + document.getElementById("download-code-popup").style.display = "none"; + } +}); diff --git a/static/js/package-lock.json b/static/js/package-lock.json new file mode 100644 index 0000000..4fa2c1f --- /dev/null +++ b/static/js/package-lock.json @@ -0,0 +1,2078 @@ +{ + "name": "js", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "@blockly/theme-dark": "^1.0.5", + "blockly": "^5.20210325.1" + }, + "devDependencies": { + "@blockly/dev-tools": "^2.2.1" + } + }, + "node_modules/@blockly/block-test": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-1.0.13.tgz", + "integrity": "sha512-6SpIddvZlN4o76uNIF3v+p/5cQFrUQrBOGKpJeXooOW9/FZhAZ37gldwaTgDQCADXb2jtkHz0H6SHdwR8JjNvg==", + "dev": true, + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": ">=2" + } + }, + "node_modules/@blockly/dev-tools": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-2.2.1.tgz", + "integrity": "sha512-bfja9lWX/ItyvlLC2fjaO/AvsulVSzoNqMZ8SAF11UvmHNZGMB/ZxT+eRfpYWwLiDs1JfmtBBZsDLP6rb0eykQ==", + "dev": true, + "dependencies": { + "@blockly/block-test": "^1.0.13", + "chai": "^4.2.0", + "dat.gui": "^0.7.7", + "lodash.assign": "^4.2.0", + "lodash.merge": "^4.6.2", + "monaco-editor": "^0.20.0", + "sinon": "^9.0.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "blockly": ">=3.20191014.4" + } + }, + "node_modules/@blockly/theme-dark": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-1.0.5.tgz", + "integrity": "sha512-UcEH1XszAdlyNWWfdR9J2SrVS86aJP+6Z+7q9+VLqFUMf3Im0HKhVWUecmrra9dkm4W6sRBM2iPoVHiELKHIuw==", + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/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=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blockly": { + "version": "5.20210325.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-5.20210325.1.tgz", + "integrity": "sha512-qrilYPovJeDfxKDWm1YBUCPVNElh/iyC1szaHTIPZHj9C9YPpSzZOeFyyrPBbYRudzbo8kjBOWMtHnN1bLjkoQ==", + "dependencies": { + "jsdom": "15.2.1" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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=" + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==", + "dev": true + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/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, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/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=" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/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==" + }, + "node_modules/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=" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/monaco-editor": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz", + "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==", + "dev": true + }, + "node_modules/nise": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dependencies": { + "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.3", + "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.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/request-promise-native/node_modules/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==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/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==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dependencies": { + "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==" + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/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==" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/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==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + } + }, + "dependencies": { + "@blockly/block-test": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-1.0.13.tgz", + "integrity": "sha512-6SpIddvZlN4o76uNIF3v+p/5cQFrUQrBOGKpJeXooOW9/FZhAZ37gldwaTgDQCADXb2jtkHz0H6SHdwR8JjNvg==", + "dev": true, + "requires": {} + }, + "@blockly/dev-tools": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-2.2.1.tgz", + "integrity": "sha512-bfja9lWX/ItyvlLC2fjaO/AvsulVSzoNqMZ8SAF11UvmHNZGMB/ZxT+eRfpYWwLiDs1JfmtBBZsDLP6rb0eykQ==", + "dev": true, + "requires": { + "@blockly/block-test": "^1.0.13", + "chai": "^4.2.0", + "dat.gui": "^0.7.7", + "lodash.assign": "^4.2.0", + "lodash.merge": "^4.6.2", + "monaco-editor": "^0.20.0", + "sinon": "^9.0.2" + } + }, + "@blockly/theme-dark": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-1.0.5.tgz", + "integrity": "sha512-UcEH1XszAdlyNWWfdR9J2SrVS86aJP+6Z+7q9+VLqFUMf3Im0HKhVWUecmrra9dkm4W6sRBM2iPoVHiELKHIuw==" + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "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" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + } + } + }, + "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.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "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 + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "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" + } + }, + "blockly": { + "version": "5.20210325.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-5.20210325.1.tgz", + "integrity": "sha512-qrilYPovJeDfxKDWm1YBUCPVNElh/iyC1szaHTIPZHj9C9YPpSzZOeFyyrPBbYRudzbo8kjBOWMtHnN1bLjkoQ==", + "requires": { + "jsdom": "15.2.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "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.1", + "type-detect": "^4.0.5" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "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" + } + }, + "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=" + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "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" + } + }, + "dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==", + "dev": true + }, + "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" + } + }, + "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=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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" + } + }, + "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" + } + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "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==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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" + } + }, + "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" + } + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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-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.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "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" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "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=" + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "requires": { + "mime-db": "1.47.0" + } + }, + "monaco-editor": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz", + "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==", + "dev": true + }, + "nise": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "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==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "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.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "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" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "requires": { + "request-promise-core": "1.1.4", + "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" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "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" + } + }, + "sinon": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": 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" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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==" + }, + "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" + } + }, + "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-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 + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "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" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "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" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "ws": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "requires": {} + }, + "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==" + } + } +} diff --git a/static/js/package.json b/static/js/package.json new file mode 100644 index 0000000..922cd05 --- /dev/null +++ b/static/js/package.json @@ -0,0 +1,9 @@ +{ + "dependencies": { + "@blockly/theme-dark": "^1.0.5", + "blockly": "^5.20210325.1" + }, + "devDependencies": { + "@blockly/dev-tools": "^2.2.1" + } +} diff --git a/static/js/python_ML.js b/static/js/python_ML.js new file mode 100644 index 0000000..1d18b14 --- /dev/null +++ b/static/js/python_ML.js @@ -0,0 +1,2101 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ + +var VarData = {}; + + +(function (root, factory) { + if (typeof define === "function" && define.amd) { + // AMD + define(["./blockly_compressed.js"], factory); + } else if (typeof exports === "object") { + // Node.js + module.exports = factory(require("./blockly_compressed.js")); + } else { + // Browser + root.Blockly.Python = factory(root.Blockly); + } +})(this, function (Blockly) { + "use strict"; + Blockly.Python = new Blockly.Generator("Python"); + Blockly.Python.addReservedWords( + "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,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,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" + ); + Blockly.Python.VARDATA = []; + Blockly.Python.ORDER_ATOMIC = 0; + Blockly.Python.ORDER_COLLECTION = 1; + Blockly.Python.ORDER_STRING_CONVERSION = 1; + 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; + Blockly.Python.ORDER_LOGICAL_NOT = 12; + Blockly.Python.ORDER_LOGICAL_AND = 13; + Blockly.Python.ORDER_LOGICAL_OR = 14; + Blockly.Python.ORDER_CONDITIONAL = 15; + Blockly.Python.ORDER_LAMBDA = 16; + Blockly.Python.ORDER_NONE = 99; + Blockly.Python.ORDER_OVERRIDES = [ + [Blockly.Python.ORDER_FUNCTION_CALL, Blockly.Python.ORDER_MEMBER], + [Blockly.Python.ORDER_FUNCTION_CALL, Blockly.Python.ORDER_FUNCTION_CALL], + [Blockly.Python.ORDER_MEMBER, Blockly.Python.ORDER_MEMBER], + [Blockly.Python.ORDER_MEMBER, Blockly.Python.ORDER_FUNCTION_CALL], + [Blockly.Python.ORDER_LOGICAL_NOT, Blockly.Python.ORDER_LOGICAL_NOT], + [Blockly.Python.ORDER_LOGICAL_AND, Blockly.Python.ORDER_LOGICAL_AND], + [Blockly.Python.ORDER_LOGICAL_OR, Blockly.Python.ORDER_LOGICAL_OR], + ]; + Blockly.Python.isInitialized = !1; + Blockly.Python.init = function (a) { + Blockly.Python.PASS = this.INDENT + "pass\n"; + Blockly.Python.definitions_ = Object.create(null); + Blockly.Python.functionNames_ = Object.create(null); + Blockly.Python.variableDB_ ? Blockly.Python.variableDB_.reset() : (Blockly.Python.variableDB_ = new Blockly.Names(Blockly.Python.RESERVED_WORDS_)); + Blockly.Python.variableDB_.setVariableMap(a.getVariableMap()); + for (var b = [], c = Blockly.Variables.allDeveloperVariables(a), d = 0; d < c.length; d++) b.push(Blockly.Python.variableDB_.getName(c[d], Blockly.Names.DEVELOPER_VARIABLE_TYPE) + " = None"); + a = Blockly.Variables.allUsedVarModels(a); + + for (d = 0; d < a.length; d++) b.push(Blockly.Python.variableDB_.getName(a[d].getId(), Blockly.VARIABLE_CATEGORY_NAME) + " = None"); + Blockly.Python.definitions_.variables = b.join("\n"); + this.isInitialized = !0; + }; + Blockly.Python.finish = function (a) { + var b = [], + c = [], + d; + for (d in Blockly.Python.definitions_) { + var e = Blockly.Python.definitions_[d]; + e.match(/^(from\s+\S+\s+)?import\s+\S+/) ? b.push(e) : c.push(e); + } + delete Blockly.Python.definitions_; + delete Blockly.Python.functionNames_; + Blockly.Python.variableDB_.reset(); + return (b.join("\n") + "\n\n" + c.join("\n\n")).replace(/\n\n+/g, "\n\n").replace(/\n*$/, "\n\n\n") + a; + }; + Blockly.Python.scrubNakedValue = function (a) { + return a + "\n"; + }; + Blockly.Python.quote_ = function (a) { + a = a.replace(/\\/g, "\\\\").replace(/\n/g, "\\\n"); + var b = "'"; + -1 !== a.indexOf("'") && (-1 === a.indexOf('"') ? (b = '"') : (a = a.replace(/'/g, "\\'"))); + return b + a + b; + }; + Blockly.Python.multiline_quote_ = function (a) { + return a.split(/\n/g).map(Blockly.Python.quote_).join(" + '\\n' + \n"); + }; + Blockly.Python.scrub_ = function (a, b, c) { + var d = ""; + if (!a.outputConnection || !a.outputConnection.targetConnection) { + var e = a.getCommentText(); + e && ((e = Blockly.utils.string.wrap(e, Blockly.Python.COMMENT_WRAP - 3)), (d += Blockly.Python.prefixLines(e + "\n", "# "))); + for (var f = 0; f < a.inputList.length; f++) a.inputList[f].type == Blockly.INPUT_VALUE && (e = a.inputList[f].connection.targetBlock()) && (e = Blockly.Python.allNestedComments(e)) && (d += Blockly.Python.prefixLines(e, "# ")); + } + a = a.nextConnection && a.nextConnection.targetBlock(); + c = c ? "" : Blockly.Python.blockToCode(a); + return d + b + c; + }; + Blockly.Python.getAdjustedInt = function (a, b, c, d) { + c = c || 0; + a.workspace.options.oneBasedIndex && c--; + var e = a.workspace.options.oneBasedIndex ? "1" : "0"; + a = Blockly.Python.valueToCode(a, b, c ? Blockly.Python.ORDER_ADDITIVE : Blockly.Python.ORDER_NONE) || e; + Blockly.isNumber(a) ? ((a = parseInt(a, 10) + c), d && (a = -a)) : ((a = 0 < c ? "int(" + a + " + " + c + ")" : 0 > c ? "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 < a.itemCount_; c++) b[c] = Blockly.Python.valueToCode(a, "ADD" + c, Blockly.Python.ORDER_NONE) || "None"; + return ["[" + b.join(", ") + "]", Blockly.Python.ORDER_ATOMIC]; + }; + Blockly.Python.lists_repeat = function (a) { + var b = Blockly.Python.valueToCode(a, "ITEM", Blockly.Python.ORDER_NONE) || "None"; + a = Blockly.Python.valueToCode(a, "NUM", Blockly.Python.ORDER_MULTIPLICATIVE) || "0"; + return ["[" + b + "] * " + a, Blockly.Python.ORDER_MULTIPLICATIVE]; + }; + Blockly.Python.lists_length = function (a) { + return ["len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "[]") + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.lists_isEmpty = function (a) { + return ["not len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "[]") + ")", Blockly.Python.ORDER_LOGICAL_NOT]; + }; + Blockly.Python.lists_indexOf = function (a) { + var b = Blockly.Python.valueToCode(a, "FIND", Blockly.Python.ORDER_NONE) || "[]", + c = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "''"; + if (a.workspace.options.oneBasedIndex) + var d = " 0", + e = " + 1", + f = ""; + else (d = " -1"), (e = ""), (f = " - 1"); + if ("FIRST" == a.getFieldValue("END")) + return ( + (a = Blockly.Python.provideFunction_("first_index", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(my_list, elem):", " try: index = my_list.index(elem)" + e, " except: index =" + d, " return index"])), + [a + "(" + c + ", " + b + ")", Blockly.Python.ORDER_FUNCTION_CALL] + ); + a = Blockly.Python.provideFunction_("last_index", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(my_list, elem):", " try: index = len(my_list) - my_list[::-1].index(elem)" + f, " except: index =" + d, " return index"]); + return [a + "(" + c + ", " + b + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.lists_getIndex = function (a) { + var b = a.getFieldValue("MODE") || "GET", + c = a.getFieldValue("WHERE") || "FROM_START", + d = Blockly.Python.valueToCode(a, "VALUE", "RANDOM" == c ? Blockly.Python.ORDER_NONE : Blockly.Python.ORDER_MEMBER) || "[]"; + switch (c) { + case "FIRST": + if ("GET" == b) return [d + "[0]", Blockly.Python.ORDER_MEMBER]; + if ("GET_REMOVE" == b) return [d + ".pop(0)", Blockly.Python.ORDER_FUNCTION_CALL]; + if ("REMOVE" == b) return d + ".pop(0)\n"; + break; + case "LAST": + if ("GET" == b) return [d + "[-1]", Blockly.Python.ORDER_MEMBER]; + if ("GET_REMOVE" == b) return [d + ".pop()", Blockly.Python.ORDER_FUNCTION_CALL]; + if ("REMOVE" == b) return d + ".pop()\n"; + break; + case "FROM_START": + a = Blockly.Python.getAdjustedInt(a, "AT"); + if ("GET" == b) return [d + "[" + a + "]", Blockly.Python.ORDER_MEMBER]; + if ("GET_REMOVE" == b) return [d + ".pop(" + a + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + if ("REMOVE" == b) return d + ".pop(" + a + ")\n"; + break; + case "FROM_END": + a = Blockly.Python.getAdjustedInt(a, "AT", 1, !0); + if ("GET" == b) return [d + "[" + a + "]", Blockly.Python.ORDER_MEMBER]; + if ("GET_REMOVE" == b) return [d + ".pop(" + a + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + if ("REMOVE" == b) return d + ".pop(" + a + ")\n"; + break; + case "RANDOM": + Blockly.Python.definitions_.import_random = "import random"; + if ("GET" == b) return ["random.choice(" + d + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + d = Blockly.Python.provideFunction_("lists_remove_random_item", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(myList):", " x = int(random.random() * len(myList))", " return myList.pop(x)"]) + "(" + d + ")"; + if ("GET_REMOVE" == b) return [d, Blockly.Python.ORDER_FUNCTION_CALL]; + if ("REMOVE" == b) return d + "\n"; + } + throw Error("Unhandled combination (lists_getIndex)."); + }; + Blockly.Python.lists_setIndex = function (a) { + var b = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_MEMBER) || "[]", + c = a.getFieldValue("MODE") || "GET", + d = a.getFieldValue("WHERE") || "FROM_START", + e = Blockly.Python.valueToCode(a, "TO", Blockly.Python.ORDER_NONE) || "None"; + switch (d) { + case "FIRST": + if ("SET" == c) return b + "[0] = " + e + "\n"; + if ("INSERT" == c) return b + ".insert(0, " + e + ")\n"; + break; + case "LAST": + if ("SET" == c) return b + "[-1] = " + e + "\n"; + if ("INSERT" == c) return b + ".append(" + e + ")\n"; + break; + case "FROM_START": + a = Blockly.Python.getAdjustedInt(a, "AT"); + if ("SET" == c) return b + "[" + a + "] = " + e + "\n"; + if ("INSERT" == c) return b + ".insert(" + a + ", " + e + ")\n"; + break; + case "FROM_END": + a = Blockly.Python.getAdjustedInt(a, "AT", 1, !0); + if ("SET" == c) return b + "[" + a + "] = " + e + "\n"; + if ("INSERT" == c) return b + ".insert(" + a + ", " + e + ")\n"; + break; + case "RANDOM": + Blockly.Python.definitions_.import_random = "import random"; + b.match(/^\w+$/) ? (a = "") : ((a = Blockly.Python.variableDB_.getDistinctName("tmp_list", Blockly.VARIABLE_CATEGORY_NAME)), (d = a + " = " + b + "\n"), (b = a), (a = d)); + d = Blockly.Python.variableDB_.getDistinctName("tmp_x", Blockly.VARIABLE_CATEGORY_NAME); + a += d + " = int(random.random() * len(" + b + "))\n"; + if ("SET" == c) return a + (b + "[" + d + "] = " + e + "\n"); + if ("INSERT" == c) return a + (b + ".insert(" + d + ", " + e + ")\n"); + } + throw Error("Unhandled combination (lists_setIndex)."); + }; + Blockly.Python.lists_getSublist = function (a) { + var b = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_MEMBER) || "[]", + c = a.getFieldValue("WHERE1"), + d = a.getFieldValue("WHERE2"); + switch (c) { + case "FROM_START": + c = Blockly.Python.getAdjustedInt(a, "AT1"); + "0" == c && (c = ""); + break; + case "FROM_END": + c = Blockly.Python.getAdjustedInt(a, "AT1", 1, !0); + break; + case "FIRST": + c = ""; + break; + default: + throw Error("Unhandled option (lists_getSublist)"); + } + switch (d) { + case "FROM_START": + a = Blockly.Python.getAdjustedInt(a, "AT2", 1); + break; + case "FROM_END": + a = Blockly.Python.getAdjustedInt(a, "AT2", 0, !0); + Blockly.isNumber(String(a)) ? "0" == a && (a = "") : ((Blockly.Python.definitions_.import_sys = "import sys"), (a += " or sys.maxsize")); + break; + case "LAST": + a = ""; + break; + default: + throw Error("Unhandled option (lists_getSublist)"); + } + return [b + "[" + c + " : " + a + "]", Blockly.Python.ORDER_MEMBER]; + }; + Blockly.Python.lists_sort = function (a) { + var b = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_NONE) || "[]", + c = a.getFieldValue("TYPE"); + a = "1" === a.getFieldValue("DIRECTION") ? "False" : "True"; + return [ + 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)", + " return sorted(list_cpy, key=key_func, reverse=reverse)", + ]) + + "(" + + b + + ', "' + + c + + '", ' + + a + + ")", + Blockly.Python.ORDER_FUNCTION_CALL, + ]; + }; + Blockly.Python.lists_split = function (a) { + var b = a.getFieldValue("MODE"); + if ("SPLIT" == b) (b = Blockly.Python.valueToCode(a, "INPUT", Blockly.Python.ORDER_MEMBER) || "''"), (a = Blockly.Python.valueToCode(a, "DELIM", Blockly.Python.ORDER_NONE)), (a = b + ".split(" + a + ")"); + else if ("JOIN" == b) (b = Blockly.Python.valueToCode(a, "INPUT", Blockly.Python.ORDER_NONE) || "[]"), (a = Blockly.Python.valueToCode(a, "DELIM", Blockly.Python.ORDER_MEMBER) || "''"), (a = a + ".join(" + b + ")"); + else throw Error("Unknown mode: " + b); + return [a, Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.lists_reverse = function (a) { + return ["list(reversed(" + (Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_NONE) || "[]") + "))", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.logic = {}; + Blockly.Python.controls_if = function (a) { + var b = 0, + c = ""; + Blockly.Python.STATEMENT_PREFIX && (c += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, a)); + do { + var d = Blockly.Python.valueToCode(a, "IF" + b, Blockly.Python.ORDER_NONE) || "False"; + var e = Blockly.Python.statementToCode(a, "DO" + b) || Blockly.Python.PASS; + Blockly.Python.STATEMENT_SUFFIX && (e = Blockly.Python.prefixLines(Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, a), Blockly.Python.INDENT) + e); + c += (0 == b ? "if " : "elif ") + d + ":\n" + e; + ++b; + } while (a.getInput("IF" + b)); + if (a.getInput("ELSE") || Blockly.Python.STATEMENT_SUFFIX) + (e = Blockly.Python.statementToCode(a, "ELSE") || Blockly.Python.PASS), + Blockly.Python.STATEMENT_SUFFIX && (e = Blockly.Python.prefixLines(Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, a), Blockly.Python.INDENT) + e), + (c += "else:\n" + e); + return c; + }; + Blockly.Python.controls_ifelse = Blockly.Python.controls_if; + Blockly.Python.logic_compare = function (a) { + var b = { EQ: "==", NEQ: "!=", LT: "<", LTE: "<=", GT: ">", 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 n = "", + k = function () { + return Blockly.Python.provideFunction_("upRange", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start <= stop:", " yield start", " start += abs(step)"]); + }, + h = 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 (g, l, p) { + return "(" + g + " <= " + l + ") and " + k() + "(" + g + ", " + l + ", " + p + ") or " + h() + "(" + g + ", " + l + ", " + p + ")"; + }; + 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 = c < d ? k() : h()), (a += "(" + c + ", " + d + ", " + e + ")")); + else { + var m = function (g, l) { + Blockly.isNumber(g) ? (g = Number(g)) : g.match(/^\w+$/) ? (g = "float(" + g + ")") : ((l = Blockly.Python.variableDB_.getDistinctName(b + l, Blockly.VARIABLE_CATEGORY_NAME)), (n += l + " = float(" + g + ")\n"), (g = l)); + return g; + }; + c = m(c, "_start"); + d = m(d, "_end"); + e = m(e, "_inc"); + "number" == typeof c && "number" == typeof d ? ((a = c < d ? k() : h()), (a += "(" + c + ", " + d + ", " + e + ")")) : (a = a(c, d, e)); + } + return (n += "for " + b + " in " + a + ":\n" + f); + }; + Blockly.Python.controls_forEach = function (a) { + var b = Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"), Blockly.VARIABLE_CATEGORY_NAME), + c = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_RELATIONAL) || "[]", + d = Blockly.Python.statementToCode(a, "DO"); + d = Blockly.Python.addLoopTrap(d, a) || Blockly.Python.PASS; + return "for " + b + " in " + c + ":\n" + d; + }; + Blockly.Python.controls_flow_statements = function (a) { + var b = ""; + Blockly.Python.STATEMENT_PREFIX && (b += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, a)); + Blockly.Python.STATEMENT_SUFFIX && (b += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, a)); + if (Blockly.Python.STATEMENT_PREFIX) { + var c = Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(a); + c && !c.suppressPrefixSuffix && (b += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, c)); + } + switch (a.getFieldValue("FLOW")) { + case "BREAK": + return b + "break\n"; + case "CONTINUE": + return b + "continue\n"; + } + throw Error("Unknown flow statement."); + }; + /* + * Custom + */ + Blockly.Python.pandas = {}; + Blockly.Python['pandas_read_csv'] = function (a) { + Blockly.Python.definitions_.pandas = "import pandas as pd"; + return ['pd.read_csv(' + String(a).split(" ")[2] + ')', Blockly.Python.ORDER_FUNCTION_CALL] + } + + Blockly.Python["create_dict"] = function (a) { + + var b = 1, + c = "{"; + do { + var d = Blockly.Python.valueToCode(a, "KEY" + b, Blockly.Python.ORDER_NONE) || ""; + var e = Blockly.Python.valueToCode(a, "VAL" + b, Blockly.Python.ORDER_NONE) || ""; + Blockly.Python.STATEMENT_SUFFIX && (e = Blockly.Python.prefixLines(Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, a), Blockly.Python.INDENT) + e); + if (b > 1) { + c += ","; + } + c += d + ":" + e; + ++b; + } while (a.getInput("KEY" + b)); + c += "}"; + if ((e != "") && (d != "")) { + return [c, Blockly.Python.ORDER_FUNCTION_CALL]; + } else { + return ["None", Blockly.Python.ORDER_FUNCTION_CALL]; + } + } + Blockly.Python["dict_append"] = function (a) { + var e = "" + var b = Blockly.Python.valueToCode(a, "DICTIONARY", Blockly.Python.ORDER_NONE) || ""; + var c = Blockly.Python.valueToCode(a, "KEY", Blockly.Python.ORDER_NONE) || ""; + var d = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || ""; + if ((b != "") && (c != "") && (d != "")) { + e = b + "[" + c + "] = " + d; + } + return e; + } + + Blockly.Python['seaborn_dataset'] = function (a) { + Blockly.Python.definitions_.seaborn = "import seaborn as sns"; + VarData[a.inputList[0].fieldRow[1].value_] = 'sns.load_dataset("' + a.inputList[0].fieldRow[1].value_ + '")', Blockly.Python.ORDER_FUNCTION_CALL; + return ['sns.load_dataset("' + a.inputList[0].fieldRow[1].value_ + '")', Blockly.Python.ORDER_FUNCTION_CALL] + } + Blockly.Python['skl_train_test_split'] = function (a) { + Blockly.Python.definitions_.sklearn_test_train_split = "from sklearn.model_selection import train_test_split"; + var dataframe = Blockly.Python.valueToCode(a, "DATAFRAME", Blockly.Python.ORDER_NONE) || "" + var train_X = Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"), Blockly.VARIABLE_CATEGORY_NAME) + var train_Y = Blockly.Python.variableDB_.getName(a.getFieldValue("VAR2"), Blockly.VARIABLE_CATEGORY_NAME) + var test_X = Blockly.Python.variableDB_.getName(a.getFieldValue("VAR1"), Blockly.VARIABLE_CATEGORY_NAME) + var test_Y = Blockly.Python.variableDB_.getName(a.getFieldValue("VAR3"), Blockly.VARIABLE_CATEGORY_NAME) + var target = Blockly.Python.valueToCode(a, "TARGETVAR", Blockly.Python.ORDER_NONE) + var TestSize = Blockly.Python.valueToCode(a, "TESTSIZE", Blockly.Python.ORDER_NONE) + + var codeString = '\n' + train_X + ', ' + test_X + ', ' + train_Y + ', ' + test_Y + '=train_test_split(' + dataframe + '.drop(columns = [' + target + ']),' + dataframe + '[' + target + ']' + ', test_size=' + TestSize + ', random_state=42)\n' + var codeString2 = "" + if (a.getFieldValue("SPLIT") == "dropNa") { + codeString2 = 'def dropNa(' + train_X + ', ' + test_X + ', ' + train_Y + ', ' + test_Y + '):\n' + + ' ' + train_X + ' = ' + train_X + '.dropna()\n' + + ' ' + train_Y + " = " + train_Y + ".loc[" + train_X + ".index.values.tolist()]\n" + + ' ' + test_X + " = " + test_X + ".dropna()\n" + + ' ' + test_Y + " = " + test_Y + ".loc[" + test_X + ".index.values.tolist()]\n" + + ' return ' + train_X + ', ' + test_X + ', ' + train_Y + ', ' + test_Y + '\n' + + train_X + ', ' + test_X + ', ' + train_Y + ', ' + test_Y + " = " + "dropNa(" + train_X + ', ' + test_X + ', ' + train_Y + ', ' + test_Y + ")\n" + + } + + + Blockly.Python.definitions_.pandas = "import pandas as pd"; + Blockly.Python.definitions_.encoder = "from sklearn.preprocessing import LabelEncoder, OneHotEncoder"; + Blockly.Python.definitions_.numpy = "import numpy as np" + + if (dataframe == "") { + return "" + } + else { + return codeString + codeString2 + } + } + + + Blockly.Python['pandas_drop_columns'] = function (a) { + var columns = Blockly.Python.valueToCode(a, "COLUMN", Blockly.Python.ORDER_UNARY_SIGN) + if (columns == "") { + return "" + } + var DataFrame = Blockly.Python.valueToCode(a, "DATAFRAME", Blockly.Python.ORDER_UNARY_SIGN) + if (a.getInputTargetBlock("COLUMN").outputConnection.getCheck() == "String") { + return [DataFrame + ".drop([" + columns + "], axis = 1)", Blockly.Python.ORDER_ATOMIC]; + } if (a.getInputTargetBlock("COLUMN").outputConnection.getCheck() == "Array") { + return [DataFrame + ".drop([" + columns + "], axis = 1)", Blockly.Python.ORDER_ATOMIC]; + } if (columns == "" || DataFrame == "") { + return ["", Blockly.Python.ORDER_ATOMIC]; + } + } + + Blockly.Python['pandas_sample'] = function (a) { + var factor = Blockly.Python.valueToCode(a, "FACTOR", Blockly.Python.ORDER_UNARY_SIGN) + if (factor == "") { + return "" + } + var DataFrame = Blockly.Python.valueToCode(a, "DATAFRAME", Blockly.Python.ORDER_UNARY_SIGN) + if (factor != "" || DataFrame != "") { + return [DataFrame + ".sample(frac=" + factor + ", replace=True, random_state=123)", Blockly.Python.ORDER_ATOMIC]; + } + } + + + Blockly.Python['pandas_select_columns'] = function (a) { + var columns = Blockly.Python.valueToCode(a, "COLUMN", Blockly.Python.ORDER_UNARY_SIGN) + if (columns == "") { + columns = "[]" + } + var DataFrame = Blockly.Python.valueToCode(a, "DATAFRAME", Blockly.Python.ORDER_UNARY_SIGN) + return [DataFrame + "[" + columns + "]", Blockly.Python.ORDER_ATOMIC]; + } + + Blockly.Python['Classification_Report'] = function (a) { + Blockly.Python.definitions_.classification_report = "from sklearn.metrics import classification_report"; + var Pred = Blockly.Python.valueToCode(a, "Pred", Blockly.Python.ORDER_UNARY_SIGN) || ""; + var True = Blockly.Python.valueToCode(a, "True", Blockly.Python.ORDER_UNARY_SIGN) || ""; + if ((Pred != "") && (True != "")) { + return ["classification_report(" + True + ", " + Pred + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + } else { + return ["", Blockly.Python.ORDER_FUNCTION_CALL]; + } + + } + Blockly.Python['R2_Report'] = function (a) { + Blockly.Python.definitions_.r2_score = "from sklearn.metrics import r2_score"; + var Pred = Blockly.Python.valueToCode(a, "Pred", Blockly.Python.ORDER_UNARY_SIGN) + var True = Blockly.Python.valueToCode(a, "True", Blockly.Python.ORDER_UNARY_SIGN) + if ((Pred != "") && (True != "")) { + return ["r2_score(" + True + ", " + Pred + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + } else { + return ["", Blockly.Python.ORDER_FUNCTION_CALL]; + } + } + Blockly.Python['Print'] = function (a) { + var INPUT = Blockly.Python.valueToCode(a, "INPUT", Blockly.Python.ORDER_FUNCTION_CALL) || "''"; + var End = a.getFieldValue("END") + + if (End == "newLine") { + return "print(" + INPUT + ")" + "\n"; + } + if (End == "tab") { + return "print(" + INPUT + ",end='\\t')" + "\n"; + } + if (End == "space") { + return "print(" + INPUT + ",end=' ')" + "\n"; + } + if (End == "comma") { + return "print(" + INPUT + ",end=',')" + "\n"; + } + } + + Blockly.Python['pycaret_setup'] = function (a) { + var input_data = Blockly.Python.valueToCode(a, "input_data", Blockly.Python.ORDER_NONE) || ""; + var input_column = Blockly.Python.valueToCode(a, "input_column", Blockly.Python.ORDER_NONE) || ""; + var algorithm = a.getFieldValue("algorithm"); + + if (input_data == "") { + return "" + } + if (algorithm == "Classification") { + Blockly.Python.definitions_.pycaret_classification = "from pycaret.classification import *"; + } + if (algorithm == "Regression") { + Blockly.Python.definitions_.pycaret_regression = "from pycaret.regression import *"; + } + return "setup(" + input_data + ", target = " + input_column + ")" + "\n"; + + + } + Blockly.Python['pycaret_predict'] = function (a) { + var input_model = Blockly.Python.valueToCode(a, "input_model", Blockly.Python.ORDER_NONE) || ""; + var input_data = Blockly.Python.valueToCode(a, "input_data", Blockly.Python.ORDER_NONE) || ""; + console.log(input_model) + if (input_model == "") { + return ["", Blockly.Python.ORDER_FUNCTION_CALL] + } + if (input_model != "" && input_data == "") { + return ["predict_model(" + input_model + ")", Blockly.Python.ORDER_FUNCTION_CALL] + } + if (input_model != "" && input_data != "") { + return ["predict_model(" + input_model + ", data=" + input_data + ")", Blockly.Python.ORDER_FUNCTION_CALL] + } + } + Blockly.Python['pycaret_save'] = function (a) { + + var input_model = Blockly.Python.valueToCode(a, "input_model", Blockly.Python.ORDER_NONE) || ""; + var input_data = Blockly.Python.valueToCode(a, "input_data", Blockly.Python.ORDER_NONE) || ""; + if (input_model != "" || input_data != "") { + return "save_model(" + input_model + "," + input_data + ")" + "\n"; + } + else { + return "" + } + } + + Blockly.Python['pycaret_plot_model'] = function (a) { + + var input_model = Blockly.Python.valueToCode(a, "input_model", Blockly.Python.ORDER_NONE) || ""; + var plot_data = a.getFieldValue("plot_data"); + if (input_model != "" || plot_data != "") { + return "plot_model(" + input_model + ", plot = '" + plot_data + "')" + "\n"; + } + else { + return "" + } + } + + Blockly.Python['pycaret_blend_model'] = function (a) { + var input_models = Blockly.Python.valueToCode(a, "input_models", Blockly.Python.ORDER_NONE) || ""; + var input_fold = Blockly.Python.valueToCode(a, "input_fold", Blockly.Python.ORDER_NONE) || ""; + var input_method = a.getFieldValue("input_method"); + if (input_models != "" && input_fold == "") { + return ["blend_models(" + input_models + ", method = '" + input_method + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + if (input_models != "" && input_fold != "") { + return ["blend_models(" + input_models + " , fold = '" + input_fold + "' , method = '" + input_method + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + else { + return "" + } + } + + Blockly.Python['pycaret_ensemble_model'] = function (a) { + var input_models = Blockly.Python.valueToCode(a, "input_models", Blockly.Python.ORDER_NONE) || ""; + var input_fold = Blockly.Python.valueToCode(a, "input_fold", Blockly.Python.ORDER_NONE) || ""; + var input_method = a.getFieldValue("input_method"); + if (input_models != "" && input_fold == "") { + return ["ensemble_model(" + input_models + ", method = '" + input_method + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + if (input_models != "" && input_fold != "") { + return ["ensemble_model(" + input_models + " , fold = '" + input_fold + "' , method = '" + input_method + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + else { + return "" + } + } + Blockly.Python['pycaret_load'] = function (a) { + var input_model = Blockly.Python.valueToCode(a, "input_data", Blockly.Python.ORDER_NONE) || ""; + if (input_model != "") { + return ["load_model(" + input_model + ")", Blockly.Python.ORDER_FUNCTION_CALL] + + } + else { + return "" + } + } + Blockly.Python['pycaret_automl'] = function (a) { + var optimizer = a.getFieldValue("optimizer"); + return ["automl(optimize = '" + optimizer + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + Blockly.Python['pycaret_classifier'] = function (a) { + var model = a.getFieldValue("model"); + return ["create_model('" + model + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + Blockly.Python['pycaret_regressor'] = function (a) { + var model = a.getFieldValue("model"); + return ["create_model('" + model + "')", Blockly.Python.ORDER_FUNCTION_CALL] + } + Blockly.Python['Input'] = function (a) { + var INPUT = Blockly.Python.valueToCode(a, "INPUT", Blockly.Python.ORDER_NONE) || "''"; + return ["input(" + INPUT + ")", Blockly.Python.ORDER_FUNCTION_CALL] + } + Blockly.Python['pandas_set_columns'] = function (a) { + var columns = Blockly.Python.valueToCode(a, "COLUMN", Blockly.Python.ORDER_UNARY_SIGN) + if (columns == "") { + columns = "[]" + } + var DATAFRAME_IN = Blockly.Python.valueToCode(a, "DATAFRAME_IN", Blockly.Python.ORDER_UNARY_SIGN) + var DATAFRAME_OUT = Blockly.Python.valueToCode(a, "DATAFRAME_OUT", Blockly.Python.ORDER_UNARY_SIGN) + if (DATAFRAME_IN != "" || DATAFRAME_OUT != "" || columns != "") { + return DATAFRAME_OUT + "[" + columns + "]=" + DATAFRAME_IN + "\n"; + } + else { + return "" + } + } + + + + + Blockly.Python['dataframe_Filter'] = function (a) { + var b = { EQ: "==", NEQ: "!=", LT: "<", LTE: "<=", GT: ">", GTE: ">=" }[a.getFieldValue("OP")]; + var c = Blockly.Python.ORDER_RELATIONAL; + var d = Blockly.Python.valueToCode(a, "A", c) || ""; + var e = Blockly.Python.valueToCode(a, "C", c) || ""; + a = Blockly.Python.valueToCode(a, "B", c) || ""; + if (d == "" || e == "" || a == "") { + return ["", Blockly.Python.ORDER_NONE] + } + + return [e + "[" + d + " " + b + " " + a + "]", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + + + Blockly.Python['dataframe_Map'] = function (a) { + var c = Blockly.Python.ORDER_NONE; + var b = Blockly.Python.valueToCode(a, "Map", c) || ""; + var d = Blockly.Python.valueToCode(a, "Series", c) || ""; + if (b == "" || d == "") { + return ["", Blockly.Python.ORDER_NONE] + } + + return [d + ".map(" + b + ")", Blockly.Python.ORDER_ATOMIC]; + }; + + + Blockly.Python['CLR_XGBoost'] = function (a) { + Blockly.Python.definitions_.XGBClassifier = "from xgboost import XGBClassifier"; + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += "XGBClassifier(**" + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + ")" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += "XGBClassifier()" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + + ", eval_set = [(" + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return ([codeString, Blockly.Python.ORDER_FUNCTION_CALL]) + + } + + Blockly.Python['REG_LinearRegression'] = function (a) { + Blockly.Python.definitions_.LinearRegression = "from sklearn.linear_model import LinearRegression"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("REG_LinearRegression", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + var codeString = "" + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += "Pipeline([('encoding', HandleCatagoricalData('labelEncoding')), ('scaler', StandardScaler()), ('LR', LinearRegression(**" + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + "))])" + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("LR", LinearRegression())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + + ", eval_set = [(" + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return ([codeString, Blockly.Python.ORDER_FUNCTION_CALL]) + + } + + Blockly.Python['REG_XGBRegressor'] = function (a) { + Blockly.Python.definitions_.XGBRegressor = "from xgboost import XGBRegressor"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("REG_XGBRegressor", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + + var codeString = "" + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += "Pipeline([('encoding', HandleCatagoricalData('labelEncoding')), ('scaler', StandardScaler()), ('XGB', XGBRegressor(**" + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + "))])" + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("XGB", XGBRegressor())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + + ", eval_set = [(" + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return ([codeString, Blockly.Python.ORDER_FUNCTION_CALL]) + + } + Blockly.Python['CLR_LogisticRegression'] = function (a) { + Blockly.Python.definitions_.LogisticRegression = "from sklearn.linear_model import LogisticRegression"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("CLR_LogisticRegression", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("LR",LogisticRegression(**' + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + '))])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("LR", LogisticRegression())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ") # Eval TBD" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return ([codeString, Blockly.Python.ORDER_FUNCTION_CALL]) + + } + + + Blockly.Python['CLR_NaiveBayes'] = function (a) { + Blockly.Python.definitions_.GaussianNB = "from sklearn.naive_bayes import GaussianNB"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("CLR_NaiveBayes", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("GNB",GaussianNB())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("GNB",GaussianNB(**' + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + "))])" + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ") # Eval TBD" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return [codeString, Blockly.Python.ORDER_FUNCTION_CALL] + + } + Blockly.Python['CLR_KNN'] = function (a) { + Blockly.Python.definitions_.KNeighborsClassifier = "from sklearn.neighbors import KNeighborsClassifier"; + + + var HandleCatagoricalData = Blockly.Python.provideFunction_("CLR_KNN", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("KNN",KNeighborsClassifier())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("KNN",KNeighborsClassifier(**' + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + "))])" + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ") # Eval TBD" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return [codeString, Blockly.Python.ORDER_FUNCTION_CALL] + + } + Blockly.Python['CLR_DecisionTree'] = function (a) { + Blockly.Python.definitions_.tree = "from sklearn import tree"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("CLR_DecisionTree", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("Dtree",tree.DecisionTreeClassifier(**' + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + "))])" + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("Dtree",tree.DecisionTreeClassifier())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ") # Eval TBD" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return [codeString, Blockly.Python.ORDER_FUNCTION_CALL] + + } + Blockly.Python['CLR_SVM'] = function (a) { + Blockly.Python.definitions_.SVC = "from sklearn.svm import SVC"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("CLR_SVM", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("SVC", SVC(gamma="auto"))])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("SVC", SVC(gamma="auto"))])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ") # Eval TBD" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + return [codeString, Blockly.Python.ORDER_FUNCTION_CALL] + + } + + Blockly.Python['CLR_RandomForest'] = function (a) { + Blockly.Python.definitions_.RandomForestClassifier = "from sklearn.ensemble import RandomForestClassifier"; + + var HandleCatagoricalData = Blockly.Python.provideFunction_("CLR_RandomForest", [ + 'class HandleCatagoricalData():\n' + + ' def __init__(self,method="labelEncoding",factor=0):\n' + + ' self.method = method\n' + + ' self.factor = factor\n' + + ' def fit(self, X, y):\n' + + ' if self.method == "labelEncoding":\n' + + ' X = pd.DataFrame(data=X)\n' + + ' y = pd.DataFrame(data=y)\n' + + ' self.LE = LabelEncoder()\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' y = y.to_numpy()\n' + + ' return self\n' + + ' def transform(self, X):\n' + + ' X = pd.DataFrame(data=X)\n' + + ' for column in X:\n' + + ' if X[column].dtype == np.object:\n' + + ' X[column]=X[column].astype("category")\n' + + ' if X[column].dtype.name == "category":\n' + + ' X[column] = self.LE.fit_transform(X[column])\n' + + ' X = X.to_numpy()\n' + + ' return X\n' + ]) + + var codeString = "" + + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("RFC", RandomForestClassifier())])' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += 'Pipeline([("encoding", HandleCatagoricalData("labelEncoding")), ("scaler", StandardScaler()), ("RFC", RandomForestClassifier(**' + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) + ')' + Blockly.Python.definitions_.pipeline = "from sklearn.pipeline import Pipeline" + Blockly.Python.definitions_.StandardScaler = "from sklearn.preprocessing import StandardScaler" + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ")" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) != "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + ".fit(" + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) + + "," + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) + ") # Eval TBD" + + + } + if (Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) != "" && + Blockly.Python.valueToCode(a, "PARAMS", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YTRAIN", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "XVALID", Blockly.Python.ORDER_NONE) == "" && + Blockly.Python.valueToCode(a, "YVALID", Blockly.Python.ORDER_NONE) == "") { + codeString += Blockly.Python.valueToCode(a, "TMODEL", Blockly.Python.ORDER_NONE) + + ".predict(" + + Blockly.Python.valueToCode(a, "XTEST", Blockly.Python.ORDER_NONE) + ")" + + + } + + + + return [codeString, Blockly.Python.ORDER_FUNCTION_CALL] + + } + + Blockly.Python.math = {}; + Blockly.Python.addReservedWords("math,random,Number"); + Blockly.Python.math_number = function (a) { + a = Number(a.getFieldValue("NUM")); + + if (Infinity == a) { + a = 'float("inf")'; + var b = Blockly.Python.ORDER_FUNCTION_CALL; + } else -Infinity == a ? ((a = '-float("inf")'), (b = Blockly.Python.ORDER_UNARY_SIGN)) : (b = 0 > a ? 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.getVars().indexOf(c) && b.push(Blockly.Python.variableDB_.getName(c, Blockly.VARIABLE_CATEGORY_NAME)); + e = Blockly.Variables.allDeveloperVariables(d); + for (f = 0; f < e.length; f++) b.push(Blockly.Python.variableDB_.getName(e[f], Blockly.Names.DEVELOPER_VARIABLE_TYPE)); + b = b.length ? Blockly.Python.INDENT + "global " + b.join(", ") + "\n" : ""; + d = Blockly.Python.variableDB_.getName(a.getFieldValue("NAME"), Blockly.PROCEDURE_CATEGORY_NAME); + c = ""; + Blockly.Python.STATEMENT_PREFIX && (c += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, a)); + Blockly.Python.STATEMENT_SUFFIX && (c += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, a)); + c && (c = Blockly.Python.prefixLines(c, Blockly.Python.INDENT)); + var n = ""; + Blockly.Python.INFINITE_LOOP_TRAP && (n = Blockly.Python.prefixLines(Blockly.Python.injectId(Blockly.Python.INFINITE_LOOP_TRAP, a), Blockly.Python.INDENT)); + var k = Blockly.Python.statementToCode(a, "STACK"), + h = Blockly.Python.valueToCode(a, "RETURN", Blockly.Python.ORDER_NONE) || "", + m = ""; + k && h && (m = c); + h ? (h = Blockly.Python.INDENT + "return " + h + "\n") : k || (k = Blockly.Python.PASS); + var g = []; + e = a.getVars(); + for (f = 0; f < e.length; f++) g[f] = Blockly.Python.variableDB_.getName(e[f], Blockly.VARIABLE_CATEGORY_NAME); + b = "def " + d + "(" + g.join(", ") + "):\n" + b + c + n + k + m + h; + b = Blockly.Python.scrub_(a, b); + Blockly.Python.definitions_["%" + d] = b; + return null; + }; + Blockly.Python.procedures_defnoreturn = Blockly.Python.procedures_defreturn; + Blockly.Python.procedures_callreturn = function (a) { + for (var b = Blockly.Python.variableDB_.getName(a.getFieldValue("NAME"), Blockly.PROCEDURE_CATEGORY_NAME), c = [], d = a.getVars(), e = 0; e < d.length; e++) + c[e] = Blockly.Python.valueToCode(a, "ARG" + e, Blockly.Python.ORDER_NONE) || "None"; + return [b + "(" + c.join(", ") + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.procedures_callnoreturn = function (a) { + return Blockly.Python.procedures_callreturn(a)[0] + "\n"; + }; + Blockly.Python.procedures_ifreturn = function (a) { + var b = "if " + (Blockly.Python.valueToCode(a, "CONDITION", Blockly.Python.ORDER_NONE) || "False") + ":\n"; + Blockly.Python.STATEMENT_SUFFIX && (b += Blockly.Python.prefixLines(Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, a), Blockly.Python.INDENT)); + a.hasReturnValue_ ? ((a = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "None"), (b += Blockly.Python.INDENT + "return " + a + "\n")) : (b += Blockly.Python.INDENT + "return\n"); + return b; + }; + Blockly.Python.texts = {}; + Blockly.Python.text = function (a) { + return [Blockly.Python.quote_(a.getFieldValue("TEXT")), Blockly.Python.ORDER_ATOMIC]; + }; + Blockly.Python.text_multiline = function (a) { + a = Blockly.Python.multiline_quote_(a.getFieldValue("TEXT")); + var b = -1 != a.indexOf("+") ? Blockly.Python.ORDER_ADDITIVE : Blockly.Python.ORDER_ATOMIC; + return [a, b]; + }; + Blockly.Python.text.forceString_ = function (a) { + return Blockly.Python.text.forceString_.strRegExp.test(a) ? [a, Blockly.Python.ORDER_ATOMIC] : ["str(" + a + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text.forceString_.strRegExp = /^\s*'([^']|\\')*'\s*$/; + Blockly.Python.text_join = function (a) { + switch (a.itemCount_) { + case 0: + return ["''", Blockly.Python.ORDER_ATOMIC]; + case 1: + return (a = Blockly.Python.valueToCode(a, "ADD0", Blockly.Python.ORDER_NONE) || "''"), Blockly.Python.text.forceString_(a); + case 2: + var b = Blockly.Python.valueToCode(a, "ADD0", Blockly.Python.ORDER_NONE) || "''"; + a = Blockly.Python.valueToCode(a, "ADD1", Blockly.Python.ORDER_NONE) || "''"; + a = Blockly.Python.text.forceString_(b)[0] + " + " + Blockly.Python.text.forceString_(a)[0]; + return [a, Blockly.Python.ORDER_ADDITIVE]; + default: + b = []; + for (var c = 0; c < a.itemCount_; c++) b[c] = Blockly.Python.valueToCode(a, "ADD" + c, Blockly.Python.ORDER_NONE) || "''"; + a = Blockly.Python.variableDB_.getDistinctName("x", Blockly.VARIABLE_CATEGORY_NAME); + a = "''.join([str(" + a + ") for " + a + " in [" + b.join(", ") + "]])"; + return [a, Blockly.Python.ORDER_FUNCTION_CALL]; + } + }; + Blockly.Python.text_append = function (a) { + var b = Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"), Blockly.VARIABLE_CATEGORY_NAME); + a = Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_NONE) || "''"; + return b + " = str(" + b + ") + " + Blockly.Python.text.forceString_(a)[0] + "\n"; + }; + Blockly.Python.text_length = function (a) { + return ["len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "''") + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text_isEmpty = function (a) { + return ["not len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "''") + ")", Blockly.Python.ORDER_LOGICAL_NOT]; + }; + Blockly.Python.text_isEmpty2 = function (a) { + return ["not len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "''") + ")x", Blockly.Python.ORDER_LOGICAL_NOT]; + }; + Blockly.Python.text_indexOf = function (a) { + var b = "FIRST" == a.getFieldValue("END") ? "find" : "rfind", + c = Blockly.Python.valueToCode(a, "FIND", Blockly.Python.ORDER_NONE) || "''"; + b = (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_MEMBER) || "''") + "." + b + "(" + c + ")"; + return a.workspace.options.oneBasedIndex ? [b + " + 1", Blockly.Python.ORDER_ADDITIVE] : [b, Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text_charAt = function (a) { + var b = a.getFieldValue("WHERE") || "FROM_START", + c = Blockly.Python.valueToCode(a, "VALUE", "RANDOM" == b ? Blockly.Python.ORDER_NONE : Blockly.Python.ORDER_MEMBER) || "''"; + switch (b) { + case "FIRST": + return [c + "[0]", Blockly.Python.ORDER_MEMBER]; + case "LAST": + return [c + "[-1]", Blockly.Python.ORDER_MEMBER]; + case "FROM_START": + return (a = Blockly.Python.getAdjustedInt(a, "AT")), [c + "[" + a + "]", Blockly.Python.ORDER_MEMBER]; + case "FROM_END": + return (a = Blockly.Python.getAdjustedInt(a, "AT", 1, !0)), [c + "[" + a + "]", Blockly.Python.ORDER_MEMBER]; + case "RANDOM": + return ( + (Blockly.Python.definitions_.import_random = "import random"), + [ + Blockly.Python.provideFunction_("text_random_letter", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(text):", " x = int(random.random() * len(text))", " return text[x];"]) + "(" + c + ")", + Blockly.Python.ORDER_FUNCTION_CALL, + ] + ); + } + throw Error("Unhandled option (text_charAt)."); + }; + Blockly.Python.text_getSubstring = function (a) { + var b = a.getFieldValue("WHERE1"), + c = a.getFieldValue("WHERE2"), + d = Blockly.Python.valueToCode(a, "STRING", Blockly.Python.ORDER_MEMBER) || "''"; + switch (b) { + case "FROM_START": + b = Blockly.Python.getAdjustedInt(a, "AT1"); + "0" == b && (b = ""); + break; + case "FROM_END": + b = Blockly.Python.getAdjustedInt(a, "AT1", 1, !0); + break; + case "FIRST": + b = ""; + break; + default: + throw Error("Unhandled option (text_getSubstring)"); + } + switch (c) { + case "FROM_START": + a = Blockly.Python.getAdjustedInt(a, "AT2", 1); + break; + case "FROM_END": + a = Blockly.Python.getAdjustedInt(a, "AT2", 0, !0); + Blockly.isNumber(String(a)) ? "0" == a && (a = "") : ((Blockly.Python.definitions_.import_sys = "import sys"), (a += " or sys.maxsize")); + break; + case "LAST": + a = ""; + break; + default: + throw Error("Unhandled option (text_getSubstring)"); + } + return [d + "[" + b + " : " + a + "]", Blockly.Python.ORDER_MEMBER]; + }; + Blockly.Python.text_changeCase = function (a) { + var b = { UPPERCASE: ".upper()", LOWERCASE: ".lower()", TITLECASE: ".title()" }[a.getFieldValue("CASE")]; + return [(Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_MEMBER) || "''") + b, Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text_trim = function (a) { + var b = { LEFT: ".lstrip()", RIGHT: ".rstrip()", BOTH: ".strip()" }[a.getFieldValue("MODE")]; + return [(Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_MEMBER) || "''") + b, Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text_print = function (a) { + return "print(" + (Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_NONE) || "''") + ")\n"; + }; + Blockly.Python.text_prompt_ext = function (a) { + var b = Blockly.Python.provideFunction_("text_prompt", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(msg):", " try:", " return raw_input(msg)", " except NameError:", " return input(msg)"]), + c = a.getField("TEXT") ? Blockly.Python.quote_(a.getFieldValue("TEXT")) : Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_NONE) || "''"; + b = b + "(" + c + ")"; + "NUMBER" == a.getFieldValue("TYPE") && (b = "float(" + b + ")"); + return [b, Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text_prompt = Blockly.Python.text_prompt_ext; + Blockly.Python.text_count = function (a) { + var b = Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_MEMBER) || "''"; + a = Blockly.Python.valueToCode(a, "SUB", Blockly.Python.ORDER_NONE) || "''"; + return [b + ".count(" + a + ")", Blockly.Python.ORDER_FUNCTION_CALL]; + }; + Blockly.Python.text_replace = function (a) { + var b = Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_MEMBER) || "''", + c = Blockly.Python.valueToCode(a, "FROM", Blockly.Python.ORDER_NONE) || "''"; + a = Blockly.Python.valueToCode(a, "TO", Blockly.Python.ORDER_NONE) || "''"; + return [b + ".replace(" + c + ", " + a + ")", Blockly.Python.ORDER_MEMBER]; + }; + Blockly.Python.text_reverse = function (a) { + return [(Blockly.Python.valueToCode(a, "TEXT", Blockly.Python.ORDER_MEMBER) || "''") + "[::-1]", Blockly.Python.ORDER_MEMBER]; + }; + Blockly.Python.variables = {}; + Blockly.Python.variables_get = function (a) { + return [Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"), Blockly.VARIABLE_CATEGORY_NAME), Blockly.Python.ORDER_ATOMIC]; + }; + + Blockly.Python.variables_set = function (a) { + + var b = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "0"; + if (a.getInputTargetBlock() != null){ + + if (a.getInputTargetBlock("VALUE").outputConnection.getCheck() == "DataFrame") { + VarData[Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"), Blockly.VARIABLE_CATEGORY_NAME)] = b; + } + + } + return Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"), Blockly.VARIABLE_CATEGORY_NAME) + " = " + b + "\n"; + }; + Blockly.Python.variablesDynamic = {}; + Blockly.Python.variables_get_dynamic = Blockly.Python.variables_get; + Blockly.Python.variables_set_dynamic = Blockly.Python.variables_set; + return Blockly.Python; + +}); \ No newline at end of file diff --git a/static/js/python_compressed.js b/static/js/python_compressed.js new file mode 100644 index 0000000..dd9e02d --- /dev/null +++ b/static/js/python_compressed.js @@ -0,0 +1,101 @@ +// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(['./blockly_compressed.js'], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(require('./blockly_compressed.js')); + } else { // Browser + root.Blockly.Python = factory(root.Blockly); + } +}(this, function(Blockly) { + 'use strict';Blockly.Python=new Blockly.Generator("Python");Blockly.Python.addReservedWords("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,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,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"); +Blockly.Python.ORDER_ATOMIC=0;Blockly.Python.ORDER_COLLECTION=1;Blockly.Python.ORDER_STRING_CONVERSION=1;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;Blockly.Python.ORDER_LOGICAL_NOT=12;Blockly.Python.ORDER_LOGICAL_AND=13;Blockly.Python.ORDER_LOGICAL_OR=14;Blockly.Python.ORDER_CONDITIONAL=15;Blockly.Python.ORDER_LAMBDA=16;Blockly.Python.ORDER_NONE=99; +Blockly.Python.ORDER_OVERRIDES=[[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_LOGICAL_NOT,Blockly.Python.ORDER_LOGICAL_NOT],[Blockly.Python.ORDER_LOGICAL_AND,Blockly.Python.ORDER_LOGICAL_AND],[Blockly.Python.ORDER_LOGICAL_OR,Blockly.Python.ORDER_LOGICAL_OR]]; +Blockly.Python.isInitialized=!1; +Blockly.Python.init=function(a){Blockly.Python.PASS=this.INDENT+"pass\n";Blockly.Python.definitions_=Object.create(null);Blockly.Python.functionNames_=Object.create(null);Blockly.Python.variableDB_?Blockly.Python.variableDB_.reset():Blockly.Python.variableDB_=new Blockly.Names(Blockly.Python.RESERVED_WORDS_);Blockly.Python.variableDB_.setVariableMap(a.getVariableMap());for(var b=[],c=Blockly.Variables.allDeveloperVariables(a),d=0;dc?"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 n="",k=function(){return Blockly.Python.provideFunction_("upRange", +["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start <= stop:"," yield start"," start += abs(step)"])},h=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(g,l,p){return"("+g+" <= "+l+") and "+k()+"("+g+", "+l+", "+p+") or "+h()+"("+g+", "+l+", "+p+")"};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.getVars().indexOf(c)&&b.push(Blockly.Python.variableDB_.getName(c,Blockly.VARIABLE_CATEGORY_NAME));e=Blockly.Variables.allDeveloperVariables(d);for(f=0;f} srcs + */ +function maybeAddClosureLibrary(srcs) { + if (argv.closureLibrary) { + // If you require Google's 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; +} + +/** + * A helper method to return an closure compiler output wrapper that wraps the + * body in a Universal Module Definition. + * @param {string} namespace The export namespace. + * @param {Array.} dependencies An array of dependencies to inject. + */ +function outputWrapperUMD(namespace, dependencies) { + const amdDeps = dependencies.map(d => '\'' + d.amd + '\'' ).join(', '); + const cjsDeps = dependencies.map(d => `require('${d.cjs}')`).join(', '); + const browserDeps = dependencies.map(d => 'root.' + d.name).join(', '); + const imports = dependencies.map(d => d.name).join(', '); + return `// Do not edit this file; automatically generated by gulp. + +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define([${amdDeps}], factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(${cjsDeps}); + } else { // Browser + root.${namespace} = factory(${browserDeps}); + } +}(this, function(${imports}) { + %output% +return ${namespace}; +})); +`; +}; + +/** + * This task builds Blockly's core files. + * blockly_compressed.js + */ +function buildCompressed() { + const defines = 'Blockly.VERSION="' + packageJson.version + '"'; + return gulp.src(maybeAddClosureLibrary(['core/**/**/*.js']), {base: './'}) + .pipe(stripApacheLicense()) + .pipe(gulp.sourcemaps.init()) + // 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.replace(/\\/, '\\\\'), "g"), "-"); + p.dirname = ""; + p.basename = dirname + "-" + p.basename; + })) + .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', + output_wrapper: outputWrapperUMD('Blockly', []) + }, argv.verbose, argv.debug, argv.strict)) + .pipe(gulp.sourcemaps.mapSources(function (sourcePath, file) { + return sourcePath.replace(/-/g, '/'); + })) + .pipe(gulp.sourcemaps.write('.', { + includeContent: false, + sourceRoot: './' + })) + .pipe(gulp.dest('./')); +}; + +/** + * This task builds the Blockly's built in blocks. + * blocks_compressed.js + */ +function buildBlocks() { + return gulp.src(['blocks/*.js'], {base: './'}) + .pipe(stripApacheLicense()) + .pipe(gulp.sourcemaps.init()) + .pipe(compile({ + dependency_mode: 'NONE', + externs: ['./externs/goog-externs.js', './externs/block-externs.js'], + js_output_file: 'blocks_compressed.js', + output_wrapper: outputWrapperUMD('Blockly.Blocks', [{ + name: 'Blockly', + amd: './blockly_compressed.js', + cjs: './blockly_compressed.js' + }]) + }, argv.verbose, argv.debug, argv.strict)) + .pipe(gulp.sourcemaps.write('.', { + includeContent: false, + sourceRoot: './' + })) + .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) { + return gulp.src([`generators/${language}.js`, `generators/${language}/*.js`], {base: './'}) + .pipe(stripApacheLicense()) + .pipe(gulp.sourcemaps.init()) + .pipe(compile({ + dependency_mode: 'NONE', + externs: ['./externs/goog-externs.js', './externs/generator-externs.js'], + js_output_file: `${language}_compressed.js`, + output_wrapper: outputWrapperUMD(`Blockly.${namespace}`, [{ + name: 'Blockly', + amd: './blockly_compressed.js', + cjs: './blockly_compressed.js' + }]) + }, argv.verbose, argv.debug, argv.strict)) + .pipe(gulp.sourcemaps.write('.', { + includeContent: false, + sourceRoot: './' + })) + .pipe(gulp.dest('./')); +}; + +/** + * This task builds the javascript generator. + * javascript_compressed.js + */ +function buildJavascript() { + return buildGenerator('javascript', 'JavaScript'); +}; + +/** + * This task builds the python generator. + * python_compressed.js + */ +function buildPython() { + return buildGenerator('python', 'Python'); +}; + +/** + * This task builds the php generator. + * php_compressed.js + */ +function buildPHP() { + return buildGenerator('php', 'PHP'); +}; + +/** + * This task builds the lua generator. + * lua_compressed.js + */ +function buildLua() { + return buildGenerator('lua', 'Lua'); +}; + +/** + * This task builds the dart generator: + * dart_compressed.js + */ +function buildDart() { + 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 + */ +const buildGenerators = gulp.parallel( + buildJavascript, + buildPython, + buildPHP, + buildLua, + buildDart +); + +/** + * This task builds Blockly's uncompressed file. + * blockly_uncompressed.js + */ +function buildUncompressed() { + 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) + .replace(/\\/g, '\/'); + + 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 + */ +function buildLangfiles(done) { + // Run js_to_json.py + const jsToJsonCmd = `python ./scripts/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 ./scripts/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 task builds Blockly core, blocks and generators together and uses + * closure compiler's ADVANCED_COMPILATION mode. + */ +function buildAdvancedCompilationTest() { + const srcs = [ + 'tests/compile/main.js', + 'core/**/**/*.js', + 'blocks/*.js', + 'generators/**/*.js']; + return gulp.src(maybeAddClosureLibrary(srcs), {base: './'}) + .pipe(stripApacheLicense()) + .pipe(gulp.sourcemaps.init()) + // 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) { + if (p.dirname.indexOf('core') === 0) { + var dirname = p.dirname.replace( + new RegExp(path.sep.replace(/\\/, '\\\\'), "g"), "-"); + p.dirname = ""; + p.basename = dirname + "-" + p.basename; + } + })) + .pipe(compile({ + dependency_mode: 'PRUNE', + compilation_level: 'ADVANCED_OPTIMIZATIONS', + entry_point: './tests/compile/main.js', + js_output_file: 'main_compressed.js', + externs: ['./externs/svg-externs.js', './externs/goog-externs.js'], + language_in: + argv.closureLibrary ? 'ECMASCRIPT_2015' : 'ECMASCRIPT5_STRICT' + }, argv.verbose, argv.strict)) + .pipe(gulp.sourcemaps.mapSources(function (sourcePath, file) { + return sourcePath.replace(/-/g, '/'); + })) + .pipe(gulp.sourcemaps.write('.', { + includeContent: false, + sourceRoot: '../../' + })) + .pipe(gulp.dest('./tests/compile/')); +} + +/** + * This tasks builds Blockly's core files: + * blockly_compressed.js + * blocks_compressed.js + * blockly_uncompressed.js + */ +const buildCore = gulp.parallel( + buildCompressed, + buildBlocks, + buildUncompressed +); + +/** + * 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 + */ +const build = gulp.parallel( + buildCore, + buildGenerators, + buildLangfiles +); + +module.exports = { + build: build, + core: buildCore, + blocks: buildBlocks, + langfiles: buildLangfiles, + uncompressed: buildUncompressed, + compressed: buildCompressed, + generators: buildGenerators, + advancedCompilationTest: buildAdvancedCompilationTest, +} diff --git a/static/js/scripts/gulpfiles/git_tasks.js b/static/js/scripts/gulpfiles/git_tasks.js new file mode 100644 index 0000000..dbac209 --- /dev/null +++ b/static/js/scripts/gulpfiles/git_tasks.js @@ -0,0 +1,129 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Git-related gulp tasks for Blockly. + */ + +var gulp = require('gulp'); +var execSync = require('child_process').execSync; + +var typings = require('./typings'); +var buildTasks = require('./build_tasks'); + +const upstream_url = "https://github.com/google/blockly.git"; + +// 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' }); + checkoutBranch(branchName); + 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. +function syncDevelop() { + return syncBranch('develop'); +}; + +// Stash current state, check out master, and sync with google/blockly. +function syncMaster() { + return 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; +}; + +// If branch does not exist then create the branch. +// If branch exists switch to branch. +function checkoutBranch(branchName) { + execSync('git checkout ' + branchName + ' || git checkout -b ' + branchName, + { stdio: 'inherit' }); +} + +// Switch to a new rebuild branch. +const preCompile = gulp.series( + syncDevelop(), + function(done) { + var branchName = getRebuildBranchName(); + console.log('make-rebuild-branch: creating branch ' + branchName); + execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); + done(); + } +); + +// Build all files, types, and push to rebuild branch. +const postCompile = gulp.series( + buildTasks.build, + typings.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. +const createRC = gulp.series( + syncDevelop(), + function(done) { + var branchName = getRCBranchName(); + execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); + execSync('git push ' + upstream_url + ' ' + branchName, + { stdio: 'inherit' }); + done(); + } +); + +// Update github pages with what is currently in develop. +const updateGithubPages = gulp.series( + function(done) { + execSync('git stash save -m "Stash for sync"', { stdio: 'inherit' }); + execSync('git checkout gh-pages || git checkout -b gh-pages', { stdio: 'inherit' }); + execSync('git fetch upstream', { stdio: 'inherit' }); + execSync('git reset --hard upstream/develop', { stdio: 'inherit' }); + done(); + }, + buildTasks.build, + function(done) { + execSync('git commit -am "Rebuild"', { stdio: 'inherit' }); + execSync('git push ' + upstream_url + ' gh-pages --force', { stdio: 'inherit' }); + done(); + } +); + +module.exports = { + syncDevelop: syncDevelop, + syncMaster: syncMaster, + createRC: createRC, + preCompile: preCompile, + postCompile: postCompile, + updateGithubPages: updateGithubPages +} diff --git a/static/js/scripts/gulpfiles/license_tasks.js b/static/js/scripts/gulpfiles/license_tasks.js new file mode 100644 index 0000000..3e6b93e --- /dev/null +++ b/static/js/scripts/gulpfiles/license_tasks.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp tasks to check the licenses of Blockly dependencies. + */ + +const jsgl = require('js-green-licenses'); + +function checkLicenses() { + const checker = new jsgl.LicenseChecker(); + checker.setDefaultHandlers(); + return checker.checkLocalDirectory('.'); +}; + +module.exports = { + checkLicenses: checkLicenses +}; diff --git a/static/js/scripts/gulpfiles/package_tasks.js b/static/js/scripts/gulpfiles/package_tasks.js new file mode 100644 index 0000000..24cb400 --- /dev/null +++ b/static/js/scripts/gulpfiles/package_tasks.js @@ -0,0 +1,397 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp tasks to package Blockly for distribution on NPM. + */ + +var gulp = require('gulp'); +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 packageJson = require('../../package.json'); + +const blocklyRoot = '../../'; + +// 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, `${blocklyRoot}/scripts/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, `${blocklyRoot}/scripts/package/templates/node.template`) + }); +}; + +/** + * This task copies source files into the distribution directory. + */ +function packageSources() { + return gulp.src(['core/**/**.js', 'blocks/**.js', 'generators/**/**.js'], + {base: '.'}) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task copies the compressed files and their source maps into the + * distribution directory. + */ +function packageCompressed() { + return gulp.src('*_compressed.js?(.map)') + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task wraps scripts/package/blockly.js into a UMD module. + * @example import 'blockly/blockly'; + */ +function packageBlockly() { + return gulp.src('scripts/package/blockly.js') + .pipe(packageUMD('Blockly', [{ + name: 'Blockly', + amd: './blockly_compressed', + cjs: './blockly_compressed', + }])) + .pipe(gulp.rename('blockly.js')) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task wraps scripts/package/blocks.js into a UMD module. + * @example import 'blockly/blocks'; + */ +function packageBlocks() { + return gulp.src('scripts/package/blocks.js') + .pipe(packageUMD('Blockly.Blocks', [{ + name: 'Blockly', + amd: './blocks_compressed', + cjs: './blocks_compressed', + }])) + .pipe(gulp.rename('blocks.js')) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task wraps scripts/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'; + */ +function packageIndex() { + return gulp.src('scripts/package/index.js') + .pipe(packageUMD('Blockly', [{ + name: 'Blockly', + amd: './browser', + cjs: './node', + }])) + .pipe(gulp.rename('index.js')) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task wraps scripts/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'; + */ +function packageBrowser() { + return gulp.src('scripts/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 scripts/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'; + */ +function packageCore() { + return gulp.src('scripts/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 scripts/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'; + */ +function packageNode() { + return gulp.src('scripts/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 scripts/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'; + */ +function packageNodeCore() { + return gulp.src('scripts/package/node/core.js') + .pipe(packageCommonJS('Blockly', [{ + name: 'Blockly', + amd: './blockly', + cjs: './blockly', + }])) + .pipe(gulp.rename('core.js')) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * A helper method for wrapping a generator file into a UMD module. + * @param {string} file Source file name. + * @param {string} rename Destination file name. + * @param {string} namespace Export namespace. + */ +function packageGenerator(file, rename, namespace) { + return gulp.src(`scripts/package/${rename}`) + .pipe(packageUMD(`Blockly${namespace}`, [{ + name: 'Blockly', + amd: './core', + cjs: './core', + }, { + name: `Blockly${namespace}`, + amd: `./${file}`, + cjs: `./${file}`, + }])) + .pipe(gulp.rename(rename)) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task wraps javascript_compressed.js into a UMD module. + * @example import 'blockly/javascript'; + */ +function packageJavascript() { + return packageGenerator('javascript_compressed.js', 'javascript.js', 'JavaScript'); +}; + +/** + * This task wraps python_compressed.js into a UMD module. + * @example import 'blockly/python'; + */ +function packagePython() { + return packageGenerator('python_compressed.js', 'python.js', 'Python'); +}; + +/** + * This task wraps lua_compressed.js into a UMD module. + * @example import 'blockly/lua'; + */ +function packageLua() { + return packageGenerator('lua_compressed.js', 'lua.js', 'Lua'); +}; + +/** + * This task wraps dart_compressed.js into a UMD module. + * @example import 'blockly/dart'; + */ +function packageDart() { + return packageGenerator('dart_compressed.js', 'dart.js', 'Dart'); +}; + +/** + * This task wraps php_compressed.js into a UMD module. + * @example import 'blockly/php'; + */ +function packagePHP() { + return packageGenerator('php_compressed.js', 'php.js', 'PHP'); +}; + +/** + * This task wraps each of the msg/js/* files into a UMD module. + * @example import * as En from 'blockly/msg/en'; + */ +function packageLocales() { + // 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 + */ +function packageUMDBundle() { + 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(gulp.dest(`${packageDistribution}`)) +}; + +/** + * This task copies all the media/* files into the distribution directory. + */ +function packageMedia() { + return gulp.src('./media/*') + .pipe(gulp.dest(`${packageDistribution}/media`)); +}; + +/** + * This task copies the package.json file into the distribution directory. + */ +function packageJSON(cb) { + const json = Object.assign({}, packageJson); + delete json['scripts']; + if (!fs.existsSync(packageDistribution)) { + fs.mkdirSync(packageDistribution); + } + fs.writeFileSync(`${packageDistribution}/package.json`, + JSON.stringify(json, null, 2)); + cb(); +}; + +/** + * This task copies the scripts/package/README.md file into the distribution directory. + * This file is what developers will see at https://www.npmjs.com/package/blockly. + */ +function packageReadme() { + return gulp.src('./scripts/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. + */ +function packageDTS() { + return gulp.src(['./typings/*.d.ts', './typings/msg/*.d.ts'], {base: './typings'}) + .pipe(gulp.dest(`${packageDistribution}`)); +}; + +/** + * This task prepares the NPM distribution files under the /dist directory. + */ +const package = gulp.parallel( + packageIndex, + packageSources, + packageCompressed, + packageBrowser, + packageNode, + packageCore, + packageNodeCore, + packageBlockly, + packageBlocks, + packageJavascript, + packagePython, + packageLua, + packageDart, + packagePHP, + packageLocales, + packageMedia, + packageUMDBundle, + packageJSON, + packageReadme, + packageDTS +); + +module.exports = { + package: package, +}; diff --git a/static/js/scripts/gulpfiles/typings.js b/static/js/scripts/gulpfiles/typings.js new file mode 100644 index 0000000..70ec96b --- /dev/null +++ b/static/js/scripts/gulpfiles/typings.js @@ -0,0 +1,104 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp script to generate the Typescript definition file (d.ts) + * for Blockly. + */ + +var gulp = require('gulp'); +gulp.concat = require('gulp-concat'); + +var path = require('path'); +var fs = require('fs'); +var rimraf = require('rimraf'); +var execSync = require('child_process').execSync; + +// 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. +function typings() { + const tmpDir = './typings/tmp'; + const blocklySrcs = [ + "core/", + "core/events", + "core/keyboard_nav", + "core/renderers/common", + "core/renderers/measurables", + "core/theme", + "core/toolbox", + "core/interfaces", + "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/templates/blockly-header.template', + 'typings/templates/blockly-interfaces.template', + `${tmpDir}/core/**`, + `${tmpDir}/core/interfaces/**`, + `${tmpDir}/core/events/**`, + `${tmpDir}/core/keyboard_nav/**`, + `${tmpDir}/core/renderers/common/**`, + `${tmpDir}/core/renderers/measurables/**`, + `${tmpDir}/core/utils/**`, + `${tmpDir}/core/toolbox/**`, + `${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); + } + }); +}; + +// Generates the TypeScript definition files (d.ts) for Blockly locales. +function msgTypings(cb) { + const template = fs.readFileSync(path.join('typings/templates/msg.template'), 'utf-8'); + const msgFiles = fs.readdirSync(path.join('msg', 'json')); + msgFiles.forEach(msg => { + const localeName = msg.substring(0, msg.indexOf('.json')); + const msgTypings = template.slice().replace(/<%= locale %>/gi, localeName); + fs.writeFileSync(path.join('typings', 'msg', localeName + '.d.ts'), msgTypings, 'utf-8'); + }) + cb(); +} + +module.exports = { + typings: typings, + msgTypings: msgTypings +}; diff --git a/static/js/scripts/package/README.md b/static/js/scripts/package/README.md new file mode 100644 index 0000000..b4f0cf3 --- /dev/null +++ b/static/js/scripts/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/static/js/scripts/package/blockly.js b/static/js/scripts/package/blockly.js new file mode 100644 index 0000000..55bc791 --- /dev/null +++ b/static/js/scripts/package/blockly.js @@ -0,0 +1,12 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly module. + */ + +/* eslint-disable */ +'use strict'; diff --git a/static/js/scripts/package/blocks.js b/static/js/scripts/package/blocks.js new file mode 100644 index 0000000..8e0d4ab --- /dev/null +++ b/static/js/scripts/package/blocks.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly Blocks module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Blocks = {}; diff --git a/static/js/scripts/package/browser/core.js b/static/js/scripts/package/browser/core.js new file mode 100644 index 0000000..19463cd --- /dev/null +++ b/static/js/scripts/package/browser/core.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/scripts/package/browser/index.js b/static/js/scripts/package/browser/index.js new file mode 100644 index 0000000..1b2f05e --- /dev/null +++ b/static/js/scripts/package/browser/index.js @@ -0,0 +1,24 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/scripts/package/dart.js b/static/js/scripts/package/dart.js new file mode 100644 index 0000000..ea4e833 --- /dev/null +++ b/static/js/scripts/package/dart.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Dart Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Dart = BlocklyDart; diff --git a/static/js/scripts/package/index.js b/static/js/scripts/package/index.js new file mode 100644 index 0000000..f88c16e --- /dev/null +++ b/static/js/scripts/package/index.js @@ -0,0 +1,12 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly module. + */ + +/* eslint-disable */ +'use strict'; \ No newline at end of file diff --git a/static/js/scripts/package/javascript.js b/static/js/scripts/package/javascript.js new file mode 100644 index 0000000..e0ba813 --- /dev/null +++ b/static/js/scripts/package/javascript.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview JavaScript Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.JavaScript = BlocklyJavaScript; diff --git a/static/js/scripts/package/lua.js b/static/js/scripts/package/lua.js new file mode 100644 index 0000000..4094782 --- /dev/null +++ b/static/js/scripts/package/lua.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Lua Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Lua = BlocklyLua; diff --git a/static/js/scripts/package/node/core.js b/static/js/scripts/package/node/core.js new file mode 100644 index 0000000..8f77453 --- /dev/null +++ b/static/js/scripts/package/node/core.js @@ -0,0 +1,33 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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]; + }); +}; + +// Override textToDomDocument and provide Node.js alternatives to DOMParser and +// XMLSerializer. +if (typeof Blockly.utils.global.document !== 'object') { + Blockly.utils.global.DOMParser = require("jsdom/lib/jsdom/living").DOMParser; + Blockly.utils.global.XMLSerializer = require("jsdom/lib/jsdom/living").XMLSerializer; + var doc = Blockly.utils.xml.textToDomDocument( + ''); + Blockly.utils.xml.document = function() { + return doc; + }; +} diff --git a/static/js/scripts/package/node/index.js b/static/js/scripts/package/node/index.js new file mode 100644 index 0000000..d50a92d --- /dev/null +++ b/static/js/scripts/package/node/index.js @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/scripts/package/php.js b/static/js/scripts/package/php.js new file mode 100644 index 0000000..361dd97 --- /dev/null +++ b/static/js/scripts/package/php.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview PHP Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.PHP = BlocklyPHP; diff --git a/static/js/scripts/package/python.js b/static/js/scripts/package/python.js new file mode 100644 index 0000000..3634e41 --- /dev/null +++ b/static/js/scripts/package/python.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Python Generator module. + */ + +/* eslint-disable */ +'use strict'; + +Blockly.Python = BlocklyPython; diff --git a/static/js/scripts/package/templates/node.template b/static/js/scripts/package/templates/node.template new file mode 100644 index 0000000..eef05d7 --- /dev/null +++ b/static/js/scripts/package/templates/node.template @@ -0,0 +1,5 @@ +/* eslint-disable */ +(function (<%= param %>){ +<%= contents %> +module.exports = <%= exports %>; +})(<%= cjs %>); diff --git a/static/js/scripts/package/templates/umd.template b/static/js/scripts/package/templates/umd.template new file mode 100644 index 0000000..ab62e10 --- /dev/null +++ b/static/js/scripts/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/static/js/tests/compile/compile.sh b/static/js/tests/compile/compile.sh new file mode 100644 index 0000000..c916eba --- /dev/null +++ b/static/js/tests/compile/compile.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# +# Deprecation warning: (July 2020) +# This advanced compilation test script has been deprecated in favour of +# npm run test:compile:advanced +# +# The script will be removed from Blockly core in Q4 of 2020. +# +echo "Deprecation warning: (July 2020)" +echo "This advanced compilation test script has been deprecated in favour of" +echo " npm run test:compile:advanced" +echo "" +echo "The script will be removed from Blockly core in Q4 of 2020." +echo "" + +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 +# 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/tests/blocks/**.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/static/js/tests/compile/index.html b/static/js/tests/compile/index.html new file mode 100644 index 0000000..1ec1ce8 --- /dev/null +++ b/static/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/static/js/tests/compile/main.js b/static/js/tests/compile/main.js new file mode 100644 index 0000000..b8a64be --- /dev/null +++ b/static/js/tests/compile/main.js @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +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'); + +Main.init = function() { + Blockly.inject('blocklyDiv', { + 'toolbox': document.getElementById('toolbox') + }); +}; + +window.addEventListener('load', Main.init); diff --git a/static/js/tests/media/200px.png b/static/js/tests/media/200px.png new file mode 100644 index 0000000000000000000000000000000000000000..8671954e8c5e8f1cd08b3f241ed34b3957af5a90 GIT binary patch literal 1709 zcmZ`(dpy$%6#tQ;A-Nu97V=1unb%_Um@He`G=^qnG>?$?lu`1Q<# zx2=>{$o1H|9_isRMk&o(*ZujFTm5nWIN$R*kMB9>pYu&QOt6)OKp_AC$l|az4xn#Z zF)0ZUC5hfjpp)=HosGg`S|v_2S14g&ybg%uM6SUH=)q$C}O$4I_kzexdVbVq67 zApoqsiL*hIB6>gcxBJ7qV2z*UoOdO;nfl)DJZPALm(jefgI-eT=AW<1i`;=B`e{8E zVxUlwyA_FPeGsmk?`j>LTQ;<@!vX!tFP?b<&noOWY2=%uR$G!r&jOKn|&6qDU7BEbTG_xf?|SQ^?!uP$Wn;k`2r%i%508^iBZ zXcQ6w1&MA3&uxA)JC%N}JB!~E z8Pqf8y@;ED*`Zh?hMcpqTCrM0?cjuM2;ZSJyKMYG#!u3SzIb3FkRc5Urdk9?T_!B z?4OKzIc6^?8uEpxPCEp0PwgCiU~D$~aujcXV(X|dRdr^9oT(+dgQcVByxs;3Q*}?H zLE_O@W6W8re1)3Q>#p5v1bY2dq9>i5EsEwxPf==OA2E&9InR>}kkxLHeZ$5Ln{b)ZW=P~8)K+DOi7nveUdzUgN zf^(%0oK;jtQ?$ggRUS`S+Xfa0n~V9a^~zs|`viLR>|EQl^{DuI!^gNS(&ew!Q;b)~Ma*+?Wwi zxiCL|mVOZFnqRlV!jbEUuGo)5SL7n*CSycHRPI>RS5m`k}^5!q(R zMO0^52#)Jrh*Alk11Hfbf=UDHW0w}85OXY={ zALDrUdy$)^eD^&C#3aCXT?KLQdx4)}wXoWfuu^4{sLD0RD9)K}oM;3*eK?6Wk*$*( z;)ybXS-RtVU}U^v6GX$U4*88WD%DApSlROK)=SKmZ`)idWZ>KMGgHJ>Bn$MP(4IZ? zugz=_c=TYmJ-8H;$uoyhUNZ*cWLM5v(GhU#FPDHv{CxIz(fQHxO@4l~d>;VmIdO5P z{RKPaChZl(&UXnTT#t(HgV>i0`i7*4{YU#*#K0-5;lu=jtLNbn?NnE{R4j1`!DX&0 zNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`!jG!i)^F=12eq*-JcqUD+RTiVI5_t`PmTje&u2o~Mgrh{frxS2tz{2Z|j3 zc)t2&cG$w+t%d$Oc)0g-Od9L1$+K-fc1-V$67lueLF zSM|bsQOwnCZ}#3e`E+jo%xU4*0*w>}7A{z=lYc8>+9UCp9Zho-8pSsyEDY3nHS0(R zhwv^j!&!E3If|`nrJZGqJ0}$xtGXwZR)2eYJ6JqhW2toxOLmg^qOADC{8j%o zmo3=OIDbLP`iX+9g22dAEpd$~Nl7e8wMs5Z1yT$~28I^829~-;#vz85Rz_x4CYIU; n237_J`?jwXL(!0%pOTqYiCe?@SAwg68W=oX{an^LB{Ts5%25lC literal 0 HcmV?d00001 diff --git a/static/js/tests/media/50px.png b/static/js/tests/media/50px.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d4fc2d67ad27e6efb6d98855d97c91b1c46e17 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQHmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1OBOz`!jG!i)^F=12eq*-JcqUD+RTiVI5_t`PmT4X9~_r;B4q#NoF$eDj6FMUH*E zFMB)WP-t$e3sa{+x9Ng?o-V5i0Jg! zM_6P`KTThJHHm4`%JZ?ex0Nne@C-e0EXHGT*OmKKk8Gk`Z*7}6vFzd24X--$`TDaT zu?N1hkrL9ad04!Kg?G&<*ZblZ+vUn#ciUCIzO}qtF6%}58Z1KZS4|2-MeY`#%j^!z?O3FpF>U3djp;hl9s9OD zQD3RMK}{-RUZ;-XHP`PtH$`3f_o^Rkd$GGny6%{&c+8c9@{5Y=#O{_iJ!+{@tLjtt&d$L5U+`Q?~T}cSq~K{O3%(lq)wDwH?oXQA= zV}`ObWp%IHY|1>%+|9o7>DdG8&K&rCbmhF5K&zse@AlVxwl_@PYto%kIZ?+)Rr-AS z1)W8QAF3L7PCGM`|Ecup+mk~1UcUPqlN`(H_~}@Ur$^Jan00&ebB*Rtd4I@u=9x{~ z*7+sI=AJg18TV69=FhXO8n+B*Y?KZBaw|>Jz4v~(!d<&Eeb62Obaa`*6BWG7` zIV*YI`h>N|(FxLvq)VOiI`gjbMhdUJ%E@VwclKk}f9CUfr7PB@pKTY|vZ^j2VDh|g z&RG{O*Lm<(-Ku}N%F+Mxx(QqDTC|of-_K~y#s1rAw@NiI8LO7KMwFx^mZVxG7o`Fz z1|tJQ3tazopr0F~jGeE!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qA0*8#8t6LQLbE8GE0)p zklo(iUO_?O@87>29UVN5JS$eLsH>|J3KV?y>=_d;qe6}R-Me@D`ue_o`<9=dFB~Dv zEX~aC$#?zw_4xRBu{hBkJ9ZpDew;;}W!}7b5~Fdh=h*Mlx%5a6~uWdk~^PVn_Ar_~vPP{49 ztRTRms&Q|Y#=VaokN(#uCj>H1{JunfOICT-fop|zJSD;r%r{tVQf}UlVfxXyRzZX@ zX{E!xZR&wFk{o|*CoGw{RbjvVjm;YROod0jZ+T>EYWh8L)`6FcR%G@%MCN=yE?fP* zS#W{rZ2Oswg^xVHui2d2XXxTw!^LB(zwB1xved$@Ir~27>U=+YXh!_9{LIKjKc`Jo zU6mhr!T0pJ*)R4TG@5xVc|x7Z{X<3TezeOg)lNTpDnP&0#xAn_J|o+e^Q+EWjQ`Af z`4yjFr0q^qpx0DOTq8i(P~@1Wi(^Q|oVQmD`C1GFoCDw0ztmx!(#>+? z-{B0da*v<>jyJDGMYlg>WR~>!_>=!e|BvndjzKf-T%B!b*dZ<4YGGK|!QJd2Bf+!i z*a87nw)PbU7EY}P8MS!i)*pKC5J;^(^xz+3FP}E63F$5Es*V#SRm6PhX(?pOsyJ%5-z!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qA0*8#8t96PPiygDBD-G zB8OGD!Bs#F N44$rjF6*2UngF#O#CZS! literal 0 HcmV?d00001 diff --git a/static/js/tests/media/c.png b/static/js/tests/media/c.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0127d2618925fdf57df0f4a5d796fb3b668632 GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qA|cH#8s-URid(9AUc7= z!I@Rxh>?d6D8nQr!{Zk$n3yhBTqPhN5FZ~uckbN1d-uM1^XAW=KX>ljsjI8=_xI;? z_f}9)Xm4+4R@KPJ$oTs8YehxH*|TTYu3gJ!VZD6$a(jDw;q=_?+qaA6mhgo{<>%-3 z_V()Q>rbCP{o1u_PoF;h|Nnnt_B<<~m5fQ=?k-xv`>xCba@b2eeO=ifaf%B|8Lklh zwGAkA%hSa%#NzbTNwU@xDyFTQz%nW~)Qj?m+4}L7Nx7Ya1cxk)nla@C36SowE-2~oLFSM0>I47F5*3il8 zZT6CthFrfn!Xy^fNT2=U{>n;X%iCQIa;ui_zL1yy;kKucP|C%cyZVQ#_#H04+NZ^E z;*LSxCzV5|&AU%7eWw)rB+@#2*N+G5KQVCj2|2m){q6+%Qnkc2q9i4;B-JXpC>2OC z7#SE^=o(n+8X1QeT3Q*IS(#XB8yHv_80_1=QVc~yZhlH;S|x4`=U)k~0%~CJboFyt I=akR{01E=+!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qBOuK#8ob-RVJ=pEFjn3 z-X18%u4yggmhk7#pS5e(#>dAq3&|Wme*D_CYx(*4bLY;jsHk9;(hzir;xcd+5D@tK z^(&i_5s#U7Mn(oBJKy&0+eN(7{r&x=BC8Y>6!z}j+uPeK5nA%*&70}dr?+9<; zU%veR|No(FYrTP%F(!GtyQoER%-9ODxx~}gmHiQ?xUiJr3ejKNfI@pbT^vI!PT#%s zmaj=cf;C~^6^)Y%0$f5i?fM^`b0AEw@!z&{`;F)I9{kPpLAxI9D`^du3Q2x(}HJIVVz0fGN zM!6WV1`oe)@d zmEX$zT~?sgc7EZh--;8Lg{PUFI(shir{8JbAG>WB-%RJXS!;9>7#R$zC9V-ADTyVi zR>?)FK#IZ0z|cb1z*5)9IK%E-*h#8TV9z{nC}Q!>*kacemLN^liW O1B0ilpUXO@geCw#CCD-W literal 0 HcmV?d00001 diff --git a/static/js/tests/media/e.png b/static/js/tests/media/e.png new file mode 100644 index 0000000000000000000000000000000000000000..2070b06b06c001c905a9928e1246f5a3f6eae9d8 GIT binary patch literal 393 zcmV;40e1e0P)E#K68mkkqk^&mhbrq}awP z>9i1o#iC2Ryg*`Zh9QsxQ_bQ0AM+oW8DlW|fke&99Nq!|fRe{FoxI^Y{wyBe(V(ac z)d60g9&yms3Iq5rI>^>;bpQb1oP$!Dd$?s;@E^vRzGieFO`hk$ahyLKdVK)C@8kUP z7JBzM)w8&k-J8+?Q50cLokwSBy=(-4CU<}kg0JZWAMekpo;P7pHr0oa zv1-CV7zglw!I2xe4d3@OXP)OF+V2W?G`j-; zz&S^fBx(Shb1YxiXqi^#yxkep3kZS$U8~{$0S(ZAQeS}(LJhz$C_X+!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10q9wp5#MMfxRYxveR@hsR z%ZP_f11PL09;~mBYob~uDd^11$mj3x-`m@}ckkY_XV3om^QW$^&feahokhl6yesARw@P`*sz{C=HneeSQ7> z{QPUzuB~0WcKPz&pI!Q(Rce zaE0ivZ9r*RPZ!4!i_=#p-L7gf5NHvc74fU<>|2L>gD`Y&~H&^?_ne8|K z?4I|1`Se^m>YSb z3s`09u7-=O@NxKYET(rE)Bb?9J1v#&9=-DFViBYC0r%qMS-iDvvoiR$m|jU=_tDL= zJfzaRao1gzB?~@g?~*)lL1|vYgQ+K$Hx%qRB9idaEx~>xSJLO}k$NtDuO8lw@pI0u zO7MPr;ZWeW6unojH@)jBe@xuh_egPe<(7tjb96TZr9Sw)FlmZ_(@fc1R~gQ;3I{(g z7kI?k|7+cgSySCUJNZ<3{I6XaQ5*m5b76{FKbJO57UGzY<&p)WG2B>gTe~DWM4f?!^jq literal 0 HcmV?d00001 diff --git a/static/js/tests/media/h.png b/static/js/tests/media/h.png new file mode 100644 index 0000000000000000000000000000000000000000..33cbb44c89a6265abb2d6653179b25c1ef964db6 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFfw?$IEF;DCi7g$`g`7>p&?U2 zSH6^i83?$|4)))VPY6A8@YLx8=MMQ^2nhO;TzX*N@5z#H-o72PNEkd_{an^L HB{Ts5e%F8& literal 0 HcmV?d00001 diff --git a/static/js/tests/media/i.png b/static/js/tests/media/i.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4d90c8b90c9910995c9e8b42d054bc0cb7671d GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJeoq(2kcie~pUZiF&l@x}WGd*& zmohK|0k`F>d$skAp>rlro!&UPb@n&Dh~j*s=DmAummTpHWGhWnzGdCe*w~o({@z}V zKg*V>wKbcspOka1VR>U9dyiGZ6~@JU5~T-LFuTbbykgiC?ZVD4Cu70BqDa~><;T>d tj@2A5FCJ&?<2v{x<1iPS4KG*=1B0!|3NfqdeL$x%c)I$ztaD0e0sswSM&JMd literal 0 HcmV?d00001 diff --git a/static/js/tests/media/j.png b/static/js/tests/media/j.png new file mode 100644 index 0000000000000000000000000000000000000000..81da54444ba9d9771108e7bff7a67f7fd19969ec GIT binary patch literal 453 zcmV;$0XqJPP)u9x4rWD?ZU$|c3)ZPsj0Y0DzWyl9fss zQc2SEIjv4u%&mro& zGfof$a2$v2^%%JRW#ZiffQjT|A}caZ9*-bA2^gCmRry3wg!_%g1T~31#{hBRngD(( v_xhl+NvGexRP#_uGU?W$=DG literal 0 HcmV?d00001 diff --git a/static/js/tests/media/k.png b/static/js/tests/media/k.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ea5a7bd17001b020b3d4aea0da1ab197718ad1 GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10A|${k#I;R3zdAGUq__BU_d z)Ya8#vMaQ=w^ysB?%liBm|Me!&*1<6|0~Wb+5ydHO!9Vjk!DJ`vINLsFY)wsWq-se zE-YoZLiE=*pwKE$7sn8b(|0f31aOh`=0q^h5sU^ zp1)o@PCPW=@?dp(c3|>lE6>)(K1PE%mlJeeNiSG)`>TXT_BUH5r=VI^yOEwjt2UySZ#V>Ssn$lmh&uY=1XV(AO6fd}4T$ESpzTohu zg93|e^PEh?+k~9X89qIwIeVET_x>kS*t2A(^QYHO(%*cIyG^K)F9hgn)e_f;l9a@f zRIB8oR3OD*WMF8aYhbBsWE^5>X=P+)Wn!sqU|?lnuy6ZHF%%8C`6-!cmAEyWe)daAGroLKXx_Wmwr$6Yui`vzPM@}vgH#^Ax3@a* zhp(?M&-HcrDz}T++8igaxyc&5Y6xWSu}ZkYxR_6(fPF%U?BeDxUrO4Zg|C-bm3HR9 zN;Us`^BkKd%P+TaRaDT^J7MgO+w&d+v04>5SU`njxgN@xNA&YNKE literal 0 HcmV?d00001 diff --git a/static/js/tests/media/m.png b/static/js/tests/media/m.png new file mode 100644 index 0000000000000000000000000000000000000000..ee98eb8ee20f09f1b4f14d80f59f9e49802b84c1 GIT binary patch literal 663 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10q9VX2#I;RLt3gF0PfoE~ zNv%{tIZ;x^-rnAYUyzTHNkBlrM^L104<~AGm zsrN-Con1a0$(&%R$-FpXddC}euOPen7m}(+A2Q9eRh2lNcV)(!DfzjtdxNse6lTVx zs8(#ta9!|Z=O@j!oCC!sUYeVy%W#X!JwB?#n`!Q4z~!IvJl6h&>f>s|Ws+a+sT=&A zJ0(-3OwRcUgwijw| zP?==u$8Fem)R*=9tCDZx*L3*A*rctGn|ggY^oRR5>%C{v;>t!7w17dUTH+c}l9E`G zYL#4+3Zxi}3=A!F4J>tyj6)19t&Gg9Of0nx46F' + + ' ' + + ''); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Multi-Stack', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + }); + test('Collapsed Stack', function() { + this.deserializationHelper( + '' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Collapsed Multi-Stack', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + }); + test('Row', function() { + this.deserializationHelper( + '' + + ' ' + + '' + ); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Multi-Row', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + }); + test('Collapsed Row', function() { + this.deserializationHelper( + '' + + ' ' + + '' + ); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + }); + test('Collapsed Multi-Row', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + 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.runAll(); + chai.assert.equal(this.getOutputs().length, 2); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Statement', function() { + this.deserializationHelper( + '' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 2); + }); + test('Multi-Statement', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + }); + test('Collapsed Statement', function() { + this.deserializationHelper( + '' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Collapsed Multi-Statement', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Collapsed Multi-Statement Middle', function() { + this.deserializationHelper( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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.runAll(); + 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 = createRenderedBlock(this.workspace, 'row_block'); + + block.setOutput(false); + + chai.assert.equal(this.getOutputs().length, 0); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Value', function() { + var block = createRenderedBlock(this.workspace, 'row_block'); + + block.removeInput('INPUT'); + + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + }); + test('Previous', function() { + var block = createRenderedBlock(this.workspace, 'stack_block'); + + block.setPreviousStatement(false); + + chai.assert.equal(this.getPrevious().length, 0); + chai.assert.equal(this.getNext().length, 1); + }); + test('Next', function() { + var block = createRenderedBlock(this.workspace, 'stack_block'); + + block.setNextStatement(false); + + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 0); + }); + test('Statement', function() { + var block = createRenderedBlock(this.workspace, 'statement_block'); + + 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 = createRenderedBlock(this.workspace, 'empty_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() { + 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); + } + setup(function() { + this.eventsFireSpy = sinon.spy(Blockly.Events, 'fire'); + }); + teardown(function() { + this.eventsFireSpy.restore(); + }); + 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.eventsFireSpy, null, 'test text'); + }); + test('Text Empty', function() { + this.block.setCommentText(''); + chai.assert.equal(this.block.getCommentText(), ''); + assertCommentEvent(this.eventsFireSpy, null, ''); + }); + test('Text Null', function() { + this.block.setCommentText(null); + chai.assert.isNull(this.block.getCommentText()); + assertNoCommentEvent(this.eventsFireSpy); + }); + test('Text -> Null', function() { + this.block.setCommentText('first text'); + + this.block.setCommentText(null); + chai.assert.isNull(this.block.getCommentText()); + assertCommentEvent(this.eventsFireSpy, '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() { + workspaceTeardown.call(this, this.workspace); + }); + test('Text', function() { + this.block.setCommentText('test text'); + chai.assert.equal(this.block.getCommentText(), 'test text'); + assertCommentEvent(this.eventsFireSpy, null, 'test text'); + }); + test('Text Empty', function() { + this.block.setCommentText(''); + chai.assert.equal(this.block.getCommentText(), ''); + assertCommentEvent(this.eventsFireSpy, null, ''); + }); + test('Text Null', function() { + this.block.setCommentText(null); + chai.assert.isNull(this.block.getCommentText()); + assertNoCommentEvent(this.eventsFireSpy); + }); + test('Text -> Null', function() { + this.block.setCommentText('first text'); + + this.block.setCommentText(null); + chai.assert.isNull(this.block.getCommentText()); + assertCommentEvent(this.eventsFireSpy, '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.eventsFireSpy, 'test1', 'test2'); + chai.assert.equal(icon.textarea_.value, 'test2'); + }); + test('Set While Visible - NonEditable', function() { + this.block.setCommentText('test1'); + // Restored up by call to sinon.restore() in sharedTestTeardown() + sinon.stub(this.block, 'isEditable').returns(false); + var icon = this.block.getCommentIcon(); + // TODO(#4186): Remove stubbing of deprecation warning after fixing. + var deprecationWarnStub = createDeprecationWarningStub(); + icon.setVisible(true); + deprecationWarnStub.restore(); + + this.block.setCommentText('test2'); + chai.assert.equal(this.block.getCommentText(), 'test2'); + assertCommentEvent(this.eventsFireSpy, 'test1', 'test2'); + chai.assert.equal(icon.paragraphElement_.firstChild.textContent, + 'test2'); + }); + 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() { + workspaceTeardown.call(this, this.workspace); + this.workspace = Blockly.inject('blocklyDiv'); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + 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('Collapsing and Expanding', function() { + function assertCollapsed(block, opt_string) { + chai.assert.isTrue(block.isCollapsed()); + for (var i = 0, input; (input = block.inputList[i]); i++) { + if (input.name == Blockly.Block.COLLAPSED_INPUT_NAME) { + continue; + } + chai.assert.isFalse(input.isVisible()); + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + chai.assert.isFalse(field.isVisible()); + } + } + var icons = block.getIcons(); + for (var i = 0, icon; (icon = icons[i]); i++) { + chai.assert.isFalse(icon.isVisible()); + } + + var input = block.getInput(Blockly.Block.COLLAPSED_INPUT_NAME); + chai.assert.isNotNull(input); + chai.assert.isTrue(input.isVisible()); + var field = block.getField(Blockly.Block.COLLAPSED_FIELD_NAME); + chai.assert.isNotNull(field); + chai.assert.isTrue(field.isVisible()); + + if (opt_string) { + chai.assert.equal(field.getText(), opt_string); + } + } + function assertNotCollapsed(block) { + chai.assert.isFalse(block.isCollapsed()); + for (var i = 0, input; (input = block.inputList[i]); i++) { + chai.assert.isTrue(input.isVisible()); + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + chai.assert.isTrue(field.isVisible()); + } + } + + var input = block.getInput(Blockly.Block.COLLAPSED_INPUT_NAME); + chai.assert.isNull(input); + var field = block.getField(Blockly.Block.COLLAPSED_FIELD_NAME); + chai.assert.isNull(field); + } + function isBlockHidden(block) { + var node = block.getSvgRoot(); + do { + var visible = node.style.display != 'none'; + if (!visible) { + return true; + } + node = node.parentNode; + } while (node != document); + return false; + } + + setup(function() { + Blockly.Events.disable(); + // We need a visible workspace. + this.workspace = Blockly.inject('blocklyDiv', {}); + Blockly.defineBlocksWithJsonArray([ + { + "type": "variable_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "NAME", + "variable": "x" + } + ], + } + ]); + }); + teardown(function() { + Blockly.Events.enable(); + workspaceTeardown.call(this, this.workspace); + }); + suite('Connecting and Disconnecting', function() { + test('Connect Block to Next', function() { + var blockA = createRenderedBlock(this.workspace,'stack_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.nextConnection.connect(blockB.previousConnection); + assertNotCollapsed(blockB); + }); + test('Connect Block to Value Input', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + chai.assert.isTrue(isBlockHidden(blockB)); + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + }); + test('Connect Block to Statement Input', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + chai.assert.isTrue(isBlockHidden(blockB)); + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + }); + test('Connect Block to Child of Collapsed - Input', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + var blockC = createRenderedBlock(this.workspace,'row_block'); + + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + blockB.getInput('INPUT').connection.connect(blockC.outputConnection); + chai.assert.isTrue(isBlockHidden(blockC)); + + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Connect Block to Child of Collapsed - Next', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + var blockC = createRenderedBlock(this.workspace,'stack_block'); + + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + blockB.nextConnection.connect(blockC.previousConnection); + chai.assert.isTrue(isBlockHidden(blockC)); + + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Connect Block to Value Input Already Taken', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + var blockC = createRenderedBlock(this.workspace,'row_block'); + + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + blockA.getInput('INPUT').connection.connect(blockC.outputConnection); + chai.assert.isTrue(isBlockHidden(blockC)); + // Still hidden after C is inserted between. + chai.assert.isTrue(isBlockHidden(blockB)); + + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Connect Block to Statement Input Already Taken', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + var blockC = createRenderedBlock(this.workspace,'stack_block'); + + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + blockA.getInput('STATEMENT').connection + .connect(blockC.previousConnection); + chai.assert.isTrue(isBlockHidden(blockC)); + // Still hidden after C is inserted between. + chai.assert.isTrue(isBlockHidden(blockB)); + + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Connect Block with Child - Input', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + var blockC = createRenderedBlock(this.workspace,'row_block'); + + blockB.getInput('INPUT').connection.connect(blockC.outputConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + chai.assert.isTrue(isBlockHidden(blockC)); + chai.assert.isTrue(isBlockHidden(blockB)); + + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Connect Block with Child - Statement', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + var blockC = createRenderedBlock(this.workspace,'stack_block'); + + blockB.nextConnection.connect(blockC.previousConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + chai.assert.isTrue(isBlockHidden(blockC)); + chai.assert.isTrue(isBlockHidden(blockB)); + + blockA.setCollapsed(false); + assertNotCollapsed(blockA); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Disconnect Block from Value Input', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + blockB.outputConnection.disconnect(); + chai.assert.isFalse(isBlockHidden(blockB)); + }); + test('Disconnect Block from Statement Input', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + blockB.previousConnection.disconnect(); + chai.assert.isFalse(isBlockHidden(blockB)); + }); + test('Disconnect Block from Child of Collapsed - Input', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + var blockC = createRenderedBlock(this.workspace,'row_block'); + + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + blockB.getInput('INPUT').connection.connect(blockC.outputConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + chai.assert.isTrue(isBlockHidden(blockC)); + + blockC.outputConnection.disconnect(); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Disconnect Block from Child of Collapsed - Next', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + var blockC = createRenderedBlock(this.workspace,'stack_block'); + + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + blockB.nextConnection.connect(blockC.previousConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + chai.assert.isTrue(isBlockHidden(blockC)); + + blockC.previousConnection.disconnect(); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Disconnect Block with Child - Input', function() { + var blockA = createRenderedBlock(this.workspace,'row_block'); + var blockB = createRenderedBlock(this.workspace,'row_block'); + var blockC = createRenderedBlock(this.workspace,'row_block'); + + blockB.getInput('INPUT').connection.connect(blockC.outputConnection); + blockA.getInput('INPUT').connection.connect(blockB.outputConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockB)); + chai.assert.isTrue(isBlockHidden(blockC)); + + blockB.outputConnection.disconnect(); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + test('Disconnect Block with Child - Statement', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + var blockC = createRenderedBlock(this.workspace,'stack_block'); + + blockB.nextConnection.connect(blockC.previousConnection); + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + blockA.setCollapsed(true); + assertCollapsed(blockA); + chai.assert.isTrue(isBlockHidden(blockC)); + chai.assert.isTrue(isBlockHidden(blockB)); + + blockB.previousConnection.disconnect(); + chai.assert.isFalse(isBlockHidden(blockB)); + chai.assert.isFalse(isBlockHidden(blockC)); + }); + }); + suite('Adding and Removing Block Parts', function() { + test('Add Previous Connection', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.setPreviousStatement(true); + assertCollapsed(blockA); + chai.assert.isNotNull(blockA.previousConnection); + }); + test('Add Next Connection', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.setNextStatement(true); + assertCollapsed(blockA); + chai.assert.isNotNull(blockA.nextConnection); + }); + test('Add Input', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.appendDummyInput('NAME'); + assertCollapsed(blockA); + chai.assert.isNotNull(blockA.getInput('NAME')); + }); + test('Add Field', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + var input = blockA.appendDummyInput('NAME'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + input.appendField(new Blockly.FieldLabel('test'), 'FIELD'); + assertCollapsed(blockA); + var field = blockA.getField('FIELD'); + chai.assert.isNotNull(field); + chai.assert.equal(field.getText(), 'test'); + }); + test('Add Icon', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.setCommentText('test'); + assertCollapsed(blockA); + }); + test('Remove Previous Connection', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setPreviousStatement(true); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.setPreviousStatement(false); + assertCollapsed(blockA); + chai.assert.isNull(blockA.previousConnection); + }); + test('Remove Next Connection', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setNextStatement(true); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.setNextStatement(false); + assertCollapsed(blockA); + chai.assert.isNull(blockA.nextConnection); + }); + test('Remove Input', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.appendDummyInput('NAME'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.removeInput('NAME'); + assertCollapsed(blockA); + chai.assert.isNull(blockA.getInput('NAME')); + }); + test('Remove Field', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + var input = blockA.appendDummyInput('NAME'); + input.appendField(new Blockly.FieldLabel('test'), 'FIELD'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + input.removeField('FIELD'); + assertCollapsed(blockA); + var field = blockA.getField('FIELD'); + chai.assert.isNull(field); + }); + test('Remove Icon', function() { + var blockA = createRenderedBlock(this.workspace,'empty_block'); + blockA.setCommentText('test'); + blockA.setCollapsed(true); + assertCollapsed(blockA); + blockA.setCommentText(null); + assertCollapsed(blockA); + }); + }); + suite('Renaming Vars', function() { + test('Simple Rename', function() { + var blockA = createRenderedBlock(this.workspace,'variable_block'); + + blockA.setCollapsed(true); + assertCollapsed(blockA, 'x'); + + var variable = this.workspace.getVariable('x', ''); + this.workspace.renameVariableById(variable.getId(), 'y'); + assertCollapsed(blockA, 'y'); + }); + test('Coalesce, Different Case', function() { + var blockA = createRenderedBlock(this.workspace,'variable_block'); + + blockA.setCollapsed(true); + assertCollapsed(blockA, 'x'); + + var variable = this.workspace.createVariable('y'); + this.workspace.renameVariableById(variable.getId(), 'X'); + assertCollapsed(blockA, 'X'); + }); + }); + }); + 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'); + chai.assert.equal(this.block.getColour(), '#a5745b'); + chai.assert.equal(this.block.colour_, this.block.getColour()); + chai.assert.equal(this.block.hue_, '20'); + }); + test('Set style', function() { + this.block.setStyle('styleOne'); + chai.assert.equal(this.block.getStyleName(), 'styleOne'); + chai.assert.isNull(this.block.hue_); + // Calling setStyle does not update the colour on a headless block. + chai.assert.equal(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() { + workspaceTeardown.call(this, this.workspace); + // Clear all registered themes. + Blockly.registry.typeMap_['theme'] = {}; + }); + test('Set colour hue', function() { + this.block.setColour('20'); + chai.assert.equal(this.block.getStyleName(), 'auto_#a5745b'); + chai.assert.equal(this.block.getColour(), '#a5745b'); + chai.assert.equal(this.block.colour_, this.block.getColour()); + chai.assert.equal(this.block.hue_, '20'); + }); + test('Set colour hex', function() { + this.block.setColour('#000000'); + chai.assert.equal(this.block.getStyleName(), 'auto_#000000'); + chai.assert.equal(this.block.getColour(), '#000000'); + chai.assert.equal(this.block.colour_, this.block.getColour()); + chai.assert.isNull(this.block.hue_); + }); + test('Set style', function() { + this.block.setStyle('styleOne'); + chai.assert.equal(this.block.getStyleName(), 'styleOne'); + chai.assert.equal(this.block.getColour(), '#000000'); + chai.assert.equal(this.block.colour_, this.block.getColour()); + }); + }); + }); + suite('toString', function() { + var toStringTests = [ + { + name: 'statement block', + xml: '' + + '' + + '' + + '10' + + '' + + '' + + '', + toString: 'repeat 10 times do ?', + }, + { + name: 'nested statement blocks', + xml: '' + + '' + + '' + + '10' + + '' + + '' + + '' + + '' + + '' + + '', + toString: 'repeat 10 times do if ? do ?', + }, + { + name: 'nested Boolean output blocks', + xml: '' + + '' + + '' + + 'EQ' + + '' + + '' + + 'AND' + + '' + + '' + + '' + + '' + + '', + toString: 'if ((? and ?) = ?) do ?', + }, + { + name: 'output block', + xml: '' + + 'ROOT' + + '' + + '' + + '9' + + '' + + '' + + '', + toString: 'square root 9', + }, + { + name: 'nested Number output blocks', + xml: '' + + 'ADD' + + '' + + '' + + '1' + + '' + + '' + + 'MULTIPLY' + + '' + + '' + + '10' + + '' + + '' + + '' + + '' + + '5' + + '' + + '' + + '' + + '' + + '' + + '' + + '3' + + '' + + '' + + '', + toString: '(10 × 5) + 3', + }, + { + name: 'nested String output blocks', + xml: '' + + '' + + '' + + '' + + 'Hello' + + '' + + '' + + '' + + '' + + 'World' + + '' + + '' + + '', + toString: 'create text with “ Hello ” “ World ”', + }, + ]; + // Create mocha test cases for each toString test. + toStringTests.forEach(function(t) { + test(t.name, function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(t.xml), + this.workspace); + chai.assert.equal(block.toString(), t.toString); + }); + }); + }); + + suite('Initialization', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "init_test_block", + "message0": "" + }, + ]); + }); + test('recordUndo is reset even if init throws', function() { + // The test could pass if init is never called, + // so we assert init was called to be safe. + var initCalled = false; + var recordUndoDuringInit; + Blockly.Blocks['init_test_block'].init = function() { + initCalled = true; + recordUndoDuringInit = Blockly.Events.recordUndo; + throw new Error(); + }; + chai.assert.throws(function() { + this.workspace.newBlock('init_test_block'); + }.bind(this)); + chai.assert.isFalse(recordUndoDuringInit, + 'recordUndo should be false during block init function'); + chai.assert.isTrue(Blockly.Events.recordUndo, + 'recordUndo should be reset to true after init'); + chai.assert.isTrue(initCalled, 'expected init function to be called'); + }); + }); +}); diff --git a/static/js/tests/mocha/comment_test.js b/static/js/tests/mocha/comment_test.js new file mode 100644 index 0000000..5cedf67 --- /dev/null +++ b/static/js/tests/mocha/comment_test.js @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Comments', function() { + setup(function() { + sharedTestSetup.call(this); + 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() { + sharedTestTeardown.call(this); + }); + suite('Visibility and Editability', function() { + setup(function() { + this.block.setCommentText('test text'); + }); + + 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); + assertEventFired( + this.eventsFireStub, Blockly.Events.BubbleOpen, + {bubbleType: 'comment', isOpen: true}, this.workspace.id, + this.block.id); + }); + test('Not Editable', function() { + sinon.stub(this.block, 'isEditable').returns(false); + + // TODO(#4186): Remove stubbing of deprecation warning after fixing. + var deprecationWarnStub = createDeprecationWarningStub(); + this.comment.setVisible(true); + deprecationWarnStub.restore(); + + chai.assert.isTrue(this.comment.isVisible()); + assertNotEditable(this.comment); + assertEventFired( + this.eventsFireStub, Blockly.Events.BubbleOpen, + {bubbleType: 'comment', isOpen: true}, this.workspace.id, + this.block.id); + }); + test('Editable -> Not Editable', function() { + this.comment.setVisible(true); + sinon.stub(this.block, 'isEditable').returns(false); + + // TODO(#4186): Remove stubbing of deprecation warning after fixing. + var deprecationWarnStub = createDeprecationWarningStub(); + this.comment.updateEditable(); + deprecationWarnStub.restore(); + + chai.assert.isTrue(this.comment.isVisible()); + assertNotEditable(this.comment); + assertEventFired( + this.eventsFireStub, Blockly.Events.BubbleOpen, + {bubbleType: 'comment', isOpen: true}, this.workspace.id, + this.block.id); + }); + test('Not Editable -> Editable', function() { + var editableStub = sinon.stub(this.block, 'isEditable').returns(false); + + // TODO(#4186): Remove stubbing of deprecation warning after fixing. + var deprecationWarnStub = createDeprecationWarningStub(); + this.comment.setVisible(true); + deprecationWarnStub.restore(); + + editableStub.returns(true); + + this.comment.updateEditable(); + chai.assert.isTrue(this.comment.isVisible()); + assertEditable(this.comment); + assertEventFired( + this.eventsFireStub, Blockly.Events.BubbleOpen, + {bubbleType: 'comment', isOpen: true}, this.workspace.id, + this.block.id); + }); + }); + suite('Set/Get Bubble Size', function() { + teardown(function() { + sinon.restore(); + }); + 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); + sinon.assert.calledOnce(bubbleSizeSpy); + + this.comment.setVisible(false); + assertBubbleSize(this.comment, 100, 100); + }); + 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/static/js/tests/mocha/connection_checker_test.js b/static/js/tests/mocha/connection_checker_test.js new file mode 100644 index 0000000..cb6b126 --- /dev/null +++ b/static/js/tests/mocha/connection_checker_test.js @@ -0,0 +1,270 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Connection checker', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + suiteSetup(function() { + this.checker = new Blockly.ConnectionChecker(); + }); + suite('Safety checks', function() { + function assertReasonHelper(checker, one, two, reason) { + chai.assert.equal(checker.canConnectWithReason(one, two), reason); + // Order should not matter. + chai.assert.equal(checker.canConnectWithReason(two, one), reason); + } + + test('Target Null', function() { + var connection = new Blockly.Connection({}, Blockly.INPUT_VALUE); + assertReasonHelper( + this.checker, + connection, + 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); + + assertReasonHelper( + this.checker, + connection1, + 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); + + assertReasonHelper( + this.checker, + connection1, + 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() { + assertReasonHelper( + this.checker, + this.previous, + this.next, + Blockly.Connection.CAN_CONNECT); + }); + test('Previous, Output', function() { + assertReasonHelper( + this.checker, + this.previous, + this.output, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Previous, Input', function() { + assertReasonHelper( + this.checker, + this.previous, + this.input, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Next, Previous', function() { + assertReasonHelper( + this.checker, + this.next, + this.previous, + Blockly.Connection.CAN_CONNECT); + }); + test('Next, Output', function() { + assertReasonHelper( + this.checker, + this.next, + this.output, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Next, Input', function() { + assertReasonHelper( + this.checker, + this.next, + this.input, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Output, Previous', function() { + assertReasonHelper( + this.checker, + this.previous, + this.output, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Output, Next', function() { + assertReasonHelper( + this.checker, + this.output, + this.next, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Output, Input', function() { + assertReasonHelper( + this.checker, + this.output, + this.input, + Blockly.Connection.CAN_CONNECT); + }); + test('Input, Previous', function() { + assertReasonHelper( + this.checker, + this.previous, + this.input, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Input, Next', function() { + assertReasonHelper( + this.checker, + this.input, + this.next, + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Input, Output', function() { + assertReasonHelper( + this.checker, + this.input, + 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); + + assertReasonHelper( + this.checker, + prev, + 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); + + assertReasonHelper( + this.checker, + prev, + 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); + + assertReasonHelper( + this.checker, + prev, + 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); + + assertReasonHelper( + this.checker, + outCon, + 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); + + assertReasonHelper( + this.checker, + outCon, + 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); + + assertReasonHelper( + this.checker, + outCon, + 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); + }); + function assertCheckTypes(checker, one, two) { + chai.assert.isTrue(checker.doTypeChecks(one, two)); + // Order should not matter. + chai.assert.isTrue(checker.doTypeChecks(one, two)); + } + test('No Types', function() { + assertCheckTypes(this.checker, this.con1, this.con2); + }); + test('Same Type', function() { + this.con1.setCheck('type1'); + this.con2.setCheck('type1'); + assertCheckTypes(this.checker, this.con1, this.con2); + }); + test('Same Types', function() { + this.con1.setCheck(['type1', 'type2']); + this.con2.setCheck(['type1', 'type2']); + assertCheckTypes(this.checker, this.con1, this.con2); + }); + test('Single Same Type', function() { + this.con1.setCheck(['type1', 'type2']); + this.con2.setCheck(['type1', 'type3']); + assertCheckTypes(this.checker, this.con1, this.con2); + }); + test('One Typed, One Promiscuous', function() { + this.con1.setCheck('type1'); + assertCheckTypes(this.checker, this.con1, this.con2); + }); + test('No Compatible Types', function() { + this.con1.setCheck('type1'); + this.con2.setCheck('type2'); + chai.assert.isFalse(this.checker.doTypeChecks(this.con1, this.con2)); + }); + }); +}); diff --git a/static/js/tests/mocha/connection_db_test.js b/static/js/tests/mocha/connection_db_test.js new file mode 100644 index 0000000..d05c7ba --- /dev/null +++ b/static/js/tests/mocha/connection_db_test.js @@ -0,0 +1,266 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Connection Database', function() { + setup(function() { + sharedTestSetup.call(this); + this.database = new Blockly.ConnectionDB(new Blockly.ConnectionChecker()); + + 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); + } + }; + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + 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(); + }); + }); + + suite('Search For Closest', function() { + setup(function() { + // Ignore type checks. + sinon.stub(this.database.connectionChecker_, 'doTypeChecks') + .returns(true); + // Ignore safety checks. + sinon.stub(this.database.connectionChecker_, 'doSafetyChecks') + .returns(Blockly.Connection.CAN_CONNECT); + // Skip everything but the distance checks. + sinon.stub(this.database.connectionChecker_, 'doDragChecks') + .callsFake(function(a, b, distance) { + return a.distanceFrom(b) <= distance; + }); + + this.createCheckConnection = function(x, y) { + var checkConnection = this.createConnection(x, y, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + return checkConnection; + }; + }); + 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/static/js/tests/mocha/connection_test.js b/static/js/tests/mocha/connection_test.js new file mode 100644 index 0000000..73882b9 --- /dev/null +++ b/static/js/tests/mocha/connection_test.js @@ -0,0 +1,787 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Connection', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = sinon.createStubInstance(Blockly.Workspace); + this.workspace.connectionChecker = new Blockly.ConnectionChecker(); + this.createConnection = function(type) { + var block = { + workspace: this.workspace, + isShadow: function() { return false; } + }; + var connection = new Blockly.Connection(block, type); + return connection; + }; + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + test('Deprecated - canConnectWithReason passes', function() { + var deprecateWarnSpy = createDeprecationWarningStub(); + var conn1 = this.createConnection(Blockly.PREVIOUS_STATEMENT); + var conn2 = this.createConnection(Blockly.NEXT_STATEMENT); + chai.assert.equal(conn1.canConnectWithReason(conn2), + Blockly.Connection.CAN_CONNECT); + assertSingleDeprecationWarningCall(deprecateWarnSpy, + 'Connection.prototype.canConnectWithReason'); + }); + + test('Deprecated - canConnectWithReason fails', function() { + var deprecateWarnSpy = createDeprecationWarningStub(); + var conn1 = this.createConnection(Blockly.PREVIOUS_STATEMENT); + var conn2 = this.createConnection(Blockly.OUTPUT_VALUE); + chai.assert.equal(conn1.canConnectWithReason(conn2), + Blockly.Connection.REASON_WRONG_TYPE); + assertSingleDeprecationWarningCall(deprecateWarnSpy, + 'Connection.prototype.canConnectWithReason'); + }); + + test('Deprecated - checkConnection passes', function() { + var deprecateWarnSpy = createDeprecationWarningStub(); + var conn1 = this.createConnection(Blockly.PREVIOUS_STATEMENT); + var conn2 = this.createConnection(Blockly.NEXT_STATEMENT); + chai.assert.doesNotThrow(function() { + conn1.checkConnection(conn2); + }); + assertSingleDeprecationWarningCall(deprecateWarnSpy, + 'Connection.prototype.checkConnection'); + }); + + test('Deprecated - checkConnection fails', function() { + var deprecateWarnSpy = createDeprecationWarningStub(); + var conn1 = this.createConnection(Blockly.PREVIOUS_STATEMENT); + var conn2 = this.createConnection(Blockly.OUTPUT_VALUE); + chai.assert.throws(function() { + conn1.checkConnection(conn2); + }); + assertSingleDeprecationWarningCall(deprecateWarnSpy, + 'Connection.prototype.checkConnection'); + }); + + suite('Set Shadow Dom', function() { + + function assertBlockMatches(block, isShadow, opt_id) { + chai.assert.equal(block.isShadow(), isShadow, + `expected block ${block.id} to ${isShadow ? '' : 'not'} be a shadow`); + if (opt_id) { + chai.assert.equal(block.id, opt_id); + } + } + + function assertInputHasBlock(parent, inputName, isShadow, opt_name) { + var block = parent.getInputTargetBlock(inputName); + chai.assert.exists(block, + `expected block ${opt_name || ''} to be attached to ${inputName}`); + assertBlockMatches(block, isShadow, opt_name); + } + + function assertNextHasBlock(parent, isShadow, opt_name) { + var block = parent.getNextBlock(); + chai.assert.exists(block, + `expected block ${opt_name || ''} to be attached to next connection`); + assertBlockMatches(block, isShadow, opt_name); + } + + function assertInputNotHasBlock(parent, inputName) { + var block = parent.getInputTargetBlock(inputName); + chai.assert.notExists(block, + `expected block ${block && block.id} to not be attached to ${inputName}`); + } + + function assertNextNotHasBlock(parent) { + var block = parent.getNextBlock(); + chai.assert.notExists(block, + `expected block ${block && block.id} to not be attached to next connection`); + } + + var testSuites = [ + { + title: 'Rendered', + createWorkspace: () => { + return Blockly.inject('blocklyDiv'); + }, + }, + { + title: 'Headless', + createWorkspace: () => { + return new Blockly.Workspace(); + }, + } + ]; + + testSuites.forEach((testSuite) => { + // Create a suite for each suite. + suite(testSuite.title, function() { + setup(function() { + this.workspace = testSuite.createWorkspace(); + + Blockly.defineBlocksWithJsonArray([ + { + "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() { + workspaceTeardown.call(this, this.workspace); + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + }); + + suite('Add - No Block Connected', function() { + // These are defined separately in each suite. + function createRowBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + function createStatementBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + function createStackBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + test('Value', function() { + var parent = createRowBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true); + }); + + test('Multiple Value', function() { + var parent = createRowBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true); + assertInputHasBlock( + parent.getInputTargetBlock('INPUT'), 'INPUT', true); + }); + + test('Statement', function() { + var parent = createStatementBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true); + }); + + test('Multiple Statement', function() { + var parent = createStatementBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true); + assertInputHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT', true); + }); + + test('Next', function() { + var parent = createStackBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true); + }); + + test('Multiple Next', function() { + var parent = createStackBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true); + assertNextHasBlock(parent.getNextBlock(), true); + }); + }); + + suite('Add - With Block Connected', function() { + // These are defined separately in each suite. + function createRowBlocks(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + function createStatementBlocks(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + function createStackBlocks(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + test('Value', function() { + var parent = createRowBlocks(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', false); + parent.getInput('INPUT').connection.disconnect(); + assertInputHasBlock(parent, 'INPUT', true); + }); + + test('Multiple Value', function() { + var parent = createRowBlocks(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', false); + assertInputNotHasBlock(parent.getInputTargetBlock('INPUT'), 'INPUT'); + parent.getInput('INPUT').connection.disconnect(); + assertInputHasBlock(parent, 'INPUT', true); + assertInputHasBlock( + parent.getInputTargetBlock('INPUT'), 'INPUT', true); + }); + + test('Statement', function() { + var parent = createStatementBlocks(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', false); + parent.getInput('STATEMENT').connection.disconnect(); + assertInputHasBlock(parent, 'STATEMENT', true); + }); + + test('Multiple Statement', function() { + var parent = createStatementBlocks(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', false); + assertInputNotHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT'); + parent.getInput('STATEMENT').connection.disconnect(); + assertInputHasBlock(parent, 'STATEMENT', true); + assertInputHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT', true); + }); + + test('Next', function() { + var parent = createStackBlocks(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, false); + parent.nextConnection.disconnect(); + assertNextHasBlock(parent, true); + }); + + test('Multiple Next', function() { + var parent = createStackBlocks(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, false); + assertNextNotHasBlock(parent.getNextBlock()); + parent.nextConnection.disconnect(); + assertNextHasBlock(parent, true); + assertNextHasBlock(parent.getNextBlock(), true); + }); + }); + + suite('Add - With Shadow Connected', function() { + // These are defined separately in each suite. + function createRowBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + function createStatementBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + function createStackBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + test('Value', function() { + var parent = createRowBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true, '1'); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true, '2'); + }); + + test('Multiple Value', function() { + var parent = createRowBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true, '1'); + assertInputHasBlock( + parent.getInputTargetBlock('INPUT'), 'INPUT', true, 'a'); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true, '2'); + assertInputHasBlock( + parent.getInputTargetBlock('INPUT'), 'INPUT', true, 'b'); + }); + + test('Statement', function() { + var parent = createStatementBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true, '1'); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true, '2'); + }); + + test('Multiple Statement', function() { + var parent = createStatementBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true, '1'); + assertInputHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT', true, 'a'); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true, '2'); + assertInputHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT', true, 'b'); + }); + + test('Next', function() { + var parent = createStackBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true, '1'); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true, '2'); + }); + + test('Multiple Next', function() { + var parent = createStackBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true, '1'); + assertNextHasBlock(parent.getNextBlock(), true, 'a'); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true, '2'); + assertNextHasBlock(parent.getNextBlock(), true, 'b'); + }); + }); + + suite('Remove - No Block Connected', function() { + // These are defined separately in each suite. + function createRowBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + function createStatementBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + function createStackBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + test('Value', function() { + var parent = createRowBlock(this.workspace); + parent.getInput('INPUT').connection.setShadowDom(null); + assertInputNotHasBlock(parent, 'INPUT'); + }); + + test('Statement', function() { + var parent = createStatementBlock(this.workspace); + parent.getInput('STATEMENT').connection.setShadowDom(null); + assertInputNotHasBlock(parent, 'STATMENT'); + }); + + test('Next', function() { + var parent = createStackBlock(this.workspace); + parent.nextConnection.setShadowDom(null); + assertNextNotHasBlock(parent); + }); + }); + + suite('Remove - Block Connected', function() { + // These are defined separately in each suite. + function createRowBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + function createStatementBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + function createStackBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), workspace); + return block; + } + + test('Value', function() { + var parent = createRowBlock(this.workspace); + parent.getInput('INPUT').connection.setShadowDom(null); + assertInputHasBlock(parent, 'INPUT', false); + parent.getInput('INPUT').connection.disconnect(); + assertInputNotHasBlock(parent, 'INPUT'); + }); + + test('Statement', function() { + var parent = createStatementBlock(this.workspace); + parent.getInput('STATEMENT').connection.setShadowDom(null); + assertInputHasBlock(parent, 'STATEMENT', false); + parent.getInput('STATEMENT').connection.disconnect(); + assertInputNotHasBlock(parent, 'STATEMENT'); + }); + + test('Next', function() { + var parent = createStackBlock(this.workspace); + parent.nextConnection.setShadowDom(null); + assertNextHasBlock(parent, false); + parent.nextConnection.disconnect(); + assertNextNotHasBlock(parent); + }); + }); + + suite('Add - Connect & Disconnect - Remove', function() { + // These are defined separately in each suite. + function createRowBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + function createStatementBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + function createStackBlock(workspace) { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + return block; + } + + test('Value', function() { + var parent = createRowBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true); + var child = createRowBlock(this.workspace); + parent.getInput('INPUT').connection.connect(child.outputConnection); + assertInputHasBlock(parent, 'INPUT', false); + parent.getInput('INPUT').connection.disconnect(); + assertInputHasBlock(parent, 'INPUT', true); + parent.getInput('INPUT').connection.setShadowDom(null); + assertInputNotHasBlock(parent, 'INPUT'); + }); + + test('Multiple Value', function() { + var parent = createRowBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('INPUT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'INPUT', true); + assertInputHasBlock( + parent.getInputTargetBlock('INPUT'), 'INPUT', true); + var child = createRowBlock(this.workspace); + parent.getInput('INPUT').connection.connect(child.outputConnection); + assertInputHasBlock(parent, 'INPUT', false); + parent.getInput('INPUT').connection.disconnect(); + assertInputHasBlock(parent, 'INPUT', true); + assertInputHasBlock( + parent.getInputTargetBlock('INPUT'), 'INPUT', true); + parent.getInput('INPUT').connection.setShadowDom(null); + assertInputNotHasBlock(parent, 'INPUT'); + }); + + test('Statement', function() { + var parent = createStatementBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true); + var child = createStatementBlock(this.workspace); + parent.getInput('STATEMENT').connection + .connect(child.previousConnection); + assertInputHasBlock(parent, 'STATEMENT', false); + parent.getInput('STATEMENT').connection.disconnect(); + assertInputHasBlock(parent, 'STATEMENT', true); + parent.getInput('STATEMENT').connection.setShadowDom(null); + assertInputNotHasBlock(parent, 'STATEMENT'); + }); + + test('Multiple Statement', function() { + var parent = createStatementBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.getInput('STATEMENT').connection.setShadowDom(xml); + assertInputHasBlock(parent, 'STATEMENT', true); + assertInputHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT', true); + var child = createStatementBlock(this.workspace); + parent.getInput('STATEMENT').connection + .connect(child.previousConnection); + assertInputHasBlock(parent, 'STATEMENT', false); + parent.getInput('STATEMENT').connection.disconnect(); + assertInputHasBlock(parent, 'STATEMENT', true); + assertInputHasBlock( + parent.getInputTargetBlock('STATEMENT'), 'STATEMENT', true); + parent.getInput('STATEMENT').connection.setShadowDom(null); + assertInputNotHasBlock(parent, 'STATEMENT'); + }); + + test('Next', function() { + var parent = createStackBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true); + var child = createStatementBlock(this.workspace); + parent.nextConnection.connect(child.previousConnection); + assertNextHasBlock(parent, false); + parent.nextConnection.disconnect(); + assertNextHasBlock(parent, true); + parent.nextConnection.setShadowDom(null); + assertNextNotHasBlock(parent); + }); + + test('Multiple Next', function() { + var parent = createStackBlock(this.workspace); + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + parent.nextConnection.setShadowDom(xml); + assertNextHasBlock(parent, true); + assertNextHasBlock(parent.getNextBlock(), true); + var child = createStatementBlock(this.workspace); + parent.nextConnection.connect(child.previousConnection); + assertNextHasBlock(parent, false); + parent.nextConnection.disconnect(); + assertNextHasBlock(parent, true); + assertNextHasBlock(parent.getNextBlock(), true); + parent.nextConnection.setShadowDom(null); + assertNextNotHasBlock(parent); + }); + }); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/contextmenu_items_test.js b/static/js/tests/mocha/contextmenu_items_test.js new file mode 100644 index 0000000..387e708 --- /dev/null +++ b/static/js/tests/mocha/contextmenu_items_test.js @@ -0,0 +1,407 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Context Menu Items', function() { + setup(function() { + sharedTestSetup.call(this); + + // Creates a WorkspaceSVG + var toolbox = document.getElementById('toolbox-categories'); + this.workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + + // Declare a new registry to ensure default options are called. + new Blockly.ContextMenuRegistry(); + this.registry = Blockly.ContextMenuRegistry.registry; + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Workspace Items', function() { + setup(function() { + this.scope = {workspace: this.workspace}; + }); + + suite('undo', function() { + setup(function() { + this.undoOption = this.registry.getItem('undoWorkspace'); + }); + + test('Disabled when nothing to undo', function() { + var precondition = this.undoOption.preconditionFn(this.scope); + chai.assert.equal(precondition, 'disabled', + 'Should be disabled when there is nothing to undo'); + }); + + test('Enabled when something to undo', function() { + // Create a new block, which should be undoable. + this.workspace.newBlock('text'); + var precondition = this.undoOption.preconditionFn(this.scope); + chai.assert.equal(precondition, 'enabled', + 'Should be enabled when there are actions to undo'); + }); + + test('Undoes adding a new block', function() { + this.workspace.newBlock('text'); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 1); + this.undoOption.callback(this.scope); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0, + 'Should be no blocks after undo'); + }); + + test('Has correct label', function() { + chai.assert.equal(this.undoOption.displayText(), 'Undo'); + }); + }); + + suite('Redo', function() { + setup(function() { + this.redoOption = this.registry.getItem('redoWorkspace'); + }); + + test('Disabled when nothing to redo', function() { + // Create a new block. There should be something to undo, but not redo. + this.workspace.newBlock('text'); + var precondition = this.redoOption.preconditionFn(this.scope); + chai.assert.equal(precondition, 'disabled', + 'Should be disabled when there is nothing to redo'); + }); + + test('Enabled when something to redo', function() { + // Create a new block, then undo it, which means there is something to redo. + this.workspace.newBlock('text'); + this.workspace.undo(false); + var precondition = this.redoOption.preconditionFn(this.scope); + chai.assert.equal(precondition, 'enabled', + 'Should be enabled when there are actions to redo'); + }); + + test('Redoes adding new block', function() { + // Add a new block, then undo it, then redo it. + this.workspace.newBlock('text'); + this.workspace.undo(false); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0); + this.redoOption.callback(this.scope); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 1, + 'Should be 1 block after redo'); + }); + + test('Has correct label', function() { + chai.assert.equal(this.redoOption.displayText(), 'Redo'); + }); + }); + + suite('Cleanup', function() { + setup(function() { + this.cleanupOption = this.registry.getItem('cleanWorkspace'); + this.cleanupStub = sinon.stub(this.workspace, 'cleanUp'); + }); + + test('Enabled when multiple blocks', function() { + this.workspace.newBlock('text'); + this.workspace.newBlock('text'); + chai.assert.equal(this.cleanupOption.preconditionFn(this.scope), 'enabled', + 'Should be enabled if there are multiple blocks'); + }); + + test('Disabled when no blocks', function() { + chai.assert.equal(this.cleanupOption.preconditionFn(this.scope), 'disabled', + 'Should be disabled if there are no blocks'); + }); + + test('Hidden when not movable', function() { + sinon.stub(this.workspace, 'isMovable').returns(false); + chai.assert.equal(this.cleanupOption.preconditionFn(this.scope), 'hidden', + 'Should be hidden if the workspace is not movable'); + }); + + test('Calls workspace cleanup', function() { + this.cleanupOption.callback(this.scope); + sinon.assert.calledOnce(this.cleanupStub); + }); + + test('Has correct label', function() { + chai.assert.equal(this.cleanupOption.displayText(), 'Clean up Blocks'); + }); + }); + + suite('Collapse', function() { + setup(function() { + this.collapseOption = this.registry.getItem('collapseWorkspace'); + }); + + test('Enabled when uncollapsed blocks', function() { + this.workspace.newBlock('text'); + var block2 = this.workspace.newBlock('text'); + block2.setCollapsed(true); + chai.assert.equal(this.collapseOption.preconditionFn(this.scope), 'enabled', + 'Should be enabled when any blocks are expanded'); + }); + + test('Disabled when all blocks collapsed', function() { + this.workspace.newBlock('text').setCollapsed(true); + chai.assert.equal(this.collapseOption.preconditionFn(this.scope), 'disabled', + 'Should be disabled when no blocks are expanded'); + }); + + test('Hidden when no collapse option', function() { + var workspaceWithOptions = new Blockly.Workspace(new Blockly.Options({collapse: false})); + this.scope.workspace = workspaceWithOptions; + + try { + chai.assert.equal(this.collapseOption.preconditionFn(this.scope), 'hidden', + 'Should be hidden if collapse is disabled in options'); + } finally { + workspaceTeardown.call(this, workspaceWithOptions); + } + }); + + test('Collapses all blocks', function() { + // All blocks should be collapsed, even if some already were. + var block1 = this.workspace.newBlock('text'); + var block2 = this.workspace.newBlock('text'); + // Need to render block to properly collapse it. + block1.initSvg(); + block1.render(); + block1.setCollapsed(true); + + this.collapseOption.callback(this.scope); + this.clock.runAll(); + + chai.assert.isTrue(block1.isCollapsed(), + 'Previously collapsed block should still be collapsed'); + chai.assert.isTrue(block2.isCollapsed(), + 'Previously expanded block should now be collapsed'); + }); + + test('Has correct label', function() { + chai.assert.equal(this.collapseOption.displayText(), 'Collapse Blocks'); + }); + }); + + suite('Expand', function() { + setup(function() { + this.expandOption = this.registry.getItem('expandWorkspace'); + }); + + test('Enabled when collapsed blocks', function() { + this.workspace.newBlock('text'); + var block2 = this.workspace.newBlock('text'); + block2.setCollapsed(true); + + chai.assert.equal(this.expandOption.preconditionFn(this.scope), 'enabled', + 'Should be enabled when any blocks are collapsed'); + }); + + test('Disabled when no collapsed blocks', function() { + this.workspace.newBlock('text'); + chai.assert.equal(this.expandOption.preconditionFn(this.scope), 'disabled', + 'Should be disabled when no blocks are collapsed'); + }); + + test('Hidden when no collapse option', function() { + var workspaceWithOptions = new Blockly.Workspace(new Blockly.Options({collapse: false})); + this.scope.workspace = workspaceWithOptions; + + try { + chai.assert.equal(this.expandOption.preconditionFn(this.scope), 'hidden', + 'Should be hidden if collapse is disabled in options'); + } finally { + workspaceTeardown.call(this, workspaceWithOptions); + } + }); + + test('Expands all blocks', function() { + // All blocks should be expanded, even if some already were. + var block1 = this.workspace.newBlock('text'); + var block2 = this.workspace.newBlock('text'); + // Need to render block to properly collapse it. + block2.initSvg(); + block2.render(); + block2.setCollapsed(true); + + this.expandOption.callback(this.scope); + this.clock.runAll(); + + chai.assert.isFalse(block1.isCollapsed(), + 'Previously expanded block should still be expanded'); + chai.assert.isFalse(block2.isCollapsed(), + 'Previously collapsed block should now be expanded'); + }); + + test('Has correct label', function() { + chai.assert.equal(this.expandOption.displayText(), 'Expand Blocks'); + }); + }); + + suite('Delete', function() { + setup(function() { + this.deleteOption = this.registry.getItem('workspaceDelete'); + }); + + test('Enabled when blocks to delete', function() { + this.workspace.newBlock('text'); + chai.assert.equal(this.deleteOption.preconditionFn(this.scope), 'enabled'); + }); + + test('Disabled when no blocks to delete', function() { + chai.assert.equal(this.deleteOption.preconditionFn(this.scope), 'disabled'); + }); + + test('Deletes all blocks after confirming', function() { + // Mocks the confirmation dialog and calls the callback with 'true' simulating ok. + var confirmStub = sinon.stub(Blockly, 'confirm').callsArgWith(1, true); + + this.workspace.newBlock('text'); + this.workspace.newBlock('text'); + this.deleteOption.callback(this.scope); + this.clock.runAll(); + sinon.assert.calledOnce(confirmStub); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0); + }); + + test('Does not delete blocks if not confirmed', function() { + // Mocks the confirmation dialog and calls the callback with 'false' simulating cancel. + var confirmStub = sinon.stub(Blockly, 'confirm').callsArgWith(1, false); + + this.workspace.newBlock('text'); + this.workspace.newBlock('text'); + this.deleteOption.callback(this.scope); + this.clock.runAll(); + sinon.assert.calledOnce(confirmStub); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 2); + }); + + test('No dialog for single block', function() { + var confirmStub = sinon.stub(Blockly, 'confirm'); + this.workspace.newBlock('text'); + this.deleteOption.callback(this.scope); + this.clock.runAll(); + + sinon.assert.notCalled(confirmStub); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0); + }); + + test('Has correct label for multiple blocks', function() { + this.workspace.newBlock('text'); + this.workspace.newBlock('text'); + + chai.assert.equal(this.deleteOption.displayText(this.scope), 'Delete 2 Blocks'); + }); + + test('Has correct label for single block', function() { + this.workspace.newBlock('text'); + chai.assert.equal(this.deleteOption.displayText(this.scope), 'Delete Block'); + }); + }); + }); + + suite('Block Items', function() { + setup(function() { + this.block = this.workspace.newBlock('text'); + this.scope = {block: this.block}; + }); + + suite('Duplicate', function() { + setup(function() { + this.duplicateOption = this.registry.getItem('blockDuplicate'); + }); + + test('Enabled when block is duplicatable', function() { + // Block is duplicatable by default + chai.assert.equal(this.duplicateOption.preconditionFn(this.scope), 'enabled'); + }); + + test('Disabled when block is not dupicatable', function() { + sinon.stub(this.block, 'isDuplicatable').returns(false); + chai.assert.equal(this.duplicateOption.preconditionFn(this.scope), 'disabled'); + }); + + test('Hidden when in flyout', function() { + this.block.isInFlyout = true; + chai.assert.equal(this.duplicateOption.preconditionFn(this.scope), 'hidden'); + }); + + test('Calls duplicate', function() { + var stub = sinon.stub(Blockly, 'duplicate'); + + this.duplicateOption.callback(this.scope); + + sinon.assert.calledOnce(stub); + sinon.assert.calledWith(stub, this.block); + }); + + test('Has correct label', function() { + chai.assert.equal(this.duplicateOption.displayText(), 'Duplicate'); + }); + }); + + suite('Comment', function() { + setup(function() { + this.commentOption = this.registry.getItem('blockComment'); + }); + + test('Enabled for normal block', function() { + chai.assert.equal(this.commentOption.preconditionFn(this.scope), 'enabled'); + }); + + test('Hidden for IE', function() { + var oldState = Blockly.utils.userAgent.IE; + try { + Blockly.utils.userAgent.IE = true; + chai.assert.equal(this.commentOption.preconditionFn(this.scope), 'hidden'); + } finally { + Blockly.utils.userAgent.IE = oldState; + } + }); + + test('Hidden for collapsed block', function() { + // Must render block to collapse it properly. + this.block.initSvg(); + this.block.render(); + this.block.setCollapsed(true); + + chai.assert.equal(this.commentOption.preconditionFn(this.scope), 'hidden'); + }); + + test('Creates comment if one did not exist', function() { + chai.assert.isNull(this.block.getCommentIcon(), 'New block should not have a comment'); + this.commentOption.callback(this.scope); + chai.assert.exists(this.block.getCommentIcon()); + chai.assert.isEmpty(this.block.getCommentText(), 'Block should have empty comment text'); + }); + + test('Removes comment if block had one', function() { + this.block.setCommentText('Test comment'); + this.commentOption.callback(this.scope); + chai.assert.isNull(this.block.getCommentText(), + 'Block should not have comment after removal'); + }); + + test('Has correct label for add comment', function() { + chai.assert.equal(this.commentOption.displayText(this.scope), 'Add Comment'); + }); + + test('Has correct label for remove comment', function() { + this.block.setCommentText('Test comment'); + chai.assert.equal(this.commentOption.displayText(this.scope), 'Remove Comment'); + }); + }); + + suite('Inline Variables', function() { + setup(function() { + this.inlineOption = this.registry.getItem('blockInline'); + }); + + test('Enabled when inputs to inline', function() { + this.block.appendValueInput('test1'); + this.block.appendValueInput('test2'); + chai.assert.equal(this.inlineOption.preconditionFn(this.scope), 'enabled'); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/cursor_test.js b/static/js/tests/mocha/cursor_test.js new file mode 100644 index 0000000..f689526 --- /dev/null +++ b/static/js/tests/mocha/cursor_test.js @@ -0,0 +1,120 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Cursor', function() { + setup(function() { + sharedTestSetup.call(this); + 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() { + sharedTestTeardown.call(this); + }); + + 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(); + chai.assert.equal(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(); + chai.assert.equal(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(); + chai.assert.equal(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(); + chai.assert.equal(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(); + chai.assert.equal(curNode.getLocation(), this.blocks.E.outputConnection); + }); +}); diff --git a/static/js/tests/mocha/dropdowndiv_test.js b/static/js/tests/mocha/dropdowndiv_test.js new file mode 100644 index 0000000..c51c83d --- /dev/null +++ b/static/js/tests/mocha/dropdowndiv_test.js @@ -0,0 +1,75 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('DropDownDiv', function() { + suite('Positioning', function() { + setup(function() { + sharedTestSetup.call(this); + 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() { + sharedTestTeardown.call(this); + }); + 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/static/js/tests/mocha/event_test.js b/static/js/tests/mocha/event_test.js new file mode 100644 index 0000000..725e9e4 --- /dev/null +++ b/static/js/tests/mocha/event_test.js @@ -0,0 +1,1196 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Events', function() { + setup(function() { + sharedTestSetup.call(this, {fireEventsNow: false}); + this.eventsFireSpy = sinon.spy(Blockly.Events, 'fire'); + 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() { + sharedTestTeardown.call(this); + }); + + function createSimpleTestBlock(workspace) { + // Disable events while constructing the block: this is a test of the + // Blockly.Event constructors, not the block constructors. + // Set the group id to avoid an extra call to genUid. + Blockly.Events.disable(); + try { + Blockly.Events.setGroup('unused'); + var block = new Blockly.Block( + workspace, 'simple_test_block'); + } finally { + Blockly.Events.setGroup(false); + } + Blockly.Events.enable(); + return block; + } + + suite('Constructors', function() { + test('Abstract', function() { + var event = new Blockly.Events.Abstract(); + assertEventEquals(event, undefined, undefined, undefined, { + 'recordUndo': true, + 'group': '' + }); + }); + + test('UI event without block', function() { + var event = new Blockly.Events.UiBase(this.workspace.id); + assertEventEquals(event, undefined, this.workspace.id, undefined, { + 'recordUndo': false, + 'group': '', + }, true); + }); + + test('Click without block', function() { + var event = new Blockly.Events.Click(null, this.workspace.id, 'workspace'); + assertEventEquals(event, Blockly.Events.CLICK, this.workspace.id, null, { + 'targetType': 'workspace', + 'recordUndo': false, + 'group': '' + }, true); + }); + + test('Old UI event without block', function() { + var TEST_GROUP_ID = 'testGroup'; + Blockly.Events.setGroup(TEST_GROUP_ID); + var event = new Blockly.Events.Ui(null, 'foo', 'bar', 'baz'); + assertEventEquals(event, Blockly.Events.UI, '', null, { + 'element': 'foo', + 'oldValue': 'bar', + 'newValue': 'baz', + 'recordUndo': false, + 'group': TEST_GROUP_ID + }, true); + }); + + suite('With simple blocks', function() { + setup(function() { + this.TEST_BLOCK_ID = 'test_block_id'; + this.TEST_PARENT_ID = 'parent'; + // genUid is expected to be called either once or twice in this suite. + this.genUidStub = createGenUidStubWithReturns( + [this.TEST_BLOCK_ID, this.TEST_PARENT_ID]); + this.block = createSimpleTestBlock(this.workspace); + }); + + test('Block base', function() { + var event = new Blockly.Events.BlockBase(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, undefined, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'varId': undefined, + 'recordUndo': true, + 'group': '', + }); + }); + + test('Create', function() { + var event = new Blockly.Events.Create(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.CREATE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': true, + 'group': '', + }); + }); + + test('Block create', function() { + var event = new Blockly.Events.BlockCreate(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.CREATE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': true, + 'group': '', + }); + }); + + test('Delete', function() { + var event = new Blockly.Events.Delete(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.DELETE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': true, + 'group': '', + }); + }); + + test('Block delete', function() { + var event = new Blockly.Events.BlockDelete(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.DELETE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': true, + 'group': '', + }); + }); + + test('Old UI event with block', function() { + var TEST_GROUP_ID = 'testGroup'; + Blockly.Events.setGroup(TEST_GROUP_ID); + var event = new Blockly.Events.Ui(this.block, 'foo', 'bar', 'baz'); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.UI, this.workspace.id, + this.TEST_BLOCK_ID, + { + 'element': 'foo', + 'oldValue': 'bar', + 'newValue': 'baz', + 'recordUndo': false, + 'group': TEST_GROUP_ID + }, true); + }); + + test('Click with block', function() { + var TEST_GROUP_ID = 'testGroup'; + Blockly.Events.setGroup(TEST_GROUP_ID); + var event = new Blockly.Events.Click(this.block, null, 'block'); + assertEventEquals(event, Blockly.Events.CLICK, this.workspace.id, + this.TEST_BLOCK_ID, { + 'targetType': 'block', + 'recordUndo': false, + 'group': TEST_GROUP_ID + }, true); + }); + + 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); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.MOVE, this.workspace.id, + this.TEST_BLOCK_ID, { + 'oldParentId': undefined, + 'oldInputName': undefined, + 'oldCoordinate': coordinate, + 'recordUndo': true, + 'group': '' + }); + }); + + 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); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.MOVE, this.workspace.id, + this.TEST_BLOCK_ID, { + 'oldParentId': undefined, + 'oldInputName': undefined, + 'oldCoordinate': coordinate, + 'recordUndo': true, + 'group': '' + }); + }); + + suite('Move by parent', function() { + setup(function() { + this.parentBlock = createSimpleTestBlock(this.workspace); + + this.block.parentBlock_ = this.parentBlock; + this.block.xy_ = new Blockly.utils.Coordinate(3, 4); + }); + teardown(function() { + // This needs to be cleared, otherwise workspace.dispose will fail. + this.block.parentBlock_ = null; + }); + + test('Move by parent', function() { + var event = new Blockly.Events.Move(this.block); + sinon.assert.calledTwice(this.genUidStub); + assertEventEquals(event, Blockly.Events.MOVE, this.workspace.id, + this.TEST_BLOCK_ID, { + 'oldParentId': this.TEST_PARENT_ID, + 'oldInputName': undefined, + 'oldCoordinate': undefined, + 'recordUndo': true, + 'group': '' + }); + }); + + test('Block move by parent', function() { + var event = new Blockly.Events.BlockMove(this.block); + sinon.assert.calledTwice(this.genUidStub); + assertEventEquals(event, Blockly.Events.MOVE, this.workspace.id, + this.TEST_BLOCK_ID, + { + 'oldParentId': this.TEST_PARENT_ID, + 'oldInputName': undefined, + 'oldCoordinate': undefined, + 'recordUndo': true, + 'group': '' + }); + }); + }); + }); + }); + + suite('With shadow blocks', function() { + setup(function() { + this.TEST_BLOCK_ID = 'test_block_id'; + this.TEST_PARENT_ID = 'parent'; + // genUid is expected to be called either once or twice in this suite. + this.genUidStub = createGenUidStubWithReturns( + [this.TEST_BLOCK_ID, this.TEST_PARENT_ID]); + this.block = createSimpleTestBlock(this.workspace); + this.block.setShadow(true); + }); + + test('Block base', function() { + var event = new Blockly.Events.BlockBase(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, undefined, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'varId': undefined, + 'recordUndo': true, + 'group': '', + }); + }); + + test('Change', function() { + var event = new Blockly.Events.Change( + this.block, 'field', 'FIELD_NAME', 'old', 'new'); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.CHANGE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'varId': undefined, + 'element': 'field', + 'name': 'FIELD_NAME', + 'oldValue': 'old', + 'newValue': 'new', + 'recordUndo': true, + 'group': '', + }); + }); + + test('Block change', function() { + var event = new Blockly.Events.BlockChange( + this.block, 'field', 'FIELD_NAME', 'old', 'new'); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.CHANGE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'varId': undefined, + 'element': 'field', + 'name': 'FIELD_NAME', + 'oldValue': 'old', + 'newValue': 'new', + 'recordUndo': true, + 'group': '', + }); + }); + + test('Create', function() { + var event = new Blockly.Events.Create(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.CREATE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': false, + 'group': '', + }); + }); + + test('Block create', function() { + var event = new Blockly.Events.BlockCreate(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.CREATE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': false, + 'group': '', + }); + }); + + test('Delete', function() { + var event = new Blockly.Events.Delete(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.DELETE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': false, + 'group': '', + }); + }); + + test('Block delete', function() { + var event = new Blockly.Events.BlockDelete(this.block); + sinon.assert.calledOnce(this.genUidStub); + assertEventEquals(event, Blockly.Events.DELETE, + this.workspace.id, this.TEST_BLOCK_ID, + { + 'recordUndo': false, + 'group': '', + }); + }); + + suite('Move', function() { + setup(function() { + this.parentBlock = createSimpleTestBlock(this.workspace); + this.block.parentBlock_ = this.parentBlock; + this.block.xy_ = new Blockly.utils.Coordinate(3, 4); + }); + + teardown(function() { + // This needs to be cleared, otherwise workspace.dispose will fail. + this.block.parentBlock_ = null; + }); + + test('Move', function() { + var event = new Blockly.Events.Move(this.block); + sinon.assert.calledTwice(this.genUidStub); + assertEventEquals(event, Blockly.Events.MOVE, this.workspace.id, + this.TEST_BLOCK_ID, { + 'oldParentId': this.TEST_PARENT_ID, + 'oldInputName': undefined, + 'oldCoordinate': undefined, + 'recordUndo': false, + 'group': '' + }); + }); + + test('Block move', function() { + var event = new Blockly.Events.BlockMove(this.block); + sinon.assert.calledTwice(this.genUidStub); + assertEventEquals(event, Blockly.Events.MOVE, this.workspace.id, + this.TEST_BLOCK_ID, + { + 'oldParentId': this.TEST_PARENT_ID, + 'oldInputName': undefined, + 'oldCoordinate': undefined, + 'recordUndo': false, + 'group': '' + }); + }); + }); + }); + + suite('With variable getter blocks', function() { + setup(function() { + this.genUidStub = createGenUidStubWithReturns( + [this.TEST_BLOCK_ID, 'test_var_id', 'test_group_id']); + // Disabling events when creating a block with variable can cause issues + // at workspace dispose. + this.block = new Blockly.Block( + this.workspace, 'field_variable_test_block'); + }); + + test('Change', function() { + var event = new Blockly.Events.Change( + this.block, 'field', 'VAR', 'id1', 'id2'); + assertEventEquals(event, Blockly.Events.CHANGE, this.workspace.id, + this.TEST_BLOCK_ID, + { + 'element': 'field', + 'name': 'VAR', + 'oldValue': 'id1', + 'newValue': 'id2', + 'recordUndo': true, + 'group': '' + }); + }); + + test('Block change', function() { + var event = new Blockly.Events.BlockChange( + this.block, 'field', 'VAR', 'id1', 'id2'); + assertEventEquals(event, Blockly.Events.CHANGE, this.workspace.id, + this.TEST_BLOCK_ID, + { + 'element': 'field', + 'name': 'VAR', + 'oldValue': 'id1', + 'newValue': 'id2', + 'recordUndo': true, + 'group': '' + }); + }); + }); + }); + + suite('Serialization', function() { + var safeStringify = (json) => { + let cache = []; + return JSON.stringify(json, (key, value) => { + if (typeof value == 'object' && value != null) { + if (cache.includes(value)) { + // Discard duplicate reference. + return undefined; + } + cache.push(value); + return value; + } + return value; + }); + }; + var variableEventTestCases = [ + {title: 'Var create', class: Blockly.Events.VarCreate, + getArgs: (thisObj) => [thisObj.variable], + getExpectedJson: () => ({type: 'var_create', varId: 'id1', + varType: 'type1', varName: 'name1'})}, + {title: 'Var delete', class: Blockly.Events.VarDelete, + getArgs: (thisObj) => [thisObj.variable], + getExpectedJson: () => ({type: 'var_delete', varId: 'id1', + varType: 'type1', varName: 'name1'})}, + {title: 'Var rename', class: Blockly.Events.VarRename, + getArgs: (thisObj) => [thisObj.variable, 'name2'], + getExpectedJson: () => ({type: 'var_rename', varId: 'id1', + oldName: 'name1', newName: 'name2'})}, + ]; + var uiEventTestCases = [ + {title: 'Bubble open', class: Blockly.Events.BubbleOpen, + getArgs: (thisObj) => [thisObj.block, true, 'mutator'], + getExpectedJson: (thisObj) => ({type: 'bubble_open', isOpen: true, + bubbleType: 'mutator', blockId: thisObj.block.id})}, + {title: 'Block click', class: Blockly.Events.Click, + getArgs: (thisObj) => [thisObj.block, null, 'block'], + getExpectedJson: (thisObj) => ({type: 'click', targetType: 'block', + blockId: thisObj.block.id})}, + {title: 'Workspace click', class: Blockly.Events.Click, + getArgs: (thisObj) => [null, thisObj.workspace.id, 'workspace'], + getExpectedJson: (thisObj) => ({type: 'click', + targetType: 'workspace'})}, + {title: 'Drag start', class: Blockly.Events.BlockDrag, + getArgs: (thisObj) => [thisObj.block, true, [thisObj.block]], + getExpectedJson: (thisObj) => ({type: 'drag', + isStart: true, blockId: thisObj.block.id, blocks: [thisObj.block]})}, + {title: 'Drag end', class: Blockly.Events.BlockDrag, + getArgs: (thisObj) => [thisObj.block, false, [thisObj.block]], + getExpectedJson: (thisObj) => ({type: 'drag', + isStart: false, blockId: thisObj.block.id, blocks: [thisObj.block]})}, + {title: 'null to Block Marker move', class: Blockly.Events.MarkerMove, + getArgs: (thisObj) => [thisObj.block, true, null, + new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, thisObj.block)], + getExpectedJson: (thisObj) => ({type: 'marker_move', + isCursor: true, blockId: thisObj.block.id, oldNode: null, + newNode: new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, + thisObj.block)})}, + {title: 'null to Workspace Marker move', class: Blockly.Events.MarkerMove, + getArgs: (thisObj) => [null, true, null, + Blockly.ASTNode.createWorkspaceNode(thisObj.workspace, + new Blockly.utils.Coordinate(0, 0))], + getExpectedJson: (thisObj) => ({type: 'marker_move', + isCursor: true, blockId: null, oldNode: null, + newNode: Blockly.ASTNode.createWorkspaceNode(thisObj.workspace, + new Blockly.utils.Coordinate(0, 0))})}, + {title: 'Workspace to Block Marker move', + class: Blockly.Events.MarkerMove, + getArgs: (thisObj) => [thisObj.block, true, + Blockly.ASTNode.createWorkspaceNode(thisObj.workspace, + new Blockly.utils.Coordinate(0, 0)), + new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, thisObj.block)], + getExpectedJson: (thisObj) => ({type: 'marker_move', + isCursor: true, blockId: thisObj.block.id, + oldNode: Blockly.ASTNode.createWorkspaceNode(thisObj.workspace, + new Blockly.utils.Coordinate(0, 0)), + newNode: new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, + thisObj.block)})}, + {title: 'Block to Workspace Marker move', + class: Blockly.Events.MarkerMove, + getArgs: (thisObj) => [null, true, + new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, thisObj.block), + Blockly.ASTNode.createWorkspaceNode(thisObj.workspace, + new Blockly.utils.Coordinate(0, 0))]}, + {title: 'Selected', class: Blockly.Events.Selected, + getArgs: (thisObj) => [null, thisObj.block.id, thisObj.workspace.id], + getExpectedJson: (thisObj) => ({type: 'selected', oldElementId: null, + newElementId: thisObj.block.id})}, + {title: 'Selected (deselect)', class: Blockly.Events.Selected, + getArgs: (thisObj) => [thisObj.block.id, null, thisObj.workspace.id], + getExpectedJson: (thisObj) => ({type: 'selected', + oldElementId: thisObj.block.id, newElementId: null})}, + {title: 'Theme Change', class: Blockly.Events.ThemeChange, + getArgs: (thisObj) => ['classic', thisObj.workspace.id], + getExpectedJson: () => ({type: 'theme_change', themeName: 'classic'})}, + {title: 'Toolbox item select', + class: Blockly.Events.ToolboxItemSelect, + getArgs: (thisObj) => ['Math', 'Loops', thisObj.workspace.id], + getExpectedJson: () => ({type: 'toolbox_item_select', oldItem: 'Math', + newItem: 'Loops'})}, + {title: 'Toolbox item select (no previous)', + class: Blockly.Events.ToolboxItemSelect, + getArgs: (thisObj) => [null, 'Loops', thisObj.workspace.id], + getExpectedJson: () => ({type: 'toolbox_item_select', oldItem: null, + newItem: 'Loops'})}, + {title: 'Toolbox item select (deselect)', + class: Blockly.Events.ToolboxItemSelect, + getArgs: (thisObj) => ['Math', null, thisObj.workspace.id], + getExpectedJson: () => ({type: 'toolbox_item_select', oldItem: 'Math', + newItem: null})}, + {title: 'Trashcan open', class: Blockly.Events.TrashcanOpen, + getArgs: (thisObj) => [true, thisObj.workspace.id], + getExpectedJson: () => ({type: 'trashcan_open', isOpen: true})}, + {title: 'Viewport change', class: Blockly.Events.ViewportChange, + getArgs: (thisObj) => [2.666, 1.333, 1.2, thisObj.workspace.id], + getExpectedJson: () => ({type: 'viewport_change', viewTop: 2.666, + viewLeft: 1.333, scale: 1.2})}, + {title: 'Viewport change (0,0)', class: Blockly.Events.ViewportChange, + getArgs: (thisObj) => [0, 0, 1.2, thisObj.workspace.id], + getExpectedJson: () => ({type: 'viewport_change', viewTop: 0, + viewLeft: 0, scale: 1.2})}, + ]; + var blockEventTestCases = [ + {title: 'Block change', class: Blockly.Events.BlockChange, + getArgs: (thisObj) => [thisObj.block, 'collapsed', null, false, true], + getExpectedJson: (thisObj) => ({type: 'change', + blockId: thisObj.block.id, element: 'collapsed', oldValue: false, + newValue: true})}, + {title: 'Block create', class: Blockly.Events.BlockCreate, + getArgs: (thisObj) => [thisObj.block], + getExpectedJson: (thisObj) => ({type: 'create', + blockId: thisObj.block.id, + xml: '', + ids: [thisObj.block.id]})}, + {title: 'Block create (shadow)', class: Blockly.Events.BlockCreate, + getArgs: (thisObj) => [thisObj.shadowBlock], + getExpectedJson: (thisObj) => ({type: 'create', + blockId: thisObj.shadowBlock.id, + xml: '', + ids: [thisObj.shadowBlock.id], recordUndo: false})}, + {title: 'Block delete', class: Blockly.Events.BlockDelete, + getArgs: (thisObj) => [thisObj.block], + getExpectedJson: (thisObj) => ({type: 'delete', + blockId: thisObj.block.id, + oldXml: '', + ids: [thisObj.block.id]})}, + {title: 'Block delete (shadow)', class: Blockly.Events.BlockDelete, + getArgs: (thisObj) => [thisObj.shadowBlock], + getExpectedJson: (thisObj) => ({type: 'delete', + blockId: thisObj.shadowBlock.id, + oldXml: '', + ids: [thisObj.shadowBlock.id], recordUndo: false})}, + {title: 'Block move', class: Blockly.Events.BlockMove, + getArgs: (thisObj) => [thisObj.block], + getExpectedJson: (thisObj) => ({type: 'move', + blockId: thisObj.block.id})}, + {title: 'Block move (shadow)', class: Blockly.Events.BlockMove, + getArgs: (thisObj) => [thisObj.shadowBlock], + getExpectedJson: (thisObj) => ({type: 'move', + blockId: thisObj.shadowBlock.id, recordUndo: false})}, + ]; + var testSuites = [ + {title: 'Variable events', testCases: variableEventTestCases, + setup: (thisObj) => { + thisObj.variable = + thisObj.workspace.createVariable('name1', 'type1', 'id1'); + }}, + {title: 'UI events', testCases: uiEventTestCases, + setup: (thisObj) => { + thisObj.block = createSimpleTestBlock(thisObj.workspace); + }}, + {title: 'Block events', testCases: blockEventTestCases, + setup: (thisObj) => { + createGenUidStubWithReturns(['testBlockId1', 'testBlockId2']); + thisObj.block = createSimpleTestBlock(thisObj.workspace); + thisObj.shadowBlock = createSimpleTestBlock(thisObj.workspace); + thisObj.shadowBlock.setShadow(true); + }} + ]; + testSuites.forEach((testSuite) => { + suite(testSuite.title, function() { + setup(function() { + testSuite.setup(this); + }); + suite('fromJson', function() { + testSuite.testCases.forEach((testCase) => { + test(testCase.title, function() { + var event = new testCase.class(...testCase.getArgs(this)); + var event2 = new testCase.class(); + var json = event.toJson(); + event2.fromJson(json); + + chai.assert.equal( + safeStringify(event2.toJson()), safeStringify(json)); + }); + }); + }); + suite('toJson', function() { + testSuite.testCases.forEach((testCase) => { + if (testCase.getExpectedJson) { + test(testCase.title, function() { + var event = new testCase.class(...testCase.getArgs(this)); + var json = event.toJson(); + var expectedJson = testCase.getExpectedJson(this); + + chai.assert.equal( + safeStringify(json), safeStringify(expectedJson)); + }); + } + }); + }); + }); + }); + }); + + 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); + chai.assert.isDefined(variable); + chai.assert.equal(name, variable.name); + chai.assert.equal(type, variable.type); + chai.assert.equal(id, variable.getId()); + } + + suite('Constructors', function() { + test('Var base', function() { + var event = new Blockly.Events.VarBase(this.variable); + assertEventEquals(event, undefined, this.workspace.id, undefined, { + 'varId': 'id1', + 'recordUndo': true, + 'group': '' + }); + }); + + test('Var create', function() { + var event = new Blockly.Events.VarCreate(this.variable); + assertEventEquals(event, Blockly.Events.VAR_CREATE, this.workspace.id, + undefined, + { + 'varId': 'id1', + 'varType': 'type1', + 'varName': 'name1', + 'recordUndo': true, + 'group': '' + }); + }); + + test('Var delete', function() { + var event = new Blockly.Events.VarDelete(this.variable); + assertEventEquals(event, Blockly.Events.VAR_DELETE, this.workspace.id, + undefined, + { + 'varId': 'id1', + 'varType': 'type1', + 'varName': 'name1', + 'recordUndo': true, + 'group': '' + }); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + assertEventEquals(event, Blockly.Events.VAR_RENAME, this.workspace.id, + undefined, + { + 'varId': 'id1', + 'oldName': 'name1', + 'newName': 'name2', + 'recordUndo': true, + 'group': '' + }); + }); + }); + + suite('Run Forward', function() { + test('Var create', function() { + var json = {type: "var_create", varId: "id2", varType: "type2", + varName: "name2"}; + var event = Blockly.Events.fromJson(json, this.workspace); + var x = this.workspace.getVariableById('id2'); + chai.assert.isNull(x); + event.run(true); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Var delete', function() { + var event = new Blockly.Events.VarDelete(this.variable); + chai.assert.isNotNull(this.workspace.getVariableById('id1')); + event.run(true); + chai.assert.isNull(this.workspace.getVariableById('id1')); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + event.run(true); + chai.assert.isNull(this.workspace.getVariable('name1')); + checkVariableValues(this.workspace, 'name2', 'type1', 'id1'); + }); + }); + suite('Run Backward', function() { + test('Var create', function() { + var event = new Blockly.Events.VarCreate(this.variable); + chai.assert.isNotNull(this.workspace.getVariableById('id1')); + event.run(false); + }); + + test('Var delete', function() { + var json = {type: "var_delete", varId: "id2", varType: "type2", + varName: "name2"}; + var event = Blockly.Events.fromJson(json, this.workspace); + chai.assert.isNull(this.workspace.getVariableById('id2')); + event.run(false); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + event.run(false); + chai.assert.isNull(this.workspace.getVariable('name2')); + checkVariableValues(this.workspace, 'name1', 'type1', 'id1'); + }); + }); + }); + + suite('Filters', function() { + function 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 addMoveEventParent(events, block, parent) { + events.push(new Blockly.Events.BlockMove(block)); + block.setParent(parent); + events[events.length - 1].recordNew(); + } + + test('No removed, order unchanged', function() { + var block = this.workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.BlockCreate(block), + new Blockly.Events.BlockMove(block), + new Blockly.Events.BlockChange(block, 'field', 'VAR', 'id1', 'id2'), + new Blockly.Events.Click(block) + ]; + var filteredEvents = Blockly.Events.filter(events, true); + chai.assert.equal(filteredEvents.length, 4); // no event should have been removed. + // test that the order hasn't changed + chai.assert.isTrue(filteredEvents[0] instanceof Blockly.Events.BlockCreate); + chai.assert.isTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + chai.assert.isTrue(filteredEvents[2] instanceof Blockly.Events.BlockChange); + chai.assert.isTrue(filteredEvents[3] instanceof Blockly.Events.Click); + }); + + test('Different blocks no removed', function() { + var block1 = this.workspace.newBlock('field_variable_test_block', '1'); + var block2 = this.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); + chai.assert.equal(filteredEvents.length, 4); // no event should have been removed. + }); + + test('Forward', function() { + var block = this.workspace.newBlock('field_variable_test_block', '1'); + var events = [ new Blockly.Events.BlockCreate(block) ]; + addMoveEvent(events, block, 1, 1); + addMoveEvent(events, block, 2, 2); + addMoveEvent(events, block, 3, 3); + var filteredEvents = Blockly.Events.filter(events, true); + chai.assert.equal(filteredEvents.length, 2); // duplicate moves should have been removed. + // test that the order hasn't changed + chai.assert.isTrue(filteredEvents[0] instanceof Blockly.Events.BlockCreate); + chai.assert.isTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + chai.assert.equal(filteredEvents[1].newCoordinate.x, 3); + chai.assert.equal(filteredEvents[1].newCoordinate.y, 3); + }); + + test('Backward', function() { + var block = this.workspace.newBlock('field_variable_test_block', '1'); + var events = [ new Blockly.Events.BlockCreate(block) ]; + addMoveEvent(events, block, 1, 1); + addMoveEvent(events, block, 2, 2); + addMoveEvent(events, block, 3, 3); + var filteredEvents = Blockly.Events.filter(events, false); + chai.assert.equal(filteredEvents.length, 2); // duplicate event should have been removed. + // test that the order hasn't changed + chai.assert.isTrue(filteredEvents[0] instanceof Blockly.Events.BlockCreate); + chai.assert.isTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + chai.assert.equal(filteredEvents[1].newCoordinate.x, 1); + chai.assert.equal(filteredEvents[1].newCoordinate.y, 1); + }); + + test('Merge move events', function() { + var block = this.workspace.newBlock('field_variable_test_block', '1'); + var events = []; + addMoveEvent(events, block, 0, 0); + addMoveEvent(events, block, 1, 1); + var filteredEvents = Blockly.Events.filter(events, true); + chai.assert.equal(filteredEvents.length, 1); // second move event merged into first + chai.assert.equal(filteredEvents[0].newCoordinate.x, 1); + chai.assert.equal(filteredEvents[0].newCoordinate.y, 1); + }); + + test('Merge change events', function() { + var block1 = this.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); + chai.assert.equal(filteredEvents.length, 1); // second change event merged into first + chai.assert.equal(filteredEvents[0].oldValue, 'item'); + chai.assert.equal(filteredEvents[0].newValue, 'item2'); + }); + + test('Merge ui events', function() { + var block1 = this.workspace.newBlock('field_variable_test_block', '1'); + var block2 = this.workspace.newBlock('field_variable_test_block', '2'); + var block3 = this.workspace.newBlock('field_variable_test_block', '3'); + var events = [ + new Blockly.Events.BubbleOpen(block1, true, 'comment'), + new Blockly.Events.Click(block1), + new Blockly.Events.BubbleOpen(block2, true, 'mutator'), + new Blockly.Events.Click(block2), + new Blockly.Events.BubbleOpen(block3, true,'warning'), + new Blockly.Events.Click(block3) + ]; + var filteredEvents = Blockly.Events.filter(events, true); + // click event merged into corresponding *Open event + chai.assert.equal(filteredEvents.length, 3); + chai.assert.isTrue(filteredEvents[0] instanceof Blockly.Events.BubbleOpen); + chai.assert.isTrue(filteredEvents[1] instanceof Blockly.Events.BubbleOpen); + chai.assert.isTrue(filteredEvents[2] instanceof Blockly.Events.BubbleOpen); + chai.assert.equal(filteredEvents[0].bubbleType, 'comment'); + chai.assert.equal(filteredEvents[1].bubbleType, 'mutator'); + chai.assert.equal(filteredEvents[2].bubbleType, 'warning'); + }); + + test('Colliding events not dropped', function() { + // Tests that events that collide on a (event, block, workspace) tuple + // but cannot be merged do not get dropped during filtering. + var block = this.workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.Click(block), + new Blockly.Events.Ui(block, 'stackclick', undefined, undefined) + ]; + var filteredEvents = Blockly.Events.filter(events, true); + // click and stackclick should both exist + chai.assert.equal(filteredEvents.length, 2); + chai.assert.isTrue(filteredEvents[0] instanceof Blockly.Events.Click); + chai.assert.equal(filteredEvents[1].element, 'stackclick'); + }); + + test('Merging null operations dropped', function() { + // 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. + var block = this.workspace.newBlock('field_variable_test_block', '1'); + block.setParent(null); + var events = []; + addMoveEventParent(events, block, null); + 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. + chai.assert.equal(filteredEvents.length, 0); + }); + + test('Move events different blocks not merged', function() { + // 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. + var block1 = createSimpleTestBlock(this.workspace); + var block2 = createSimpleTestBlock(this.workspace); + + var events = []; + addMoveEvent(events, block1, 1, 1); + addMoveEvent(events, block2, 1, 1); + events.push(new Blockly.Events.BlockDelete(block2)); + addMoveEvent(events, block1, 2, 2); + + var filteredEvents = Blockly.Events.filter(events, true); + // Nothing should have merged. + chai.assert.equal(filteredEvents.length, 4); + // test that the order hasn't changed + chai.assert.isTrue(filteredEvents[0] instanceof Blockly.Events.BlockMove); + chai.assert.isTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + chai.assert.isTrue(filteredEvents[2] instanceof Blockly.Events.BlockDelete); + chai.assert.isTrue(filteredEvents[3] instanceof Blockly.Events.BlockMove); + }); + }); + + suite('Firing', function() { + setup(function() { + this.changeListenerSpy = createFireChangeListenerSpy(this.workspace); + }); + + test('Block dispose triggers Delete', function() { + try { + var toolbox = document.getElementById('toolbox-categories'); + var workspaceSvg = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + var TEST_BLOCK_ID = 'test_block_id'; + var genUidStub = createGenUidStubWithReturns( + [TEST_BLOCK_ID, 'test_group_id']); + + var block = workspaceSvg.newBlock(''); + block.initSvg(); + block.setCommentText('test comment'); + var expectedOldXml = Blockly.Xml.blockToDomWithXY(block); + var expectedId = block.id; + + // Run all queued events. + this.clock.runAll(); + + this.eventsFireSpy.resetHistory(); + var changeListenerSpy = createFireChangeListenerSpy(workspaceSvg); + block.dispose(); + + // Run all queued events. + this.clock.runAll(); + + // Expect two calls to genUid: one to set the block's ID, and one for + // the event group's ID for creating block. + sinon.assert.calledTwice(genUidStub); + + assertNthCallEventArgEquals( + this.eventsFireSpy, 0, Blockly.Events.Delete, + {oldXml: expectedOldXml, group: ''}, + workspaceSvg.id, expectedId); + assertNthCallEventArgEquals( + changeListenerSpy, 0, Blockly.Events.Delete, + {oldXml: expectedOldXml, group: ''}, + workspaceSvg.id, expectedId); + + // Expect the workspace to not have a variable with ID 'test_block_id'. + chai.assert.isNull(this.workspace.getVariableById(TEST_BLOCK_ID)); + } finally { + workspaceTeardown.call(this, workspaceSvg); + } + }); + + test('New block new var', function() { + var TEST_BLOCK_ID = 'test_block_id'; + var TEST_GROUP_ID = 'test_group_id'; + var TEST_VAR_ID = 'test_var_id'; + var genUidStub = createGenUidStubWithReturns( + [TEST_BLOCK_ID, TEST_GROUP_ID, TEST_VAR_ID]); + var _ = this.workspace.newBlock('field_variable_test_block'); + var TEST_VAR_NAME = 'item'; // As defined in block's json. + + // Run all queued events. + this.clock.runAll(); + + // 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. + sinon.assert.calledThrice(genUidStub); + + // Expect two events fired: varCreate and block create. + sinon.assert.calledTwice(this.eventsFireSpy); + // Expect both events to trigger change listener. + sinon.assert.calledTwice(this.changeListenerSpy); + // Both events should be on undo stack + chai.assert.equal(this.workspace.undoStack_.length, 2, + 'Undo stack length'); + + assertNthCallEventArgEquals( + this.changeListenerSpy, 0, Blockly.Events.VarCreate, + {group: TEST_GROUP_ID, varId: TEST_VAR_ID, varName: TEST_VAR_NAME}, + this.workspace.id, undefined); + assertNthCallEventArgEquals( + this.changeListenerSpy, 1, Blockly.Events.Create, + {group: TEST_GROUP_ID}, this.workspace.id, TEST_BLOCK_ID); + + // Expect the workspace to have a variable with ID 'test_var_id'. + chai.assert.isNotNull(this.workspace.getVariableById(TEST_VAR_ID)); + }); + + test('New block new var xml', function() { + var TEST_GROUP_ID = 'test_group_id'; + var genUidStub = createGenUidStubWithReturns(TEST_GROUP_ID); + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, this.workspace); + var TEST_BLOCK_ID = 'test_block_id'; + var TEST_VAR_ID = 'test_var_id'; + var TEST_VAR_NAME = 'name1'; + + // Run all queued events. + this.clock.runAll(); + + // Expect one call to genUid: for the event group's id + sinon.assert.calledOnce(genUidStub); + + // When block is created using domToWorkspace, 5 events are fired: + // 1. varCreate (events disabled) + // 2. varCreate + // 3. block create + // 4. move (no-op, is filtered out) + // 5. finished loading + sinon.assert.callCount(this.eventsFireSpy, 5); + // The first varCreate and move event should have been ignored. + sinon.assert.callCount(this.changeListenerSpy, 3); + // Expect two events on undo stack: varCreate and block create. + chai.assert.equal(this.workspace.undoStack_.length, 2, + 'Undo stack length'); + + assertNthCallEventArgEquals( + this.changeListenerSpy, 0, Blockly.Events.VarCreate, + {group: TEST_GROUP_ID, varId: TEST_VAR_ID, varName: TEST_VAR_NAME}, + this.workspace.id, undefined); + assertNthCallEventArgEquals( + this.changeListenerSpy, 1, Blockly.Events.Create, + {group: TEST_GROUP_ID}, this.workspace.id, TEST_BLOCK_ID); + + // Finished loading event should not be part of event group. + assertNthCallEventArgEquals( + this.changeListenerSpy, 2, Blockly.Events.FinishedLoading, + {group: ''}, this.workspace.id, undefined); + + // Expect the workspace to have a variable with ID 'test_var_id'. + chai.assert.isNotNull(this.workspace.getVariableById(TEST_VAR_ID)); + }); + }); + suite('Disable orphans', function() { + setup(function() { + // disableOrphans needs a WorkspaceSVG + var toolbox = document.getElementById('toolbox-categories'); + this.workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('Created orphan block is disabled', function() { + this.workspace.addChangeListener(Blockly.Events.disableOrphans); + var block = this.workspace.newBlock('controls_for'); + block.initSvg(); + block.render(); + + // Fire all events + this.clock.runAll(); + + chai.assert.isFalse(block.isEnabled(), + 'Expected orphan block to be disabled after creation'); + }); + test('Created procedure block is enabled', function() { + this.workspace.addChangeListener(Blockly.Events.disableOrphans); + + // Procedure block is never an orphan + var functionBlock = this.workspace.newBlock('procedures_defnoreturn'); + functionBlock.initSvg(); + functionBlock.render(); + + // Fire all events + this.clock.runAll(); + + chai.assert.isTrue(functionBlock.isEnabled(), + 'Expected top-level procedure block to be enabled'); + }); + test('Moving a block to top-level disables it', function() { + this.workspace.addChangeListener(Blockly.Events.disableOrphans); + var functionBlock = this.workspace.newBlock('procedures_defnoreturn'); + functionBlock.initSvg(); + functionBlock.render(); + + var block = this.workspace.newBlock('controls_for'); + block.initSvg(); + block.render(); + + // Connect the block to the function block input stack + functionBlock.inputList[1].connection.connect(block.previousConnection); + + // Disconnect it again + block.unplug(false); + + // Fire all events + this.clock.runAll(); + + chai.assert.isFalse(block.isEnabled(), + 'Expected disconnected block to be disabled'); + }); + test('Giving block a parent enables it', function() { + this.workspace.addChangeListener(Blockly.Events.disableOrphans); + var functionBlock = this.workspace.newBlock('procedures_defnoreturn'); + functionBlock.initSvg(); + functionBlock.render(); + + var block = this.workspace.newBlock('controls_for'); + block.initSvg(); + block.render(); + + // Connect the block to the function block input stack + functionBlock.inputList[1].connection.connect(block.previousConnection); + + // Fire all events + this.clock.runAll(); + + chai.assert.isTrue(block.isEnabled(), + 'Expected block to be enabled after connecting to parent'); + }); + test('disableOrphans events are not undoable', function() { + this.workspace.addChangeListener(Blockly.Events.disableOrphans); + var functionBlock = this.workspace.newBlock('procedures_defnoreturn'); + functionBlock.initSvg(); + functionBlock.render(); + + var block = this.workspace.newBlock('controls_for'); + block.initSvg(); + block.render(); + + // Connect the block to the function block input stack + functionBlock.inputList[1].connection.connect(block.previousConnection); + + // Disconnect it again + block.unplug(false); + + // Fire all events + this.clock.runAll(); + + var disabledEvents = this.workspace.getUndoStack().filter(function(e) { + return e.element === 'disabled'; + }); + chai.assert.isEmpty(disabledEvents, + 'Undo stack should not contain any disabled events'); + }); + }); +}); diff --git a/static/js/tests/mocha/extensions_test.js b/static/js/tests/mocha/extensions_test.js new file mode 100644 index 0000000..5c5cc23 --- /dev/null +++ b/static/js/tests/mocha/extensions_test.js @@ -0,0 +1,488 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Extensions', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.extensionsCleanup_ = []; + }); + teardown(function() { + sharedTestTeardown.call(this); + for (let i = 0; i < this.extensionsCleanup_.length; i++) { + var extension = this.extensionsCleanup_[i]; + delete Blockly.Extensions.ALL_[extension]; + } + }); + + test('Definition before and after block type', function() { + this.extensionsCleanup_.push('extensions_test_before'); + this.extensionsCleanup_.push('extensions_test_after'); + + chai.assert.isUndefined(Blockly.Extensions.ALL_['extensions_test_before']); + var beforeCallback = sinon.spy(); + // Extension defined before the block type is defined. + Blockly.Extensions.register('extensions_test_before', beforeCallback); + + Blockly.defineBlocksWithJsonArray([{ + "type": "extension_test_block", + "message0": "extension_test_block", + "extensions": ["extensions_test_before", "extensions_test_after"] + }]); + + chai.assert.isUndefined(Blockly.Extensions.ALL_['extensions_test_after']); + var afterCallback = sinon.spy(); + // Extension defined after the block type (but before instantiation). + Blockly.Extensions.register('extensions_test_after', afterCallback); + + chai.assert.typeOf(Blockly.Extensions.ALL_['extensions_test_before'], 'function'); + chai.assert.typeOf(Blockly.Extensions.ALL_['extensions_test_after'], 'function'); + sinon.assert.notCalled(beforeCallback); + sinon.assert.notCalled(afterCallback); + + var block = new Blockly.Block(this.workspace, 'extension_test_block'); + + sinon.assert.calledOnce(beforeCallback); + sinon.assert.calledOnce(afterCallback); + sinon.assert.calledOn(beforeCallback, block); + sinon.assert.calledOn(afterCallback, block); + }); + + test('Parent tooltip when inline', function() { + var defaultTooltip = "defaultTooltip"; + var parentTooltip = "parentTooltip"; + 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 + } + ]); + + var block = + new Blockly.Block(this.workspace, 'test_parent_tooltip_when_inline'); + + // Tooltip is dynamic after extension initialization. + chai.assert.typeOf(block.tooltip, 'function'); + chai.assert.equal(block.tooltip(), defaultTooltip); + + // Tooltip is normal before connected to parent. + var parent = new Blockly.Block(this.workspace, 'test_parent'); + chai.assert.equal(parent.tooltip, parentTooltip); + chai.assert.notExists(parent.inputsInline); + + // Tooltip is normal when parent is not inline. + parent.getInput('INPUT').connection.connect(block.outputConnection); + chai.assert.equal(block.getParent(), parent); + chai.assert.equal(block.tooltip(), defaultTooltip); + + // Tooltip is parent's when parent is inline. + parent.setInputsInline(true); + chai.assert.equal(block.tooltip(), parentTooltip); + + // Tooltip revert when disconnected. + parent.getInput('INPUT').connection.disconnect(); + chai.assert.notExists(block.getParent()); + chai.assert.equal(block.tooltip(), defaultTooltip); + }); + + suite('Mixin', function() { + test('Basic', function() { + this.extensionsCleanup_.push('mixin_test'); + + var testMixin = { + field: 'FIELD', + method: function() { + console.log('TEXT_MIXIN method()'); + } + }; + + chai.assert.isUndefined(Blockly.Extensions.ALL_['mixin_test']); + // Extension defined before the block type is defined. + Blockly.Extensions.registerMixin('mixin_test', testMixin); + + chai.assert.typeOf(Blockly.Extensions.ALL_['mixin_test'], 'function'); + + + Blockly.defineBlocksWithJsonArray([{ + "type": "test_block_mixin", + "message0": "test_block_mixin", + "extensions": ["mixin_test"] + }]); + + var block = new Blockly.Block(this.workspace, 'test_block_mixin'); + + chai.assert.equal(testMixin.field, block.field); + chai.assert.equal(testMixin.method, block.method); + }); + + suite('Mutator', function() { + test('Basic', function() { + this.extensionsCleanup_.push('mutator_test'); + + 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'; + } + }); + + var block = new Blockly.Block(this.workspace, 'mutator_test_block'); + + // Make sure all of the functions were installed correctly. + chai.assert.equal(block.domToMutation(), 'domToMutationFn'); + chai.assert.equal(block.mutationToDom(), 'mutationToDomFn'); + chai.assert.equal(block.compose(), 'composeFn'); + chai.assert.equal(block.decompose(), 'decomposeFn'); + }); + + test('With helper function', function() { + this.extensionsCleanup_.push('extensions_test'); + + 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(); + chai.assert.isUndefined(Blockly.Extensions.ALL_['extensions_test']); + var helperFunctionSpy = sinon.spy(); + Blockly.Extensions.registerMutator('extensions_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }, + helperFunctionSpy + ); + + var _ = new Blockly.Block(this.workspace, 'mutator_test_block'); + + sinon.assert.calledOnce(helperFunctionSpy); + }); + + test('No dialog', function() { + this.extensionsCleanup_.push('mutator_test'); + + 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(); + chai.assert.isUndefined(Blockly.Extensions.ALL_['mutator_test']); + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }); + + var block = new Blockly.Block(this.workspace, 'mutator_test_block'); + + // Make sure all of the functions were installed correctly. + chai.assert.equal(block.domToMutation(), 'domToMutationFn'); + chai.assert.equal(block.mutationToDom(), 'mutationToDomFn'); + chai.assert.isFalse(Object.prototype.hasOwnProperty.call(block, 'compose')); + chai.assert.isFalse(Object.prototype.hasOwnProperty.call(block, 'decompose')); + }); + }); + }); + + suite('Error cases', function() { + test('Missing extension', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "missing_extension_block", + "message0": "missing_extension_block", + "extensions": ["missing_extension"] + }]); + + chai.assert.isUndefined(Blockly.Extensions.ALL_['missing_extension']); + var workspace = this.workspace; + chai.assert.throws(function() { + var _ = new Blockly.Block(workspace, 'missing_extension_block'); + }); + }); + + test('Mixin overwrites local value', function() { + this.extensionsCleanup_.push('mixin_bad_inputList'); + + var TEST_MIXIN_BAD_INPUTLIST = { + inputList: 'bad inputList' // Defined in constructor + }; + + chai.assert.isUndefined(Blockly.Extensions.ALL_['mixin_bad_inputList']); + // Extension defined before the block type is defined. + Blockly.Extensions.registerMixin('mixin_bad_inputList', TEST_MIXIN_BAD_INPUTLIST); + chai.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"] + }]); + + var workspace = this.workspace; + chai.assert.throws(function() { + var _ = new Blockly.Block(workspace, 'test_block_bad_inputList'); + }, /inputList/); + }); + + test('Mixin overwrites prototype', function() { + this.extensionsCleanup_.push('mixin_bad_colour_'); + + var TEST_MIXIN_BAD_COLOUR = { + colour_: 'bad colour_' // Defined on prototype + }; + + chai.assert.isUndefined(Blockly.Extensions.ALL_['mixin_bad_colour_']); + // Extension defined before the block type is defined. + Blockly.Extensions.registerMixin('mixin_bad_colour_', TEST_MIXIN_BAD_COLOUR); + chai.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_"] + }]); + + var workspace = this.workspace; + chai.assert.throws(function() { + var _ = new Blockly.Block(workspace, 'test_block_bad_colour'); + }, /colour_/); + }); + + test('Use mutator as extension', function() { + this.extensionsCleanup_.push('mutator_test'); + + 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(); + chai.assert.isUndefined(Blockly.Extensions.ALL_['mutator_test']); + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }); + + var workspace = this.workspace; + chai.assert.throws(function() { + var _ = new Blockly.Block(workspace, 'mutator_test_block'); + }); + // Should have failed on apply, not on register. + chai.assert.isNotNull(Blockly.Extensions.ALL_['mutator_test']); + }); + + test('Use mutator mixin as extension', function() { + this.extensionsCleanup_.push('mutator_test'); + + 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(); + chai.assert.isUndefined(Blockly.Extensions.ALL_['mutator_test']); + Blockly.Extensions.registerMixin('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }); + + var workspace = this.workspace; + chai.assert.throws(function() { + var _ = new Blockly.Block(workspace, 'mutator_test_block'); + }); + // Should have failed on apply, not on register. + chai.assert.isNotNull(Blockly.Extensions.ALL_['mutator_test']); + }); + + test('Use extension as mutator', function() { + this.extensionsCleanup_.push('extensions_test'); + + 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(); + chai.assert.isUndefined(Blockly.Extensions.ALL_['extensions_test']); + Blockly.Extensions.register('extensions_test', function() { + return 'extensions_test_fn'; + }); + + var workspace = this.workspace; + chai.assert.throws(function() { + var _ = new Blockly.Block(workspace, 'mutator_test_block'); + }); + // Should have failed on apply, not on register. + chai.assert.isNotNull(Blockly.Extensions.ALL_['extensions_test']); + }); + + suite('register', function() { + test('Just a string', function() { + this.extensionsCleanup_.push('extension_just_a_string'); + chai.assert.isUndefined(Blockly.Extensions.ALL_['extension_just_a_string']); + chai.assert.throws(function() { + Blockly.Extensions.register('extension_just_a_string', null); + }); + }); + + test('Null', function() { + this.extensionsCleanup_.push('extension_is_null'); + chai.assert.isUndefined(Blockly.Extensions.ALL_['extension_is_null']); + chai.assert.throws(function() { + Blockly.Extensions.register('extension_is_null', null); + }); + }); + + test('Undefined', function() { + this.extensionsCleanup_.push('extension_is_undefined'); + chai.assert.isUndefined(Blockly.Extensions.ALL_['extension_is_undefined']); + chai.assert.throws(function() { + Blockly.Extensions.register('extension_is_undefined', null); + }); + }); + }); + + suite('registerMutator', function() { + test('No domToMutation', function() { + this.extensionsCleanup_.push('mutator_test'); + chai.assert.throws(function() { + Blockly.Extensions.registerMutator('mutator_test', + { + mutationToDom: function() { + return 'mutationToDomFn'; + }, + compose: function() { + return 'composeFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + }, /domToMutation/); + }); + + test('No mutationToDom', function() { + this.extensionsCleanup_.push('mutator_test'); + chai.assert.throws(function() { + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + compose: function() { + return 'composeFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + }, /mutationToDom/); + }); + + test('Has decompose but no compose', function() { + this.extensionsCleanup_.push('mutator_test'); + chai.assert.throws(function() { + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + }, /compose/); + }); + + test('Has compose but no decompose', function() { + this.extensionsCleanup_.push('mutator_test'); + chai.assert.throws(function() { + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + }, + compose: function() { + return 'composeFn'; + } + }); + }, /decompose/); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/field_angle_test.js b/static/js/tests/mocha/field_angle_test.js new file mode 100644 index 0000000..6058aa6 --- /dev/null +++ b/static/js/tests/mocha/field_angle_test.js @@ -0,0 +1,313 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Angle Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + {title: 'NaN', value: NaN}, + {title: 'Non-Parsable String', value: 'bad'}, + {title: 'Infinity', value: Infinity, expectedValue: Infinity}, + {title: 'Negative Infinity', value: -Infinity, expectedValue: -Infinity}, + {title: 'Infinity String', value: 'Infinity', expectedValue: Infinity}, + {title: 'Negative Infinity String', value: '-Infinity', + expectedValue: -Infinity}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + + var validValueTestCases = [ + {title: 'Integer', value: 1, expectedValue: 1}, + {title: 'Float', value: 1.5, expectedValue: 1.5}, + {title: 'Integer String', value: '1', expectedValue: 1}, + {title: 'Float String', value: '1.5', expectedValue: 1.5}, + {title: '> 360°', value: 362, expectedValue: 2}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'angle': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = 0; + /** + * Asserts that the field property values are set to default. + * @param {FieldTemplate} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, defaultFieldValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldAngle} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldAngle, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldAngle, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldAngle(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue(2.5); + testHelpers.assertFieldValue(this.field, 2.5); + }); + }); + suite('Value -> New Value', function() { + var initialValue = 1; + setup(function() { + this.field = new Blockly.FieldAngle(initialValue); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, initialValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue(2.5); + testHelpers.assertFieldValue(this.field, 2.5); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.field = new Blockly.FieldAngle(1); + this.field.htmlInput_ = Object.create(null); + this.field.htmlInput_.oldValue_ = '1'; + this.field.htmlInput_.untypedDefaultValue_ = 1; + this.stub = sinon.stub(this.field, 'resizeEditor_'); + }); + teardown(function() { + sinon.restore(); + }); + var testSuites = [ + {title: 'Null Validator', + validator: + function() { + return null; + }, + value: 2, expectedValue: 1}, + {title: 'Force Mult of 30 Validator', + validator: + function(newValue) { + return Math.round(newValue / 30) * 30; + }, + value: 25, expectedValue: 30}, + {title: 'Returns Undefined Validator', validator: function() {}, value: 2, + expectedValue: 2}, + ]; + testSuites.forEach(function(suiteInfo) { + suite(suiteInfo.title, function() { + setup(function() { + this.field.setValidator(suiteInfo.validator); + }); + test('When Editing', function() { + this.field.isBeingEdited_ = true; + this.field.htmlInput_.value = String(suiteInfo.value); + this.field.onHtmlInputChange_(null); + testHelpers.assertFieldValue( + this.field, suiteInfo.expectedValue, String(suiteInfo.value)); + }); + test('When Not Editing', function() { + this.field.setValue(suiteInfo.value); + testHelpers.assertFieldValue(this.field, suiteInfo.expectedValue); + }); + }); + }); + }); + 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/static/js/tests/mocha/field_checkbox_test.js b/static/js/tests/mocha/field_checkbox_test.js new file mode 100644 index 0000000..f05be90 --- /dev/null +++ b/static/js/tests/mocha/field_checkbox_test.js @@ -0,0 +1,207 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Checkbox Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + {title: 'NaN', value: NaN}, + {title: 'Non-Parsable String', value: 'bad'}, + {title: 'Integer', value: 1}, + {title: 'Float', value: 1.5}, + {title: 'String true', value: 'true'}, + {title: 'String false', value: 'false'}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'Boolean true', value: true, expectedValue: 'TRUE', + expectedText: 'true'}, + {title: 'Boolean false', value: false, expectedValue: 'FALSE', + expectedText: 'false'}, + {title: 'String TRUE', value: 'TRUE', expectedValue: 'TRUE', + expectedText: 'true'}, + {title: 'String FALSE', value: 'FALSE', expectedValue: 'FALSE', + expectedText: 'false'}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'checked': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = 'FALSE'; + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue( + field, defaultFieldValue, defaultFieldValue.toLowerCase()); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue( + field, testCase.expectedValue, testCase.expectedValue.toLowerCase()); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldCheckbox, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldCheckbox, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('True -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldCheckbox('TRUE'); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, 'TRUE', 'true'); + }); + suite('False -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldCheckbox('FALSE'); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, 'FALSE', 'false'); + }); + }); + suite('Validators', function() { + setup(function() { + this.field = new Blockly.FieldCheckbox(true); + }); + var testSuites = [ + {title: 'Null Validator', + validator: + function() { + return null; + }, + value: 'FALSE', expectedValue: 'TRUE'}, + {title: 'Always True Validator', + validator: + function() { + return 'TRUE'; + }, + value: 'FALSE', expectedValue: 'TRUE'}, + {title: 'Always False Validator', + validator: + function() { + return 'TRUE'; + }, + value: 'FALSE', expectedValue: 'TRUE'}, + {title: 'Returns Undefined Validator', validator: function() {}, + value: 'FALSE', expectedValue: 'FALSE'}, + ]; + testSuites.forEach(function(suiteInfo) { + suite(suiteInfo.title, function() { + setup(function() { + this.field.setValidator(suiteInfo.validator); + }); + test('New Value', function() { + this.field.setValue(suiteInfo.value); + testHelpers.assertFieldValue( + this.field, suiteInfo.expectedValue, + String(suiteInfo.expectedValue).toLowerCase()); + }); + }); + }); + }); + suite('Customizations', function() { + suite('Check Character', function() { + function assertCharacter(field, char) { + field.fieldGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.G, {}, null); + field.sourceBlock_ = { + RTL: false, + rendered: true, + workspace: { + keyboardAccessibilityMode: false + }, + render: function() { field.render_(); }, + bumpNeighbours: function() {} + }; + field.constants_ = { + FIELD_CHECKBOX_X_OFFSET: 2, + FIELD_CHECKBOX_Y_OFFSET: 2, + FIELD_BORDER_RECT_RADIUS: 4, + FIELD_BORDER_RECT_HEIGHT: 16, + FIELD_TEXT_BASELINE_CENTER: false, + FIELD_TEXT_HEIGHT: 16, + FIELD_TEXT_BASELINE: 13, + }; + field.initView(); + field.render_(); + 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/static/js/tests/mocha/field_colour_test.js b/static/js/tests/mocha/field_colour_test.js new file mode 100644 index 0000000..21bbf69 --- /dev/null +++ b/static/js/tests/mocha/field_colour_test.js @@ -0,0 +1,280 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Colour Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + {title: 'NaN', value: NaN}, + {title: 'Non-Parsable String', value: 'bad-string'}, + {title: 'Integer', value: 1}, + {title: 'Float', value: 1.5}, + {title: 'Infinity', value: Infinity, expectedValue: Infinity}, + {title: 'Negative Infinity', value: -Infinity, expectedValue: -Infinity}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + + var validValueTestCases = [ + {title: '#AAAAAA', value: '#AAAAAA', expectedValue: '#aaaaaa', + expectedText: '#aaa'}, + {title: '#aaaaaa', value: '#aaaaaa', expectedValue: '#aaaaaa', + expectedText: '#aaa'}, + {title: '#AAAA00', value: '#AAAA00', expectedValue: '#aaaa00', + expectedText: '#aa0'}, + {title: '#aaaA00', value: '#aaaA00', expectedValue: '#aaaa00', + expectedText: '#aa0'}, + {title: '#BCBCBC', value: '#BCBCBC', expectedValue: '#bcbcbc', + expectedText: '#bcbcbc'}, + {title: '#bcbcbc', value: '#bcbcbc', expectedValue: '#bcbcbc', + expectedText: '#bcbcbc'}, + {title: '#AA0', value: '#AA0', expectedValue: '#aaaa00', + expectedText: '#aa0'}, + {title: '#aa0', value: '#aa0', expectedValue: '#aaaa00', + expectedText: '#aa0'}, + {title: 'rgb(170, 170, 0)', value: 'rgb(170, 170, 0)', + expectedValue: '#aaaa00', expectedText: '#aa0'}, + {title: 'red', value: 'red', expectedValue: '#ff0000', + expectedText: '#f00'}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'colour': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = Blockly.FieldColour.COLOURS[0]; + /** + * The expected default text for the field being tested. + * @type {*} + */ + var defaultTextValue = ( + function() { + var expectedText = defaultFieldValue; + var m = defaultFieldValue.match(/^#(.)\1(.)\2(.)\3$/); + if (m) { + expectedText = '#' + m[1] + m[2] + m[3]; + } + return expectedText; + })(); + /** + * Asserts that the field property values are set to default. + * @param {FieldTemplate} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, defaultFieldValue, defaultTextValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldAngle} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue( + field, testCase.expectedValue, testCase.expectedText); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldColour, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldColour, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldColour(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue, + defaultTextValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('#bcbcbc'); + testHelpers.assertFieldValue(this.field, '#bcbcbc', '#bcbcbc'); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldColour('#aaaaaa'); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, '#aaaaaa', '#aaa'); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('#bcbcbc'); + testHelpers.assertFieldValue(this.field, '#bcbcbc', '#bcbcbc'); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.field = new Blockly.FieldColour('#aaaaaa'); + }); + var testSuites = [ + {title: 'Null Validator', + validator: + function() { + return null; + }, + value: '#000000', expectedValue: '#aaaaaa', expectedText: '#aaa'}, + {title: 'Force Full Red Validator', + validator: + function(newValue) { + return '#ff' + newValue.substr(3, 4); + }, + value: '#000000', expectedValue: '#ff0000', expectedText: '#f00'}, + {title: 'Returns Undefined Validator', validator: function() {}, + value: '#000000', expectedValue: '#000000', expectedText: '#000'}, + ]; + testSuites.forEach(function(suiteInfo) { + suite(suiteInfo.title, function() { + setup(function() { + this.field.setValidator(suiteInfo.validator); + }); + test('New Value', function() { + this.field.setValue(suiteInfo.value); + testHelpers.assertFieldValue( + this.field, suiteInfo.expectedValue, suiteInfo.expectedText); + }); + }); + }); + }); + 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/static/js/tests/mocha/field_dropdown_test.js b/static/js/tests/mocha/field_dropdown_test.js new file mode 100644 index 0000000..5f08dfb --- /dev/null +++ b/static/js/tests/mocha/field_dropdown_test.js @@ -0,0 +1,155 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Dropdown Fields', function() { + setup(function() { + sharedTestSetup.call(this); + + // Invalid value test are expected to log errors. + const nativeConsoleError = console.error; + this.nativeConsoleError = nativeConsoleError; + console.error = function(msg) { + if (!msg.includes('Each FieldDropdown option')) { + nativeConsoleError.call(this, ...arguments); + } + }; + }); + teardown(function() { + console.error = this.nativeConsoleError; + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueCreationTestCases = [ + {title: 'Undefined', args: [undefined]}, + {title: 'Array Items not Arrays', args: [undefined]}, + {title: 'Array Items with Invalid IDs', + args: [[['1', 1], ['2', 2], ['3', 3]]]}, + {title: 'Array Items with Invalid Content', + args: [[[1, '1'], [2, '2'], [3, '3']]]}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueCreationTestCases = [ + {title: 'Text Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a', + args: [[['a', 'A'], ['b', 'B'], ['c', 'C']]]}, + {title: 'Image Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a', + args: [[ + [{ src:'scrA', alt:'a' }, 'A'], + [{ src:'scrB', alt:'b' }, 'B'], + [{ src:'scrC', alt:'c' }, 'C']]]}, + {title: 'Dynamic Text Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a', + args: [() => { + return [['a', 'A'], ['b', 'B'], ['c', 'C']]; + }]}, + {title: 'Dynamic Image Dropdown', value: 'A', expectedValue: 'A', expectedText: 'a', + args: [() => { + return [ + [{ src:'scrA', alt:'a' }, 'A'], + [{ src:'scrB', alt:'b' }, 'B'], + [{ src:'scrC', alt:'c' }, 'C']]; + }]}, + ]; + var addJson = function(testCase) { + testCase.json = {'options': testCase.args[0]}; + }; + invalidValueCreationTestCases.forEach(addJson); + validValueCreationTestCases.forEach(addJson); + + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue, testCase.expectedText); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldDropdown, validValueCreationTestCases, + invalidValueCreationTestCases, validTestCaseAssertField); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldDropdown, validValueCreationTestCases, + invalidValueCreationTestCases, validTestCaseAssertField); + + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueSetValueTestCases = [ + {title: 'Null', value: null}, + {title: 'Undefined', value: undefined}, + {title: 'Invalid ID', value: 'bad'}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueSetValueTestCases = [ + {title: 'Valid ID', value: 'B', expectedValue: 'B', expectedText: 'b'}, + ]; + + suite('setValue', function() { + setup(function() { + this.field = new Blockly.FieldDropdown( + [['a', 'A'], ['b', 'B'], ['c', 'C']]); + }); + testHelpers.runSetValueTests( + validValueSetValueTestCases, invalidValueSetValueTestCases, 'A', 'a'); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('B'); + testHelpers.assertFieldValue(this.field, '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'); + testHelpers.assertFieldValue(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'); + testHelpers.assertFieldValue(this.dropdownField, '1B', '1b'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.dropdownField.setValidator(function() {}); + }); + test('New Value', function() { + this.dropdownField.setValue('1B'); + testHelpers.assertFieldValue(this.dropdownField, '1B', '1b'); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/field_image_test.js b/static/js/tests/mocha/field_image_test.js new file mode 100644 index 0000000..e014f2b --- /dev/null +++ b/static/js/tests/mocha/field_image_test.js @@ -0,0 +1,194 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Image Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined Src', value: undefined, args: [undefined, 1, 1]}, + {title: 'Undefined Size', value: 'src', args: ['src', undefined, undefined]}, + {title: 'Zero Size', value: 'src', args: ['src', 0, 0]}, + {title: 'Non-Parsable String for Size', value: 'src', args: ['src', 'bad', 'bad']}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueCreationTestCases = [ + {title: 'With Alt', value: 'src', expectedValue: 'src', + args: ['src', 1, 1, 'alt'], expectedText: 'alt'}, + {title: 'Without Alt', value: 'src', expectedValue: 'src', + args: ['src', 1, 1], expectedText: ''}, + ]; + /** + * Adds json property to test cases based on args property. + * @param {!Array} testCase The test case to modify. + */ + var addJson = function(testCase) { + testCase.json = {'src': testCase.args[0], 'width': testCase.args[1], + 'height': testCase.args[2]}; + if (testCase.args[3]) { + testCase.json['alt'] = testCase.args[3]; + } + }; + invalidValueTestCases.forEach(addJson); + validValueCreationTestCases.forEach(addJson); + + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue, testCase.expectedText); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldImage, validValueCreationTestCases, invalidValueTestCases, + validTestCaseAssertField); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldImage, validValueCreationTestCases,invalidValueTestCases, + validTestCaseAssertField); + + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueSetValueTestCases = [ + {title: 'Good src', value: 'newSrc', expectedValue: 'newSrc', + expectedText: 'alt'}, + ]; + + suite('setValue', function() { + setup(function() { + this.field = new Blockly.FieldImage('src', 1, 1, 'alt'); + }); + testHelpers.runSetValueTests( + validValueSetValueTestCases, invalidValueTestCases, 'src', 'alt'); + }); + + suite('Customizations', function() { + suite('On Click Handler', function() { + setup(function() { + this.onClick = function() { + console.log('on click'); + }; + }); + 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.isNull(field.clickHandler_); + }); + }); + 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'); + }); + suite('SetAlt', function() { + setup(function() { + this.imageField = new Blockly.FieldImage('src', 10, 10, 'alt'); + }); + test('Null', function() { + this.imageField.setAlt(null); + testHelpers.assertFieldValue(this.imageField, 'src', ''); + }); + test('Empty String', function() { + this.imageField.setAlt(''); + testHelpers.assertFieldValue(this.imageField, 'src', ''); + }); + test('Good Alt', function() { + this.imageField.setAlt('newAlt'); + testHelpers.assertFieldValue(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/static/js/tests/mocha/field_label_serializable_test.js b/static/js/tests/mocha/field_label_serializable_test.js new file mode 100644 index 0000000..c32ae44 --- /dev/null +++ b/static/js/tests/mocha/field_label_serializable_test.js @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Label Serializable Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'String', value: 'value', expectedValue: 'value'}, + {title: 'Boolean true', value: true, expectedValue: 'true'}, + {title: 'Boolean false', value: false, expectedValue: 'false'}, + {title: 'Number (Truthy)', value: 1, expectedValue: '1'}, + {title: 'Number (Falsy)', value: 0, expectedValue: '0'}, + {title: 'NaN', value: NaN, expectedValue: 'NaN'}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'text': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = ''; + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, defaultFieldValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldLabelSerializable, validValueTestCases, + invalidValueTestCases, validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldLabelSerializable, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldLabelSerializable(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + suite('Value -> New Value', function() { + var initialValue = 'oldValue'; + setup(function() { + this.field = new Blockly.FieldLabelSerializable(initialValue); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, initialValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + }); + + suite('Customizations', function() { + function assertHasClass(labelField, cssClass) { + labelField.fieldGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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( + Blockly.utils.Svg.G, {}, null); + labelField.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + labelField.initView(); + chai.assert.isFalse(Blockly.utils.dom.hasClass( + labelField.textElement_, cssClass)); + } + 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( + Blockly.utils.Svg.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/static/js/tests/mocha/field_label_test.js b/static/js/tests/mocha/field_label_test.js new file mode 100644 index 0000000..c9a0a48 --- /dev/null +++ b/static/js/tests/mocha/field_label_test.js @@ -0,0 +1,185 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Label Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'String', value: 'value', expectedValue: 'value'}, + {title: 'Boolean true', value: true, expectedValue: 'true'}, + {title: 'Boolean false', value: false, expectedValue: 'false'}, + {title: 'Number (Truthy)', value: 1, expectedValue: '1'}, + {title: 'Number (Falsy)', value: 0, expectedValue: '0'}, + {title: 'NaN', value: NaN, expectedValue: 'NaN'}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'text': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = ''; + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, defaultFieldValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldLabel, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldLabel, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldLabel(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + suite('Value -> New Value', function() { + var initialValue = 'oldValue'; + setup(function() { + this.field = new Blockly.FieldLabel(initialValue); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, initialValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + }); + + suite('Customizations', function() { + function assertHasClass(labelField, cssClass) { + labelField.fieldGroup_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.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( + Blockly.utils.Svg.G, {}, null); + labelField.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + labelField.initView(); + chai.assert.isFalse(Blockly.utils.dom.hasClass( + labelField.textElement_, cssClass)); + } + + 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( + Blockly.utils.Svg.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/static/js/tests/mocha/field_multilineinput_test.js b/static/js/tests/mocha/field_multilineinput_test.js new file mode 100644 index 0000000..3bf110e --- /dev/null +++ b/static/js/tests/mocha/field_multilineinput_test.js @@ -0,0 +1,156 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Multiline Input Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'Empty string', value: '', expectedValue: ''}, + {title: 'String no newline', value: 'value', expectedValue: 'value'}, + {title: 'String with newline', value: 'bark bark\n bark bark bark\n bark bar bark bark\n', expectedValue: 'bark bark\n bark bark bark\n bark bar bark bark\n'}, + {title: 'Boolean true', value: true, expectedValue: 'true'}, + {title: 'Boolean false', value: false, expectedValue: 'false'}, + {title: 'Number (Truthy)', value: 1, expectedValue: '1'}, + {title: 'Number (Falsy)', value: 0, expectedValue: '0'}, + {title: 'NaN', value: NaN, expectedValue: 'NaN'}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'text': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = ''; + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, defaultFieldValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldMultilineInput, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldMultilineInput, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldMultilineInput(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + suite('Value -> New Value', function() { + var initialValue = 'oldValue'; + setup(function() { + this.field = new Blockly.FieldMultilineInput(initialValue); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, initialValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + }); + + suite('blockToCode', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + }); + const createBlockFn = (value) => { + return (workspace) => { + var block = workspace.newBlock('text_multiline'); + var textField = block.getField('TEXT'); + textField.setValue(value); + return block; + }; + }; + + /** + * Test suites for code generation tests.s + * @type {Array} + */ + const testSuites = [ + {title: 'Dart', generator: Blockly.Dart, + testCases: [ + {title: 'Empty string', expectedCode: '\'\'', + createBlock: createBlockFn('')}, + {title: 'String with newline', expectedCode: '\'bark bark\' + \'\\n\' + \n\' bark bark bark\' + \'\\n\' + \n\' bark bar bark bark\' + \'\\n\' + \n\'\'', + createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, + ]}, + {title: 'JavaScript', generator: Blockly.JavaScript, + testCases: [ + {title: 'Empty string', expectedCode: '\'\'', + createBlock: createBlockFn('')}, + {title: 'String with newline', expectedCode: '\'bark bark\' + \'\\n\' +\n\' bark bark bark\' + \'\\n\' +\n\' bark bar bark bark\' + \'\\n\' +\n\'\'', + createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, + ]}, + {title: 'Lua', generator: Blockly.Lua, + testCases: [ + {title: 'Empty string', expectedCode: '\'\'', + createBlock: createBlockFn('')}, + {title: 'String with newline', expectedCode: '\'bark bark\' .. \'\\n\' ..\n\' bark bark bark\' .. \'\\n\' ..\n\' bark bar bark bark\' .. \'\\n\' ..\n\'\'', + createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, + ]}, + {title: 'PHP', generator: Blockly.PHP, + testCases: [ + {title: 'Empty string', expectedCode: '\'\'', + createBlock: createBlockFn('')}, + {title: 'String with newline', expectedCode: '\'bark bark\' . "\\n" .\n\' bark bark bark\' . "\\n" .\n\' bark bar bark bark\' . "\\n" .\n\'\'', + createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, + ]}, + {title: 'Python', generator: Blockly.Python, + testCases: [ + {title: 'Empty string', expectedCode: '\'\'', + createBlock: createBlockFn('')}, + {title: 'String with newline', expectedCode: '\'bark bark\' + \'\\n\' + \n\' bark bark bark\' + \'\\n\' + \n\' bark bar bark bark\' + \'\\n\' + \n\'\'', + createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, + ]}, + ]; + testHelpers.runCodeGenerationTestSuites(testSuites); + }); +}); diff --git a/static/js/tests/mocha/field_number_test.js b/static/js/tests/mocha/field_number_test.js new file mode 100644 index 0000000..b12cae6 --- /dev/null +++ b/static/js/tests/mocha/field_number_test.js @@ -0,0 +1,335 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Number Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + {title: 'NaN', value: NaN}, + {title: 'Non-Parsable String', value: 'bad'}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'Integer', value: 1, expectedValue: 1}, + {title: 'Float', value: 1.5, expectedValue: 1.5}, + {title: 'Integer String', value: '1', expectedValue: 1}, + {title: 'Float String', value: '1.5', expectedValue: 1.5}, + {title: 'Infinity', value: Infinity, expectedValue: Infinity}, + {title: 'Negative Infinity', value: -Infinity, expectedValue: -Infinity}, + {title: 'Infinity String', value: 'Infinity', expectedValue: Infinity}, + {title: 'Negative Infinity String', value: '-Infinity', + expectedValue: -Infinity}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = Array(4).fill(testCase.value); + testCase.json = {'value': testCase.value, 'min': testCase.value, + 'max': testCase.value, 'precision': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = 0; + /** + * Asserts that the field property values are as expected. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!number} expectedMin The expected min. + * @param {!number} expectedMax The expected max. + * @param {!number} expectedPrecision The expected precision. + * @param {!number} expectedValue The expected value. + */ + function assertNumberField(field, expectedMin, expectedMax, + expectedPrecision, expectedValue) { + testHelpers.assertFieldValue(field, expectedValue); + chai.assert.equal(field.getMin(), expectedMin, 'Min'); + chai.assert.equal(field.getMax(), expectedMax, 'Max'); + chai.assert.equal( + field.getPrecision(), expectedPrecision, 'Precision'); + } + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + assertNumberField(field, -Infinity, Infinity, 0, defaultFieldValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + assertNumberField( + field, testCase.expectedValue, testCase.expectedValue, + testCase.expectedValue, testCase.expectedValue); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldNumber, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldNumber, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldNumber(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue); + }); + suite('Value -> New Value', function() { + var initialValue = 1; + setup(function() { + this.field = new Blockly.FieldNumber(initialValue); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, initialValue); + }); + suite('Constraints', function() { + var testCases = [ + {title: 'Float', json: {}, value: 123.456, expectedValue: 123.456}, + {title: '0.01', json: {precision: .01}, value: 123.456, + expectedValue: 123.46}, + {title: '1e-7', json: {precision: .0000001}, value: 123.00000456, + expectedValue: 123.0000046}, + {title: '0.5', json: {precision: .5}, value: 123.456, + expectedValue: 123.5}, + {title: '1', json: {precision: 1}, value: 123.456, + expectedValue: 123}, + {title: '1.5', json: {precision: 1.5}, value: 123.456, + expectedValue: 123}, + ]; + suite('Precision', function() { + testHelpers.runTestCases(testCases, function(testCase) { + return function() { + var field = Blockly.FieldNumber.fromJson(testCase.json); + field.setValue(testCase.value); + testHelpers.assertFieldValue(field, testCase.expectedValue); + }; + }); + test('Null', function() { + var field = Blockly.FieldNumber.fromJson({precision: null}); + chai.assert.equal(field.getPrecision(), 0); + }); + }); + var setValueBoundsTestFn = function(testCase) { + return function() { + var field = Blockly.FieldNumber.fromJson(testCase.json); + testCase.values.forEach(function(value, i) { + field.setValue(value); + testHelpers.assertFieldValue( + field, testCase.expectedValues[i]); + }); + }; + }; + suite('Min', function() { + var testCases = [ + {title: '-10', json: {min: -10}, values: [-20, 0, 20], + expectedValues: [-10, 0, 20]}, + {title: '0', json: {min: 0}, values: [-20, 0, 20], + expectedValues: [0, 0, 20]}, + {title: '+10', json: {min: 10}, values: [-20, 0, 20], + expectedValues: [10, 10, 20]}, + ]; + testHelpers.runTestCases(testCases, setValueBoundsTestFn); + test('Null', function() { + var field = Blockly.FieldNumber.fromJson({min: null}); + chai.assert.equal(field.getMin(), -Infinity); + }); + }); + suite('Max', function() { + var testCases = [ + {title: '-10', json: {max: -10}, values: [-20, 0, 20], + expectedValues: [-20, -10, -10]}, + {title: '0', json: {max: 0}, values: [-20, 0, 20], + expectedValues: [-20, 0, 0]}, + {title: '+10', json: {max: 10}, values: [-20, 0, 20], + expectedValues: [-20, 0, 10]}, + ]; + testHelpers.runTestCases(testCases, setValueBoundsTestFn); + test('Null', function() { + var field = Blockly.FieldNumber.fromJson({max: null}); + chai.assert.equal(field.getMax(), Infinity); + }); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.field = new Blockly.FieldNumber(1); + this.field.htmlInput_ = Object.create(null); + this.field.htmlInput_.oldValue_ = '1'; + this.field.htmlInput_.untypedDefaultValue_ = 1; + this.stub = sinon.stub(this.field, 'resizeEditor_'); + }); + teardown(function() { + sinon.restore(); + }); + var testSuites = [ + {title: 'Null Validator', + validator: + function() { + return null; + }, + value: 2, expectedValue: 1}, + {title: 'Force End with 6 Validator', + validator: + function(newValue) { + return String(newValue).replace(/.$/, '6'); + }, + value: 25, expectedValue: 26}, + {title: 'Returns Undefined Validator', validator: function() {}, value: 2, + expectedValue: 2}, + ]; + testSuites.forEach(function(suiteInfo) { + suite(suiteInfo.title, function() { + setup(function() { + this.field.setValidator(suiteInfo.validator); + }); + test('When Editing', function() { + this.field.isBeingEdited_ = true; + this.field.htmlInput_.value = String(suiteInfo.value); + this.field.onHtmlInputChange_(null); + testHelpers.assertFieldValue( + this.field, suiteInfo.expectedValue, String(suiteInfo.value)); + }); + test('When Not Editing', function() { + this.field.setValue(suiteInfo.value); + testHelpers.assertFieldValue(this.field, suiteInfo.expectedValue); + }); + }); + }); + }); + 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/static/js/tests/mocha/field_registry_test.js b/static/js/tests/mocha/field_registry_test.js new file mode 100644 index 0000000..29338d5 --- /dev/null +++ b/static/js/tests/mocha/field_registry_test.js @@ -0,0 +1,104 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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']); + }; + + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + if (Blockly.registry.typeMap_['field']['field_custom_test']) { + delete Blockly.registry.typeMap_['field']['field_custom_test']; + } + }); + + suite('Registration', function() { + test('Simple', function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + }); + test('fromJson as Key', function() { + chai.assert.throws(function() { + Blockly.fieldRegistry.register(CustomFieldType.fromJson, ''); + }, 'Invalid name'); + }); + test('No fromJson', function() { + var fromJson = CustomFieldType.fromJson; + delete CustomFieldType.fromJson; + chai.assert.throws(function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + }, 'must have a 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); + }, 'must have a 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' + }; + + // TODO(#4197): Remove stubbing of deprecation warning after fixing. + var deprecationWarnStub = createDeprecationWarningStub(); + var field = Blockly.fieldRegistry.fromJson(json); + deprecationWarnStub.restore(); + + chai.assert.isNotNull(field); + chai.assert.equal(field.getValue(), 'ok'); + }); + 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' + }; + + // TODO(#4197): Remove stubbing of deprecation warning after fixing. + var deprecationWarnStub = createDeprecationWarningStub(); + var field = Blockly.fieldRegistry.fromJson(json); + deprecationWarnStub.restore(); + + chai.assert.isNotNull(field); + chai.assert.equal(field.getValue(), 'ok'); + }); + }); +}); diff --git a/static/js/tests/mocha/field_test.js b/static/js/tests/mocha/field_test.js new file mode 100644 index 0000000..f89193d --- /dev/null +++ b/static/js/tests/mocha/field_test.js @@ -0,0 +1,513 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Abstract Fields', function() { + setup(function() { + sharedTestSetup.call(this); + // TODO(#4197): Remove stubbing of deprecation warning after fixing. + // field.setValue calls trigger a deprecation warning, capture to prevent + // console logs. + createDeprecationWarningStub(); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + 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'); + chai.assert.isTrue(field.isSerializable()); + sinon.assert.calledOnce(stub); + stub.restore(); + }); + test('Editable False, Serializable Default(false)', function() { + // An old non-editable field should not be serialized. + var field = new FieldFalseDefault(); + chai.assert.isFalse(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(); + chai.assert.isTrue(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(); + chai.assert.isTrue(field.isSerializable()); + }); + }); + suite('setValue', function() { + function addSpies(field, excludeSpies = []) { + if (!excludeSpies.includes('doValueInvalid_')) { + sinon.spy(field, 'doValueInvalid_'); + } + if (!excludeSpies.includes('doValueUpdate_')) { + sinon.spy(field, 'doValueUpdate_'); + } + if (!excludeSpies.includes('forceRerender')) { + sinon.spy(field, 'forceRerender'); + } + } + function stubDoValueInvalid(field, isDirty) { + sinon.stub(field, 'doValueInvalid_').callsFake(function(newValue) { + this.isDirty_ = isDirty; + }); + } + function stubDoValueUpdate(field, isDirty) { + sinon.stub(field, 'doValueUpdate_').callsFake(function(newValue) { + this.isDirty_ = isDirty; + }); + } + function setLocalValidatorWithReturn(field, value) { + field.setValidator(function() { + return value; + }); + } + function setLocalValidator(field, isValid) { + if (isValid) { + field.setValidator(function(newValue) { + return newValue; + }); + } else { + setLocalValidatorWithReturn(field, null); + } + } + function stubClassValidatorWithReturn(field, value) { + sinon.stub(field, 'doClassValidation_').returns(value); + } + function stubClassValidator(field, isValid) { + if (isValid) { + sinon.stub(field, 'doClassValidation_').callsFake(function(newValue) { + return newValue; + }); + } else { + stubClassValidatorWithReturn(field, null); + } + } + setup(function() { + this.field = new Blockly.Field(); + this.field.isDirty_ = false; + }); + test('Null', function() { + addSpies(this.field); + this.field.setValue(null); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('No Validators, Dirty (Default)', function() { + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.calledOnce(this.field.forceRerender); + }); + test('No Validators, Not Dirty', function() { + stubDoValueUpdate(this.field, false); + addSpies(this.field, ['doValueUpdate_']); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('Class Validator Returns Invalid, Not Dirty (Default)', function() { + stubClassValidator(this.field, false); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.calledOnce(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('Class Validator Returns Invalid, Dirty', function() { + stubClassValidator(this.field, false); + stubDoValueInvalid(this.field, true); + addSpies(this.field, ['doValueInvalid_']); + this.field.setValue('value'); + sinon.assert.calledOnce(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + sinon.assert.calledOnce(this.field.forceRerender); + }); + test('Class Validator Returns Valid, Not Dirty', function() { + stubClassValidator(this.field, true); + stubDoValueUpdate(this.field, false); + addSpies(this.field, ['doValueUpdate_']); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('Class Validator Returns Valid, Dirty (Default)', function() { + stubClassValidator(this.field, true); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.calledOnce(this.field.forceRerender); + }); + test('Local Validator Returns Invalid, Not Dirty (Default)', function() { + setLocalValidator(this.field, false); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.calledOnce(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('Local Validator Returns Invalid, Dirty', function() { + stubDoValueInvalid(this.field, true); + setLocalValidator(this.field, false); + addSpies(this.field, ['doValueInvalid_']); + this.field.setValue('value'); + sinon.assert.calledOnce(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + sinon.assert.calledOnce(this.field.forceRerender); + }); + test('Local Validator Returns Valid, Not Dirty', function() { + stubDoValueUpdate(this.field, false); + setLocalValidator(this.field, true); + addSpies(this.field, ['doValueUpdate_']); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('Local Validator Returns Valid, Dirty (Default)', function() { + setLocalValidator(this.field, true); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.calledOnce(this.field.forceRerender); + }); + test('New Value Matches Old Value', function() { + this.field.setValue('value'); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('New Value (Class)Validates to Old Value', function() { + this.field.setValue('value'); + stubClassValidatorWithReturn(this.field, 'value'); + addSpies(this.field); + this.field.setValue('notValue'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('New Value (Local)Validates to Old Value', function() { + this.field.setValue('value'); + setLocalValidatorWithReturn(this.field, 'value'); + addSpies(this.field); + this.field.setValue('notValue'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + sinon.assert.notCalled(this.field.forceRerender); + }); + test('New Value (Class)Validates to not Old Value', function() { + this.field.setValue('value'); + stubClassValidatorWithReturn(this.field, 'notValue'); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('New Value (Local)Validates to not Old Value', function() { + this.field.setValue('value'); + setLocalValidatorWithReturn(this.field, 'notValue'); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('Class Validator Returns Null', function() { + stubClassValidatorWithReturn(this.field, null); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.calledOnce(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + }); + test('Class Validator Returns Same', function() { + sinon.stub(this.field, 'doClassValidation_').callsFake( + function(newValue) { + return newValue; + }); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('Class Validator Returns Different', function() { + stubClassValidatorWithReturn(this.field, 'differentValue'); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('Class Validator Returns Undefined', function() { + stubClassValidatorWithReturn(this.field, undefined); + addSpies(this.field); + this.field.setValue('value'); + chai.assert.equal(this.field.getValue(), 'value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('Local Validator Returns Null', function() { + setLocalValidatorWithReturn(this.field, null); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.calledOnce(this.field.doValueInvalid_); + sinon.assert.notCalled(this.field.doValueUpdate_); + }); + test('Local Validator Returns Same', function() { + this.field.setValidator(function(newValue) { + return newValue; + }); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('Local Validator Returns Different', function() { + setLocalValidatorWithReturn(this.field, 'differentValue'); + addSpies(this.field); + this.field.setValue('value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + test('Local Validator Returns Undefined', function() { + setLocalValidatorWithReturn(this.field, undefined); + addSpies(this.field); + this.field.setValue('value'); + chai.assert.equal(this.field.getValue(), 'value'); + sinon.assert.notCalled(this.field.doValueInvalid_); + sinon.assert.calledOnce(this.field.doValueUpdate_); + }); + }); + 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() { + addMessageToCleanup(this.sharedCleanup, 'TOOLTIP'); + Blockly.Msg['TOOLTIP'] = 'test 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(new Blockly.Options({})); + this.workspace.createDom(); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('Before Append', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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'); + }); + test('After Append', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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'); + }); + test('After Block Creation', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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'); + }); + test('Dynamic Function', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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); + }); + test('Element', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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); + }); + test('Null', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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); + }); + test('Undefined', function() { + addBlockTypeToCleanup(this.sharedCleanup, 'tooltip'); + 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); + }); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/field_textinput_test.js b/static/js/tests/mocha/field_textinput_test.js new file mode 100644 index 0000000..10a2b01 --- /dev/null +++ b/static/js/tests/mocha/field_textinput_test.js @@ -0,0 +1,218 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Text Input Fields', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + {title: 'Undefined', value: undefined}, + {title: 'Null', value: null}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'String', value: 'value', expectedValue: 'value'}, + {title: 'Boolean true', value: true, expectedValue: 'true'}, + {title: 'Boolean false', value: false, expectedValue: 'false'}, + {title: 'Number (Truthy)', value: 1, expectedValue: '1'}, + {title: 'Number (Falsy)', value: 0, expectedValue: '0'}, + {title: 'NaN', value: NaN, expectedValue: 'NaN'}, + ]; + var addArgsAndJson = function(testCase) { + testCase.args = [testCase.value]; + testCase.json = {'text': testCase.value}; + }; + invalidValueTestCases.forEach(addArgsAndJson); + validValueTestCases.forEach(addArgsAndJson); + + /** + * The expected default value for the field being tested. + * @type {*} + */ + var defaultFieldValue = ''; + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, defaultFieldValue); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, testCase.expectedValue); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldTextInput, validValueTestCases, invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldTextInput, validValueTestCases,invalidValueTestCases, + validTestCaseAssertField, assertFieldDefault); + + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.field = new Blockly.FieldTextInput(); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, defaultFieldValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + suite('Value -> New Value', function() { + var initialValue = 'oldValue'; + setup(function() { + this.field = new Blockly.FieldTextInput(initialValue); + }); + testHelpers.runSetValueTests( + validValueTestCases, invalidValueTestCases, initialValue); + test('With source block', function() { + this.field.setSourceBlock(createTestBlock()); + this.field.setValue('value'); + testHelpers.assertFieldValue(this.field, 'value'); + }); + }); + }); + + suite('Validators', function() { + setup(function() { + this.field = new Blockly.FieldTextInput('value'); + this.field.htmlInput_ = Object.create(null); + this.field.htmlInput_.oldValue_ = 'value'; + this.field.htmlInput_.untypedDefaultValue_ = 'value'; + this.stub = sinon.stub(this.field, 'resizeEditor_'); + }); + teardown(function() { + sinon.restore(); + }); + var testSuites = [ + {title: 'Null Validator', + validator: + function() { + return null; + }, + value: 'newValue', expectedValue: 'value'}, + {title: 'Remove \'a\' Validator', + validator: + function(newValue) { + return newValue.replace(/a/g, ''); + }, + value: 'bbbaaa', expectedValue: 'bbb'}, + {title: 'Returns Undefined Validator', validator: function() {}, + value: 'newValue', expectedValue: 'newValue', expectedText: 'newValue'}, + ]; + testSuites.forEach(function(suiteInfo) { + suite(suiteInfo.title, function() { + setup(function() { + this.field.setValidator(suiteInfo.validator); + }); + test('When Editing', function() { + this.field.isBeingEdited_ = true; + this.field.htmlInput_.value = suiteInfo.value; + this.field.onHtmlInputChange_(null); + testHelpers.assertFieldValue( + this.field, suiteInfo.expectedValue, suiteInfo.value); + }); + test('When Not Editing', function() { + this.field.setValue(suiteInfo.value); + testHelpers.assertFieldValue(this.field, suiteInfo.expectedValue); + }); + }); + }); + }); + + suite('Customization', function() { + suite('Spellcheck', function() { + setup(function() { + this.prepField = function(field) { + var workspace = { + getScale: function() { + return 1; + }, + getRenderer: function() { return { + getClassName: function() { return ''; } + }; }, + getTheme: function() { return { + getClassName: 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/static/js/tests/mocha/field_variable_test.js b/static/js/tests/mocha/field_variable_test.js new file mode 100644 index 0000000..285c1d6 --- /dev/null +++ b/static/js/tests/mocha/field_variable_test.js @@ -0,0 +1,380 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Variable Fields', function() { + var FAKE_VARIABLE_NAME = 'default_name'; + var FAKE_ID = 'id1'; + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + // Stub for default variable name. + sinon.stub(Blockly.Variables, 'generateUniqueName') + .returns(FAKE_VARIABLE_NAME); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + /** + * Configuration for field creation tests with invalid values. + * @type {!Array} + */ + var invalidValueCreationTestCases = [ + {title: 'Undefined', value: undefined, args: [undefined]}, + {title: 'Null', value: null, args: [null]}, + {title: 'Boolean true', value: true, args: [true]}, + {title: 'Boolean false', value: false, args: [false]}, + {title: 'Number (Truthy)', value: 1, args: [1]}, + {title: 'Number (Falsy)', value: 0, args: [0]}, + {title: 'NaN', value: NaN, args: [NaN]}, + ]; + /** + * Configuration for field creation tests with valid values. + * @type {!Array} + */ + var validValueCreationTestCases = [ + {title: 'String', value: 'id2', args: ['name2'], + expectedValue: 'id2', expectedText: 'name2'}, + ]; + var addJson = function(testCase) { + testCase.json = {'variable': testCase.args[0]}; + }; + invalidValueCreationTestCases.forEach(addJson); + validValueCreationTestCases.forEach(addJson); + + var initVariableField = (workspace, fieldVariable) => { + var mockBlock = createTestBlock(); + mockBlock.workspace = workspace; + fieldVariable.setSourceBlock(mockBlock); + + // No view to initialize, but still need to init the model. + var genUidStub = createGenUidStubWithReturns(FAKE_ID); + fieldVariable.initModel(); + genUidStub.restore(); + + return fieldVariable; + }; + var customCreateWithJs = function(testCase) { + var fieldVariable = testCase ? new Blockly.FieldVariable(...testCase.args) : + new Blockly.FieldVariable(); + return initVariableField(this.workspace, fieldVariable); + }; + var customCreateWithJson = function(testCase) { + var fieldVariable = testCase ? + Blockly.FieldVariable.fromJson(testCase.json) : + Blockly.FieldVariable.fromJson({}); + return initVariableField(this.workspace, fieldVariable); + }; + + /** + * The expected default name for the field being tested. + * @type {*} + */ + var defaultFieldName = FAKE_VARIABLE_NAME; + /** + * Asserts that the field property values are set to default. + * @param {!Blockly.FieldNumber} field The field to check. + */ + var assertFieldDefault = function(field) { + testHelpers.assertFieldValue(field, FAKE_ID, defaultFieldName); + }; + /** + * Asserts that the field properties are correct based on the test case. + * @param {!Blockly.FieldNumber} field The field to check. + * @param {!FieldValueTestCase} testCase The test case. + */ + var validTestCaseAssertField = function(field, testCase) { + testHelpers.assertFieldValue(field, FAKE_ID, testCase.expectedText); + }; + + testHelpers.runConstructorSuiteTests( + Blockly.FieldVariable, validValueCreationTestCases, + invalidValueCreationTestCases, + validTestCaseAssertField, assertFieldDefault, customCreateWithJs); + + testHelpers.runFromJsonSuiteTests( + Blockly.FieldVariable, validValueCreationTestCases, + invalidValueCreationTestCases, + validTestCaseAssertField, assertFieldDefault, customCreateWithJson); + + suite('initModel', function() { + test('No Value Before InitModel', function() { + var fieldVariable = new Blockly.FieldVariable('name1'); + chai.assert.equal(fieldVariable.getText(), ''); + chai.assert.isNull(fieldVariable.getValue()); + }); + }); + + + /** + * Configuration for field tests with invalid values. + * @type {!Array} + */ + var invalidValueTestCases = [ + ...invalidValueCreationTestCases, + {title: 'Variable does not exist', value: 'id3', args: ['name2'], + expectedValue: 'id2', expectedText: 'name2'}, + ]; + /** + * Configuration for field tests with valid values. + * @type {!Array} + */ + var validValueTestCases = [ + {title: 'New variable ID', value: 'id2', args: ['name2'], + expectedValue: 'id2', expectedText: 'name2'}, + ]; + + suite('setValue', function() { + setup(function() { + this.workspace.createVariable('name2', null, 'id2'); + this.field = new Blockly.FieldVariable(null); + initVariableField(this.workspace, this.field); + + // Invalid value test are expected to log errors. + const nativeConsoleWarn = console.warn; + this.nativeConsoleWarn = nativeConsoleWarn; + console.warn = function(msg) { + if (!msg.includes('Variable id doesn\'t point to a real variable')) { + nativeConsoleWarn.call(this, ...arguments); + } + }; + }); + teardown(function() { + console.warn = this.nativeConsoleWarn; + }); + testHelpers.runSetValueTests(validValueTestCases, invalidValueTestCases, + FAKE_ID, defaultFieldName); + }); + + suite('Dropdown options', function() { + var assertDropdownContents = (fieldVariable, expectedVarOptions) => { + var dropdownOptions = Blockly.FieldVariable.dropdownCreate.call( + fieldVariable); + // Expect variable options, a rename option, and a delete option. + chai.assert.lengthOf(dropdownOptions, expectedVarOptions.length + 2); + for (let i = 0, option; (option = expectedVarOptions[i]); i++) { + chai.assert.deepEqual(dropdownOptions[i], option); + } + chai.assert.include( + dropdownOptions[dropdownOptions.length - 2][0], 'Rename'); + + chai.assert.include( + dropdownOptions[dropdownOptions.length - 1][0], 'Delete'); + }; + test('Contains variables created before field', function() { + this.workspace.createVariable('name1', '', 'id1'); + this.workspace.createVariable('name2', '', 'id2'); + // Expect that the dropdown options will contain the variables that exist + var fieldVariable = initVariableField( + this.workspace, new Blockly.FieldVariable('name2')); + assertDropdownContents(fieldVariable, + [['name1', 'id1'], ['name2', 'id2']]); + }); + test('Contains variables created after field', function() { + // Expect that the dropdown options will contain the variables that exist + var fieldVariable = initVariableField( + this.workspace, new Blockly.FieldVariable('name1')); + // Expect that variables created after field creation will show up too. + this.workspace.createVariable('name2', '', 'id2'); + assertDropdownContents(fieldVariable, + [['name1', 'id1'], ['name2', 'id2']]); + }); + test('Contains variables created before and after field', function() { + this.workspace.createVariable('name1', '', 'id1'); + this.workspace.createVariable('name2', '', 'id2'); + // Expect that the dropdown options will contain the variables that exist + var fieldVariable = initVariableField( + this.workspace, new Blockly.FieldVariable('name1')); + // Expect that variables created after field creation will show up too. + this.workspace.createVariable('name3', '', 'id3'); + assertDropdownContents(fieldVariable, + [['name1', 'id1'], ['name2', 'id2'], ['name3', 'id3']]); + }); + }); + + 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 = initVariableField( + this.workspace, new Blockly.FieldVariable('name1')); + }); + suite('Null Validator', function() { + setup(function() { + this.variableField.setValidator(function() { + return null; + }); + }); + test('New Value', function() { + this.variableField.setValue('id2'); + testHelpers.assertFieldValue(this.variableField, 'id1', 'name1'); + }); + }); + 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'); + testHelpers.assertFieldValue(this.variableField, 'id2', 'name2'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.variableField.setValidator(function() {}); + }); + test('New Value', function() { + this.variableField.setValue('id2'); + testHelpers.assertFieldValue(this.variableField, 'id2', 'name2'); + }); + }); + }); + + 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_(); + chai.assert.deepEqual(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_(); + chai.assert.deepEqual(resultTypes, ['type1', 'type2']); + chai.assert.equal(fieldVariable.defaultType_, 'type1', + 'Default type was wrong'); + }); + 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 = createTestBlock(); + mockBlock.workspace = this.workspace; + fieldVariable.setSourceBlock(mockBlock); + fieldVariable.variableTypes = null; + + var resultTypes = fieldVariable.getVariableTypes_(); + // The empty string is always one of the options. + chai.assert.deepEqual(resultTypes, ['type1', 'type2', '']); + }); + test('variableTypes is the empty list', function() { + var fieldVariable = new Blockly.FieldVariable('name1'); + var mockBlock = createTestBlock(); + mockBlock.workspace = 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'); + chai.assert.equal(fieldVariable.defaultType_, 'b', + 'The variable field\'s default type should be "b"'); + }); + test('No default type', function() { + var fieldVariable = new Blockly.FieldVariable(null); + chai.assert.equal(fieldVariable.defaultType_, '', 'The variable field\'s default type should be the empty string'); + chai.assert.isNull(fieldVariable.variableTypes, + 'The variable field\'s allowed types should be null'); + }); + test('Default type mismatch', function() { + // Invalid default type when creating a variable field. + chai.assert.throws(function() { + 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() { + 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'); + }); + 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/static/js/tests/mocha/flyout_test.js b/static/js/tests/mocha/flyout_test.js new file mode 100644 index 0000000..ff6d200 --- /dev/null +++ b/static/js/tests/mocha/flyout_test.js @@ -0,0 +1,274 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Flyout', function() { + setup(function() { + sharedTestSetup.call(this); + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "default" + } + ] + }]); + this.toolboxXml = document.getElementById('toolbox-simple'); + this.workspace = Blockly.inject('blocklyDiv', + { + toolbox: this.toolboxXml + }); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('position', function() { + suite('vertical flyout', function() { + suite('simple flyout', function() { + setup(function() { + this.flyout = this.workspace.getFlyout(); + }); + test('y is always 0', function() { + chai.assert.equal(this.flyout.getY(), 0, 'y coordinate in vertical flyout should be 0'); + }); + test('x is right of workspace if flyout at right', function() { + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + viewWidth: 100, + }); + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT; + chai.assert.equal(this.flyout.getX(), 100, 'x should be right of workspace'); + }); + test('x is 0 if flyout at left', function() { + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_LEFT; + chai.assert.equal(this.flyout.getX(), 0, 'x should be 0 if the flyout is on the left'); + }); + }); + suite('toolbox flyout', function() { + setup(function() { + var toolbox = document.getElementById('toolbox-categories'); + this.workspace = Blockly.inject('blocklyDiv', + { + toolbox: toolbox + }); + this.flyout = this.workspace.getToolbox().getFlyout(); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('x is aligned with toolbox at left', function() { + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + toolboxWidth: 20, + }); + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_LEFT; + chai.assert.equal(this.flyout.getX(), 20, 'x should be aligned with toolbox'); + }); + test('x is aligned with toolbox at right', function() { + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + toolboxWidth: 20, + viewWidth: 100, + }); + this.flyout.width_ = 10; + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT; + chai.assert.equal(this.flyout.getX(), 90,'x + width should be aligned with toolbox'); + }); + }); + // These tests simulate a trashcan flyout, i.e. the flyout under test is on the + // opposite side of the workspace toolbox setting. + suite('trashcan flyout', function() { + setup(function() { + this.flyout = this.workspace.getFlyout(); + }); + test('x is 0 if trashcan on left', function() { + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + viewWidth: 100, + }); + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_LEFT; + chai.assert.equal(this.flyout.getX(), 0, 'x should be aligned with left edge'); + }); + test('trashcan on right covers right edge of workspace', function() { + this.flyout.width_ = 20; + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + viewWidth: 100, + absoluteLeft: 10, + }); + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT; + chai.assert.equal(this.flyout.getX(), 90, 'x + width should be aligned with right edge'); + }); + }); + }); + + suite('horizontal flyout', function() { + setup(function() { + this.workspace = Blockly.inject('blocklyDiv', + { + toolbox: this.toolboxXml, + horizontalLayout: true, + }); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + suite('simple flyout', function() { + setup(function() { + this.flyout = this.workspace.getFlyout(); + }); + test('x is always 0', function() { + chai.assert.equal(this.flyout.getX(), 0, 'x coordinate in horizontal flyout should be 0'); + }); + test('y is 0 if flyout at top', function() { + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_TOP; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_TOP; + chai.assert.equal(this.flyout.getY(), 0, 'y should be 0 if flyout is at the top'); + }); + test('y is below workspace if flyout at bottom', function() { + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_BOTTOM; + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + viewHeight: 50, + }); + chai.assert.equal(this.flyout.getY(), 50, 'y should be below the workspace'); + }); + }); + suite('toolbox flyout', function() { + setup(function() { + var toolbox = document.getElementById('toolbox-categories'); + this.workspace = Blockly.inject('blocklyDiv', + { + toolbox: toolbox, + horizontalLayout: true, + }); + this.flyout = this.workspace.getToolbox().getFlyout(); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('y is aligned with toolbox at top', function() { + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + toolboxHeight: 20, + }); + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_TOP; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_TOP; + chai.assert.equal(this.flyout.getY(), 20, 'y should be aligned with toolbox'); + }); + test('y is aligned with toolbox at bottom', function() { + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + toolboxHeight: 20, + viewHeight: 100, + }); + this.flyout.height_ = 30; + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_BOTTOM; + chai.assert.equal(this.flyout.getY(), 70, 'y + height should be aligned with toolbox'); + }); + }); + // These tests simulate a trashcan flyout, i.e. the flyout under test is on the + // opposite side of the workspace toolbox setting. + suite('trashcan flyout', function() { + setup(function() { + this.flyout = this.workspace.getFlyout(); + }); + test('y is 0 if trashcan at top', function() { + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_TOP; + chai.assert.equal(this.flyout.getY(), 0, 'y should be aligned with top'); + }); + test('trashcan on bottom covers bottom of workspace', function() { + this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_TOP; + this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_BOTTOM; + sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ + viewHeight: 50, + absoluteTop: 10, + }); + this.flyout.height_ = 20; + chai.assert.equal(this.flyout.getY(), 40, 'y + height should be aligned with bottom'); + }); + }); + }); + }); + + suite('createFlyoutInfo_', function() { + setup(function() { + this.simpleToolboxJSON = getSimpleJSON(); + this.flyout = this.workspace.getFlyout(); + this.createFlyoutSpy = sinon.spy(this.flyout, 'createFlyoutInfo_'); + + }); + + function checkLayoutContents(actual, expected, opt_message) { + chai.assert.equal(actual.length, expected.length, opt_message); + for (var i = 0; i < actual.length; i++) { + chai.assert.equal(actual[i].type, expected[i].type, opt_message); + if (actual[i].type == 'BLOCK') { + chai.assert.typeOf(actual[i]['block'], 'Blockly.Block'); + } else if (actual[i].type == 'BUTTON' || actual[i].type == 'LABEL') { + chai.assert.typeOf(actual[i]['block'], 'Blockly.FlyoutButton'); + } + } + } + + function checkFlyoutInfo(flyoutSpy) { + var expectedContents = [ + {type: "block"}, + {type: "button"}, + {type: "button"} + ]; + var expectedGaps = [20,24,24]; + var flyoutInfo = flyoutSpy.returnValues[0]; + var contents = flyoutInfo.contents; + var gaps = flyoutInfo.gaps; + chai.assert.deepEqual(gaps, expectedGaps); + checkLayoutContents(contents, expectedContents, 'Contents'); + } + + test('Node', function() { + this.flyout.show(this.toolboxXml); + checkFlyoutInfo(this.createFlyoutSpy); + }); + test('NodeList', function() { + var nodeList = document.getElementById('toolbox-simple').childNodes; + this.flyout.show(nodeList); + checkFlyoutInfo(this.createFlyoutSpy); + }); + test('Array of JSON', function() { + this.flyout.show(this.simpleToolboxJSON); + checkFlyoutInfo(this.createFlyoutSpy); + }); + test('Array of xml', function() { + this.flyout.show(getXmlArray()); + checkFlyoutInfo(this.createFlyoutSpy); + }); + test('Custom Toolbox: No Category Available', function() { + chai.assert.throws(function() { + this.flyout.show('someString'); + }.bind(this), 'Couldn\'t find a callback function when opening' + + ' a toolbox category.'); + }); + test('Custom Toolbox: Function does not return array', function() { + sinon.stub(this.flyout.workspace_.targetWorkspace, + 'getToolboxCategoryCallback').returns(function(){return null;}); + chai.assert.throws(function() { + this.flyout.show('someString'); + }.bind(this), 'Result of toolbox category callback must be an array.'); + }); + test('Custom Toolbox: Returns Array', function() { + sinon.stub(this.flyout.workspace_.targetWorkspace, + 'getToolboxCategoryCallback').returns(function(){return getXmlArray();}); + chai.assert.doesNotThrow(function() { + this.flyout.show('someString'); + }.bind(this)); + }); + }); +}); diff --git a/static/js/tests/mocha/generator_test.js b/static/js/tests/mocha/generator_test.js new file mode 100644 index 0000000..9250557 --- /dev/null +++ b/static/js/tests/mocha/generator_test.js @@ -0,0 +1,150 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.require('Blockly.Dart'); +goog.require('Blockly.JavaScript'); +goog.require('Blockly.Lua'); +goog.require('Blockly.PHP'); +goog.require('Blockly.Python'); + +suite('Generator', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('prefix', function() { + setup(function() { + this.generator = new Blockly.Generator('INTERCAL'); + }); + + test('Nothing', function() { + chai.assert.equal(this.generator.prefixLines('', ''), ''); + }); + + test('One word', function() { + chai.assert.equal(this.generator.prefixLines('Hello', '@'), '@Hello') ; + }); + + test('One line', function() { + chai.assert.equal(this.generator.prefixLines('Hello\n', '12'), '12Hello\n'); + }); + + test('Two lines', function() { + chai.assert.equal(this.generator.prefixLines('Hello\nWorld\n', '***'), '***Hello\n***World\n'); + }); + }); + + suite('blockToCode', function() { + setup(function() { + 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 + }]); + var rowBlock = this.workspace.newBlock('row_block'); + var stackBlock = this.workspace.newBlock('stack_block'); + + this.blockToCodeTest = function( + generator, blockDisabled, opt_thisOnly, + expectedCode, opt_message) { + generator.row_block = function(_){return 'row_block';}; + generator.stack_block = function(_){return 'stack_block';}; + rowBlock.nextConnection.connect(stackBlock.previousConnection); + rowBlock.disabled = blockDisabled; + + var code = generator.blockToCode(rowBlock, opt_thisOnly); + chai.assert.equal(code, expectedCode, opt_message); + }; + }); + + var testCase = [ + [Blockly.Dart, 'Dart'], + [Blockly.JavaScript, 'JavaScript'], + [Blockly.Lua, 'Lua'], + [Blockly.PHP, 'PHP'], + [Blockly.Python, 'Python']]; + + suite('Trivial', function() { + testCase.forEach(function(testCase) { + var generator = testCase[0]; + var name = testCase[1]; + test(name, function() { + this.blockToCodeTest(generator, false, true, 'row_block'); + this.blockToCodeTest( + generator, false, false, 'row_blockstack_block', 'thisOnly=false'); + }); + }); + }); + + suite('Disabled block', function() { + testCase.forEach(function(testCase) { + var generator = testCase[0]; + var name = testCase[1]; + test(name, function() { + this.blockToCodeTest(generator, true, true, ''); + this.blockToCodeTest(generator, true, false, 'stack_block', 'thisOnly=false'); + }); + }); + }); + + suite('Nested block', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "test_loop_block", + "message0": "Repeat Loop", + "message1": "%1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null + }]); + var blockA = this.workspace.newBlock('test_loop_block'); + var blockB = this.workspace.newBlock('test_loop_block'); + var blockC = this.workspace.newBlock('test_loop_block'); + this.loopTest = function( + generator, opt_thisOnly, expectedCode, opt_message) { + generator.test_loop_block = function(block){ + return '{' + generator.statementToCode(block, 'DO') + '}'; + }; + blockA.getInput('DO').connection.connect(blockB.previousConnection); + blockA.nextConnection.connect(blockC.previousConnection); + + var code = generator.blockToCode(blockA, opt_thisOnly); + chai.assert.equal(code, expectedCode, opt_message); + }; + }); + + testCase.forEach(function(testCase) { + var generator = testCase[0]; + var name = testCase[1]; + test(name, function() { + this.loopTest(generator, true, '{ {}}'); + this.loopTest(generator, false, '{ {}}{}', 'thisOnly=false'); + }); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/gesture_test.js b/static/js/tests/mocha/gesture_test.js new file mode 100644 index 0000000..71c84cb --- /dev/null +++ b/static/js/tests/mocha/gesture_test.js @@ -0,0 +1,103 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Tests for gesture. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +suite('Gesture', function() { + function testGestureIsFieldClick(block, isFieldClick, eventsFireStub){ + var field = block.getField('NAME'); + var eventTarget = field.getClickTarget_(); + chai.assert.exists(eventTarget, + 'Precondition: missing click target for field'); + + eventsFireStub.resetHistory(); + dispatchPointerEvent(eventTarget, 'pointerdown'); + + var fieldWorkspace = field.sourceBlock_.workspace; + // Gestures triggered on flyouts are stored on targetWorkspace. + var gestureWorkspace = fieldWorkspace.targetWorkspace || fieldWorkspace; + var gesture = gestureWorkspace.currentGesture_; + chai.assert.exists(gesture, 'Gesture exists after pointerdown.'); + var isFieldClickSpy = sinon.spy(gesture, 'isFieldClick_'); + + dispatchPointerEvent(eventTarget, 'pointerup'); + dispatchPointerEvent(eventTarget, 'click'); + + sinon.assert.called(isFieldClickSpy); + chai.assert.isTrue(isFieldClickSpy.alwaysReturned(isFieldClick)); + + + assertEventFired(eventsFireStub, Blockly.Events.Selected, + {oldElementId: null, newElementId: block.id}, fieldWorkspace.id); + assertEventNotFired(eventsFireStub, Blockly.Events.Click, {}); + } + + function getTopFlyoutBlock(flyout) { + return flyout.workspace_.topBlocks_[0]; + } + + setup(function() { + sharedTestSetup.call(this); + defineBasicBlockWithField(this.sharedCleanup); + var toolbox = document.getElementById('gesture-test-toolbox'); + this.workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + test('Constructor', function() { + var e = { id: 'dummy_test_event'}; + var gesture = new Blockly.Gesture(e, this.workspace); + chai.assert.equal(gesture.mostRecentEvent_, e); + chai.assert.equal(gesture.creatorWorkspace_, this.workspace); + }); + + test('Field click - Click in workspace', function() { + var block = this.workspace.newBlock('test_field_block'); + block.initSvg(); + block.render(); + + testGestureIsFieldClick(block, true, this.eventsFireStub); + }); + + test('Field click - Auto close flyout', function() { + var flyout = this.workspace.flyout_; + chai.assert.exists(this.workspace.flyout_, + 'Precondition: missing flyout'); + flyout.autoClose = true; + + var block = getTopFlyoutBlock(flyout); + testGestureIsFieldClick(block, false, this.eventsFireStub); + }); + + test('Field click - Always open flyout', function() { + var flyout = this.workspace.flyout_; + chai.assert.exists(this.workspace.flyout_, + 'Precondition: missing flyout'); + flyout.autoClose = false; + + var block = getTopFlyoutBlock(flyout); + testGestureIsFieldClick(block, true, this.eventsFireStub); + }); + + test('Shift click in accessibility mode - moves the cursor', function() { + this.workspace.keyboardAccessibilityMode = true; + + var eventTarget = this.workspace.svgGroup_; + simulateClick(eventTarget, {shiftKey: true}); + + var cursor = this.workspace.getCursor(); + var cursorNode = cursor.getCurNode(); + chai.assert.exists(cursorNode); + chai.assert.equal(cursorNode.getType(), Blockly.ASTNode.types.WORKSPACE); + }); +}); diff --git a/static/js/tests/mocha/index.html b/static/js/tests/mocha/index.html new file mode 100644 index 0000000..bd9cde0 --- /dev/null +++ b/static/js/tests/mocha/index.html @@ -0,0 +1,181 @@ + + + + + Mocha Tests for Blockly + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + diff --git a/static/js/tests/mocha/input_test.js b/static/js/tests/mocha/input_test.js new file mode 100644 index 0000000..c135bfe --- /dev/null +++ b/static/js/tests/mocha/input_test.js @@ -0,0 +1,291 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Inputs', function() { + setup(function() { + sharedTestSetup.call(this); + 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() { + sharedTestTeardown.call(this); + }); + 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); + sinon.assert.calledOnce(setBlockSpy); + chai.assert.equal(setBlockSpy.getCall(0).args[0], this.block); + sinon.assert.calledOnce(initSpy); + sinon.assert.calledOnce(this.renderStub); + sinon.assert.calledOnce(this.bumpNeighboursStub); + + 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); + sinon.assert.calledOnce(setBlockSpy); + chai.assert.equal(setBlockSpy.getCall(0).args[0], this.block); + sinon.assert.calledOnce(initModelSpy); + sinon.assert.notCalled(this.renderStub); + sinon.assert.notCalled(this.bumpNeighboursStub); + + 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'); + sinon.assert.calledOnce(disposeSpy); + sinon.assert.calledOnce(this.renderStub); + sinon.assert.calledOnce(this.bumpNeighboursStub); + }); + 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'); + sinon.assert.calledOnce(disposeSpy); + sinon.assert.notCalled(this.renderStub); + sinon.assert.notCalled(this.bumpNeighboursStub); + }); + }); + 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/static/js/tests/mocha/insertion_marker_test.js b/static/js/tests/mocha/insertion_marker_test.js new file mode 100644 index 0000000..629ac2c --- /dev/null +++ b/static/js/tests/mocha/insertion_marker_test.js @@ -0,0 +1,380 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('InsertionMarkers', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = Blockly.inject('blocklyDiv', {}); + Blockly.defineBlocksWithJsonArray([ + { + "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() { + sharedTestTeardown.call(this); + }); + suite('Code Generation', function() { + setup(function() { + Blockly.JavaScript['stack_block'] = function(block) { + return 'stack[' + block.id + '];\n'; + }; + Blockly.JavaScript['row_block'] = function(block) { + var value = Blockly.JavaScript + .valueToCode(block, 'INPUT', Blockly.JavaScript.ORDER_NONE); + var code = 'row[' + block.id + '](' + value + ')'; + return [code, Blockly.JavaScript.ORDER_NONE]; + }; + Blockly.JavaScript['statement_block'] = function(block) { + return 'statement[' + block.id + ']{\n' + Blockly.JavaScript + .statementToCode(block, 'STATEMENT') + '};\n'; + }; + + this.assertGen = function(xml, expectedCode) { + Blockly.Xml.domToWorkspace(xml, this.workspace); + var block = this.workspace.getBlockById('insertion'); + block.isInsertionMarker_ = true; + var code = Blockly.JavaScript.workspaceToCode(this.workspace); + chai.assert.equal(code, expectedCode); + }; + }); + teardown(function() { + delete Blockly.JavaScript['stack_block']; + delete Blockly.JavaScript['row_block']; + delete Blockly.JavaScript['statement_block']; + }); + test('Marker Surrounds', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'statement[a]{\n};\n'); + }); + test('Marker Enclosed', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'statement[a]{\n};\n'); + }); + test('Marker Enclosed and Surrounds', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, + 'statement[a]{\n' + + ' statement[b]{\n' + + ' };\n' + + '};\n'); + }); + test('Marker Prev', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'stack[a];\n'); + }); + test('Marker Next', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'stack[a];\n'); + }); + test('Marker Middle of Stack', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, + 'stack[a];\n' + + 'stack[b];\n'); + }); + test('Marker On Output', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'row[a]();\n'); + }); + test('Marker On Input', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'row[a]();\n'); + }); + test('Marker Middle of Row', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'row[a](row[b]());\n'); + }); + test('Marker Detatched', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + this.assertGen(xml, 'stack[a];\n'); + }); + }); + suite('Serialization', function() { + setup(function() { + this.assertXml = function(xml, expectXml) { + Blockly.Xml.domToWorkspace(xml, this.workspace); + var block = this.workspace.getBlockById('insertion'); + block.setInsertionMarker(true); + var xml = Blockly.Xml.workspaceToDom(this.workspace); + Blockly.Xml.domToWorkspace(xml, this.workspace); + xml = Blockly.Xml.domToText(xml); + chai.assert.equal(xml, expectXml); + }; + }); + test('Marker Surrounds', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + // Note how the x and y are not 20, they are slightly lower and end-er + // because these are the coords of the wrapped block. + this.assertXml(xml, + '' + + '' + + ''); + }); + test('Marker Enclosed', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + ''); + }); + test('Marker Enclosed and Surrounds', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + '' + + '' + + '' + + '' + + ''); + }); + test('Marker Prev', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + // Note how the y coord is not at 20, it is lower. This is because these + // are the coords of the next block. + this.assertXml(xml, + '' + + '' + + ''); + }); + test('Marker Next', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + ''); + }); + test('Marker Middle of Stack', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + '' + + '' + + '' + + '' + + ''); + }); + test('Marker On Output', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + // Note how the x value is not at 20. This is because these are the coords + // of the wrapped block. + this.assertXml(xml, + '' + + '' + + ''); + }); + test('Marker On Input', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + ''); + }); + test('Marker Middle of Row', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + '' + + '' + + '' + + '' + + ''); + }); + test('Marker Detatched', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + this.assertXml(xml, + '' + + '' + + ''); + }); + }); +}); diff --git a/static/js/tests/mocha/json_test.js b/static/js/tests/mocha/json_test.js new file mode 100644 index 0000000..d787d72 --- /dev/null +++ b/static/js/tests/mocha/json_test.js @@ -0,0 +1,281 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('JSON Block Definitions', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace_ = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('defineBlocksWithJsonArray', function() { + test('Basic block', function() { + /** Ensure a block can be instantiated from a JSON definition. */ + var BLOCK_TYPE = 'test_json_minimal'; + var block; + assertNoWarnings(() => { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE + }]); + block = new Blockly.Block(this.workspace_, BLOCK_TYPE); + }); + + chai.assert.isNotNull(block); + chai.assert.equal(BLOCK_TYPE, block.type); + }); + + test('Null or undefined type id', function() { + var BLOCK_TYPE1 = 'test_json_before_bad_blocks'; + var BLOCK_TYPE2 = 'test_json_after_bad_blocks'; + + chai.assert.isUndefined(Blockly.Blocks[BLOCK_TYPE1]); + chai.assert.isUndefined(Blockly.Blocks[BLOCK_TYPE2]); + var blockTypeCount = Object.keys(Blockly.Blocks).length; + + assertWarnings(() => { + Blockly.defineBlocksWithJsonArray([ + {"type": BLOCK_TYPE1}, + {"type": undefined}, + {"type": null}, + {"type": BLOCK_TYPE2}]); + }, [/missing a type attribute/, /missing a type attribute/]); + chai.assert.isNotNull(Blockly.Blocks[BLOCK_TYPE1], + 'Block before bad blocks should be defined.'); + chai.assert.isNotNull(Blockly.Blocks[BLOCK_TYPE2], + 'Block after bad blocks should be defined.'); + chai.assert.equal(Object.keys(Blockly.Blocks).length, blockTypeCount + 2); + }); + + test('Null item', function() { + var BLOCK_TYPE1 = 'test_block_before_null'; + var BLOCK_TYPE2 = 'test_block_after_null'; + + chai.assert.isUndefined(Blockly.Blocks[BLOCK_TYPE1]); + chai.assert.isUndefined(Blockly.Blocks[BLOCK_TYPE2]); + var blockTypeCount = Object.keys(Blockly.Blocks).length; + + assertWarnings(() => { + Blockly.defineBlocksWithJsonArray([ + { + "type": BLOCK_TYPE1, + "message0": 'before' + }, + null, + { + "type": BLOCK_TYPE2, + "message0": 'after' + }]); + }, /is null/); + chai.assert.isNotNull(Blockly.Blocks[BLOCK_TYPE1], + 'Block before null in array should be defined.'); + chai.assert.isNotNull(Blockly.Blocks[BLOCK_TYPE2], + 'Block after null in array should be defined.'); + chai.assert.equal(Object.keys(Blockly.Blocks).length, blockTypeCount + 2); + }); + + test('Undefined item', function() { + var BLOCK_TYPE1 = 'test_block_before_undefined'; + var BLOCK_TYPE2 = 'test_block_after_undefined'; + + chai.assert.isUndefined(Blockly.Blocks[BLOCK_TYPE1]); + chai.assert.isUndefined(Blockly.Blocks[BLOCK_TYPE2]); + var blockTypeCount = Object.keys(Blockly.Blocks).length; + assertWarnings(() => { + Blockly.defineBlocksWithJsonArray([ + { + "type": BLOCK_TYPE1, + "message0": 'before' + }, + undefined, + { + "type": BLOCK_TYPE2, + "message0": 'after' + }]); + }, /is undefined/); + chai.assert.isNotNull(Blockly.Blocks[BLOCK_TYPE1], + 'Block before undefined in array should be defined.'); + chai.assert.isNotNull(Blockly.Blocks[BLOCK_TYPE2], + 'Block after undefined in array should be defined.'); + chai.assert.equal(Object.keys(Blockly.Blocks).length, blockTypeCount + 2); + }); + + test('message0 creates input', function() { + var BLOCK_TYPE = 'test_json_message0'; + var MESSAGE0 = 'message0'; + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": MESSAGE0 + }]); + + var block = new Blockly.Block(this.workspace_, BLOCK_TYPE); + chai.assert.equal(block.inputList.length, 1); + chai.assert.equal(block.inputList[0].fieldRow.length, 1); + var textField = block.inputList[0].fieldRow[0]; + chai.assert.equal(Blockly.FieldLabel, textField.constructor); + chai.assert.equal(MESSAGE0, textField.getText()); + }); + + test('message1 and message0 creates two inputs', function() { + /** Ensure message1 creates a new input. */ + var BLOCK_TYPE = 'test_json_message1'; + var MESSAGE0 = 'message0'; + var MESSAGE1 = 'message1'; + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": MESSAGE0, + "message1": MESSAGE1 + }]); + + var block = new Blockly.Block(this.workspace_, BLOCK_TYPE); + chai.assert.equal(block.inputList.length, 2); + + chai.assert.equal(block.inputList[0].fieldRow.length, 1); + var textField = block.inputList[0].fieldRow[0]; + chai.assert.equal(Blockly.FieldLabel, textField.constructor); + chai.assert.equal(MESSAGE0, textField.getText()); + + chai.assert.equal(block.inputList[1].fieldRow.length, 1); + var textField = block.inputList[1].fieldRow[0]; + chai.assert.equal(Blockly.FieldLabel, textField.constructor); + chai.assert.equal(MESSAGE1, textField.getText()); + }); + + test('Message string is dereferenced', function() { + var BLOCK_TYPE = 'test_json_message0_i18n'; + var MESSAGE0 = '%{BKY_MESSAGE}'; + var MESSAGE = 'message'; + + addMessageToCleanup(this.sharedCleanup, 'MESSAGE'); + Blockly.Msg['MESSAGE'] = MESSAGE; + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": MESSAGE0 + }]); + + var block = new Blockly.Block(this.workspace_, BLOCK_TYPE); + chai.assert.equal(block.inputList.length, 1); + chai.assert.equal(block.inputList[0].fieldRow.length, 1); + var textField = block.inputList[0].fieldRow[0]; + chai.assert.equal(Blockly.FieldLabel, textField.constructor); + chai.assert.equal(MESSAGE, textField.getText()); + }); + + test('Dropdown', function() { + var BLOCK_TYPE = 'test_json_dropdown'; + var FIELD_NAME = 'FIELD_NAME'; + var LABEL0 = 'LABEL0'; + var VALUE0 = 'VALUE0'; + var LABEL1 = 'LABEL1'; + var VALUE1 = 'VALUE1'; + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": FIELD_NAME, + "options": [ + [LABEL0, VALUE0], + [LABEL1, VALUE1] + ] + } + ] + }]); + + var block = new Blockly.Block(this.workspace_, BLOCK_TYPE); + chai.assert.equal(block.inputList.length, 1); + chai.assert.equal(block.inputList[0].fieldRow.length, 1); + var dropdown = block.inputList[0].fieldRow[0]; + chai.assert.equal(dropdown, block.getField(FIELD_NAME)); + chai.assert.equal(Blockly.FieldDropdown, dropdown.constructor); + chai.assert.equal(VALUE0, dropdown.getValue()); + + var options = dropdown.getOptions(); + chai.assert.equal(LABEL0, options[0][0]); + chai.assert.equal(VALUE0, options[0][1]); + chai.assert.equal(LABEL1, options[1][0]); + chai.assert.equal(VALUE1, options[1][1]); + }); + + + test('Dropdown with images', function() { + var BLOCK_TYPE = 'test_json_dropdown'; + var FIELD_NAME = 'FIELD_NAME'; + var IMAGE1_ALT_TEXT = 'Localized message.'; + addMessageToCleanup(this.sharedCleanup, 'ALT_TEXT'); + 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'; + + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": FIELD_NAME, + "options": [ + [IMAGE0, VALUE0], + [IMAGE1, VALUE1], + [IMAGE2, VALUE2] + ] + } + ] + }]); + + var block = new Blockly.Block(this.workspace_, BLOCK_TYPE); + chai.assert.equal(block.inputList.length, 1); + chai.assert.equal(block.inputList[0].fieldRow.length, 1); + var dropdown = block.inputList[0].fieldRow[0]; + chai.assert.equal(dropdown, block.getField(FIELD_NAME)); + chai.assert.equal(Blockly.FieldDropdown, dropdown.constructor); + chai.assert.equal(VALUE0, dropdown.getValue()); + + function assertImageEquals(actualImage, expectedImage) { + chai.assert.equal(actualImage.width, expectedImage.width); + chai.assert.equal(actualImage.height, expectedImage.height); + chai.assert.equal(actualImage.src, expectedImage.src); + } + + var options = dropdown.getOptions(); + var image0 = options[0][0]; + assertImageEquals(IMAGE0, image0); + chai.assert.equal(IMAGE0.alt, image0.alt); + chai.assert.equal(options[0][1], VALUE0); + + var image1 = options[1][0]; + assertImageEquals(IMAGE1, image1); + chai.assert.equal(IMAGE1.alt, IMAGE1_ALT_TEXT); // Via Msg reference + chai.assert.equal(VALUE1, options[1][1]); + + var image2 = options[2][0]; + assertImageEquals(IMAGE1, image1); + chai.assert.notExists(image2.alt); // No alt specified. + chai.assert.equal(VALUE2, options[2][1]); + }); + }); +}); diff --git a/static/js/tests/mocha/keydown_test.js b/static/js/tests/mocha/keydown_test.js new file mode 100644 index 0000000..d989d96 --- /dev/null +++ b/static/js/tests/mocha/keydown_test.js @@ -0,0 +1,277 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Key Down', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = Blockly.inject('blocklyDiv', {}); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + /** + * Creates a block and sets it as Blockly.selected. + * @param {Blockly.Workspace} workspace The workspace to create a new block on. + */ + function setSelectedBlock(workspace) { + defineStackBlock(this.sharedCleanup); + Blockly.selected = workspace.newBlock('stack_block'); + } + + /** + * Creates a test for not running keyDown events when the workspace is in read only mode. + * @param {Object} keyEvent Mocked key down event. Use createKeyDownEvent. + * @param {string=} opt_name An optional name for the test case. + */ + function runReadOnlyTest(keyEvent, opt_name) { + var name = opt_name ? opt_name : 'Not called when readOnly is true'; + test(name, function() { + this.workspace.options.readOnly = true; + Blockly.onKeyDown(keyEvent); + sinon.assert.notCalled(this.hideChaffSpy); + }); + } + + suite('Escape', function() { + setup(function() { + this.event = createKeyDownEvent(Blockly.utils.KeyCodes.ESC, 'NotAField'); + this.hideChaffSpy = sinon.spy(Blockly, 'hideChaff'); + }); + test('Simple', function() { + Blockly.onKeyDown(this.event); + sinon.assert.calledOnce(this.hideChaffSpy); + }); + runReadOnlyTest(createKeyDownEvent(Blockly.utils.KeyCodes.ESC, 'NotAField')); + test('Not called when focus is on an HTML input', function() { + var event = createKeyDownEvent(this.event, 'textarea'); + Blockly.onKeyDown(event); + sinon.assert.notCalled(this.hideChaffSpy); + }); + test('Not called on hidden workspaces', function() { + this.workspace.isVisible_ = false; + Blockly.onKeyDown(this.event); + sinon.assert.notCalled(this.hideChaffSpy); + }); + }); + + suite('Delete Block', function() { + setup(function() { + this.hideChaffSpy = sinon.spy(Blockly, 'hideChaff'); + setSelectedBlock(this.workspace); + this.deleteSpy = sinon.spy(Blockly.selected, 'dispose'); + }); + var testCases = [ + ['Delete', createKeyDownEvent(Blockly.utils.KeyCodes.DELETE, 'NotAField')], + ['Backspace', createKeyDownEvent(Blockly.utils.KeyCodes.BACKSPACE, 'NotAField')] + ]; + // Delete a block. + suite('Simple', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + Blockly.onKeyDown(keyEvent); + sinon.assert.calledOnce(this.hideChaffSpy); + sinon.assert.calledOnce(this.deleteSpy); + }); + }); + }); + // Do not delete a block if workspace is in readOnly mode. + suite('Not called when readOnly is true', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + runReadOnlyTest(keyEvent, testCaseName); + }); + }); + }); + + suite('Copy', function() { + setup(function() { + setSelectedBlock(this.workspace); + this.copySpy = sinon.spy(Blockly, 'copy'); + this.hideChaffSpy = sinon.spy(Blockly, 'hideChaff'); + }); + var testCases = [ + ['Control C', createKeyDownEvent(Blockly.utils.KeyCodes.C, 'NotAField', [Blockly.utils.KeyCodes.CTRL])], + ['Meta C', createKeyDownEvent(Blockly.utils.KeyCodes.C, 'NotAField', [Blockly.utils.KeyCodes.META])], + ['Alt C', createKeyDownEvent(Blockly.utils.KeyCodes.C, 'NotAField', [Blockly.utils.KeyCodes.ALT])] + ]; + // Copy a block. + suite('Simple', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + Blockly.onKeyDown(keyEvent); + sinon.assert.calledOnce(this.copySpy); + sinon.assert.calledOnce(this.hideChaffSpy); + }); + }); + }); + // Do not copy a block if a workspace is in readonly mode. + suite('Not called when readOnly is true', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + runReadOnlyTest(keyEvent, testCaseName); + }); + }); + // Do not copy a block if a gesture is in progress. + suite('Gesture in progress', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + sinon.stub(Blockly.Gesture, 'inProgress').returns(true); + Blockly.onKeyDown(keyEvent); + sinon.assert.notCalled(this.copySpy); + sinon.assert.notCalled(this.hideChaffSpy); + }); + }); + }); + // Do not copy a block if is is not deletable. + suite('Block is not deletable', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + sinon.stub(Blockly.selected, 'isDeletable').returns(false); + Blockly.onKeyDown(keyEvent); + sinon.assert.notCalled(this.copySpy); + sinon.assert.notCalled(this.hideChaffSpy); + }); + }); + }); + // Do not copy a block if it is not movable. + suite('Block is not movable', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + sinon.stub(Blockly.selected, 'isMovable').returns(false); + Blockly.onKeyDown(keyEvent); + sinon.assert.notCalled(this.copySpy); + sinon.assert.notCalled(this.hideChaffSpy); + }); + }); + }); + }); + + suite('Undo', function() { + setup(function() { + this.undoSpy = sinon.spy(this.workspace, 'undo'); + this.hideChaffSpy = sinon.spy(Blockly, 'hideChaff'); + }); + var testCases = [ + ['Control Z', createKeyDownEvent(Blockly.utils.KeyCodes.Z, 'NotAField', [Blockly.utils.KeyCodes.CTRL])], + ['Meta Z', createKeyDownEvent(Blockly.utils.KeyCodes.Z, 'NotAField', [Blockly.utils.KeyCodes.META])], + ['Alt Z', createKeyDownEvent(Blockly.utils.KeyCodes.Z, 'NotAField', [Blockly.utils.KeyCodes.ALT])] + ]; + // Undo. + suite('Simple', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + Blockly.onKeyDown(keyEvent); + sinon.assert.calledOnce(this.undoSpy); + sinon.assert.calledWith(this.undoSpy, false); + sinon.assert.calledOnce(this.hideChaffSpy); + }); + }); + }); + // Do not undo if a gesture is in progress. + suite('Gesture in progress', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + sinon.stub(Blockly.Gesture, 'inProgress').returns(true); + Blockly.onKeyDown(keyEvent); + sinon.assert.notCalled(this.undoSpy); + sinon.assert.notCalled(this.hideChaffSpy); + }); + }); + }); + // Do not undo if the workspace is in readOnly mode. + suite('Not called when readOnly is true', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + runReadOnlyTest(keyEvent, testCaseName); + }); + }); + }); + + suite('Redo', function() { + setup(function() { + this.redoSpy = sinon.spy(this.workspace, 'undo'); + this.hideChaffSpy = sinon.spy(Blockly, 'hideChaff'); + }); + var testCases = [ + ['Control Shift Z', createKeyDownEvent(Blockly.utils.KeyCodes.Z, 'NotAField', [Blockly.utils.KeyCodes.CTRL, Blockly.utils.KeyCodes.SHIFT])], + ['Meta Shift Z', createKeyDownEvent(Blockly.utils.KeyCodes.Z, 'NotAField', [Blockly.utils.KeyCodes.META, Blockly.utils.KeyCodes.SHIFT])], + ['Alt Shift Z', createKeyDownEvent(Blockly.utils.KeyCodes.Z, 'NotAField', [Blockly.utils.KeyCodes.ALT, Blockly.utils.KeyCodes.SHIFT])] + ]; + // Undo. + suite('Simple', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + Blockly.onKeyDown(keyEvent); + sinon.assert.calledOnce(this.redoSpy); + sinon.assert.calledWith(this.redoSpy, true); + sinon.assert.calledOnce(this.hideChaffSpy); + }); + }); + }); + // Do not undo if a gesture is in progress. + suite('Gesture in progress', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + test(testCaseName, function() { + sinon.stub(Blockly.Gesture, 'inProgress').returns(true); + Blockly.onKeyDown(keyEvent); + sinon.assert.notCalled(this.redoSpy); + sinon.assert.notCalled(this.hideChaffSpy); + }); + }); + }); + // Do not undo if the workspace is in readOnly mode. + suite('Not called when readOnly is true', function() { + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var keyEvent = testCase[1]; + runReadOnlyTest(keyEvent, testCaseName); + }); + }); + }); + + suite('UndoWindows', function() { + setup(function() { + this.ctrlYEvent = createKeyDownEvent(Blockly.utils.KeyCodes.Y, 'NotAField', [Blockly.utils.KeyCodes.CTRL]); + this.undoSpy = sinon.spy(this.workspace, 'undo'); + this.hideChaffSpy = sinon.spy(Blockly, 'hideChaff'); + }); + test('Simple', function() { + Blockly.onKeyDown(this.ctrlYEvent); + sinon.assert.calledOnce(this.undoSpy); + sinon.assert.calledWith(this.undoSpy, true); + sinon.assert.calledOnce(this.hideChaffSpy); + }); + test('Not called when a gesture is in progress', function() { + sinon.stub(Blockly.Gesture, 'inProgress').returns(true); + Blockly.onKeyDown(this.ctrlYEvent); + sinon.assert.notCalled(this.undoSpy); + sinon.assert.notCalled(this.hideChaffSpy); + }); + runReadOnlyTest(createKeyDownEvent(Blockly.utils.KeyCodes.Y, 'NotAField', [Blockly.utils.KeyCodes.CTRL])); + }); +}); diff --git a/static/js/tests/mocha/logic_ternary_test.js b/static/js/tests/mocha/logic_ternary_test.js new file mode 100644 index 0000000..8f58009 --- /dev/null +++ b/static/js/tests/mocha/logic_ternary_test.js @@ -0,0 +1,246 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Logic ternary', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + /** + * Asserts that the logic ternary block has the expected inputs and fields. + * @param {!Blockly.Block} block The block to check. + * @param {boolean=} inputsInline Whether the inputs are expected to be + * inline. + */ + function assertBlockStructure(block, inputsInline = false) { + chai.assert.equal(block.type, 'logic_ternary'); + const inputs = block.inputList; + chai.assert.exists(inputs, 'Has inputList'); + chai.assert.lengthOf(inputs, 3); + const ifInput = block.getInput('IF'); + chai.assert.exists(ifInput, 'Has "IF" input'); + chai.assert.equal(ifInput.connection.check_.length, 1); + chai.assert.equal(ifInput.connection.check_[0], 'Boolean'); + chai.assert.exists(block.onchangeWrapper_, 'Has onchange handler'); + if (inputsInline) { + chai.assert.isTrue(block.inputsInline); + } else { + // inputsInline can be undefined + chai.assert.isNotTrue(block.inputsInline); + } + } + + test('Structure', function() { + const block = this.workspace.newBlock('logic_ternary'); + assertBlockStructure(block); + }); + + /** + * Test cases for serialization tests. + * @type {Array} + */ + const testCases = [ + {title: 'Empty XML', xml: '', + expectedXml: + '', + assertBlockStructure: + (block) => { + assertBlockStructure(block); + }, + }, + {title: 'Inputs inline', + xml: + '', + assertBlockStructure: + (block) => { + assertBlockStructure(block, true); + }, + }, + ]; + testHelpers.runSerializationTestSuite(testCases); + + suite('Connections', function() { + function connectParentAndCheckConnections( + block, parent, parentInputName, opt_thenInput, opt_elseInput) { + parent.getInput(parentInputName).connection.connect(block.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + chai.assert.equal(block.getParent(), parent, + 'Successful connection to parent'); + if (opt_thenInput) { + chai.assert.equal(opt_thenInput.getParent(), block, + 'Input THEN still connected after connecting parent'); + } + if (opt_elseInput) { + chai.assert.equal(opt_elseInput.getParent(), block, + 'Input ELSE still connected after connecting parent'); + } + } + function connectThenInputAndCheckConnections( + block, thenInput, opt_elseInput, opt_parent) { + block.getInput('THEN').connection.connect(thenInput.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + chai.assert.equal(thenInput.getParent(), block, 'THEN is connected'); + if (opt_parent) { + chai.assert.equal(block.getParent(), opt_parent, + 'Still connected to parent after connecting THEN'); + } + if (opt_elseInput) { + chai.assert.equal(opt_elseInput.getParent(), block, + 'Input ELSE still connected after connecting THEN'); + } + } + function connectElseInputAndCheckConnections( + block, elseInput, opt_thenInput, opt_parent) { + block.getInput('ELSE').connection.connect(elseInput.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + chai.assert.equal(elseInput.getParent(), block, 'ELSE is connected'); + if (opt_parent) { + chai.assert.equal(block.getParent(), opt_parent, + 'Still connected to parent after connecting ELSE'); + } + if (opt_thenInput) { + chai.assert.equal(opt_thenInput.getParent(), block, + 'Input THEN still connected after connecting ELSE'); + } + } + function connectInputsAndCheckConnections( + block, thenInput, elseInput, opt_parent) { + connectThenInputAndCheckConnections(block, thenInput, null, opt_parent); + connectElseInputAndCheckConnections(block, elseInput, thenInput, opt_parent); + } + setup(function() { + this.block = this.workspace.newBlock('logic_ternary'); + }); + suite('No parent', function() { + test('Attach inputs same type', function() { + var string1 = this.workspace.newBlock('text'); + var string2 = this.workspace.newBlock('text_charAt'); + + connectInputsAndCheckConnections(this.block, string1, string2); + }); + test('Attach inputs different types', function() { + var string = this.workspace.newBlock('text'); + var number = this.workspace.newBlock('math_number'); + + connectInputsAndCheckConnections(this.block, string, number); + }); + }); + suite('With parent already attached', function() { + test('Attach inputs same type with matching parent', function() { + var parent = this.workspace.newBlock('text_trim'); + + connectParentAndCheckConnections(this.block, parent, 'TEXT'); + + var string1 = this.workspace.newBlock('text'); + var string2 = this.workspace.newBlock('text_charAt'); + + connectInputsAndCheckConnections(this.block, string1, string2, parent); + }); + test('Attach inputs different types with unchecked parent', function() { + var parent = this.workspace.newBlock('text_print'); + + connectParentAndCheckConnections(this.block, parent, 'TEXT'); + + var string = this.workspace.newBlock('text'); + var number = this.workspace.newBlock('math_number'); + + connectInputsAndCheckConnections(this.block, string, number, parent); + }); + test('Attach inputs different types with permissive parent', function() { + var parent = this.workspace.newBlock('text_length'); // Allows String or Array + + connectParentAndCheckConnections(this.block, parent, 'VALUE'); + + var string = this.workspace.newBlock('text'); + var array = this.workspace.newBlock('lists_create_empty'); + + connectInputsAndCheckConnections(this.block, string, array, parent); + }); + test('Attach mismatch type to then causes break with parent', function() { + var parent = this.workspace.newBlock('text_length'); // Allows String or Array + + connectParentAndCheckConnections(this.block, parent, 'VALUE'); + + var string = this.workspace.newBlock('text'); + var number = this.workspace.newBlock('math_number'); + + connectElseInputAndCheckConnections(this.block, string, null, parent); + + // Adding mismatching number. + connectThenInputAndCheckConnections(this.block, number, string); + chai.assert.equal(this.block.getRootBlock(), this.block, + 'Disconnected from parent'); + }); + test('Attach mismatch type to else causes break with parent', function() { + var parent = this.workspace.newBlock('text_length'); // Allows String or Array + + connectParentAndCheckConnections(this.block, parent, 'VALUE'); + + var string = this.workspace.newBlock('text'); + var number = this.workspace.newBlock('math_number'); + + connectThenInputAndCheckConnections(this.block, string, null, parent); + + // Adding mismatching number. + connectElseInputAndCheckConnections(this.block, number, string); + chai.assert.equal(this.block.getRootBlock(), this.block, + 'Disconnected from parent'); + }); + }); + suite('Attaching parent after inputs', function() { + test('Unchecked parent with inputs different types', function() { + var string = this.workspace.newBlock('text'); + var number = this.workspace.newBlock('math_number'); + + connectInputsAndCheckConnections(this.block, string, number); + + var parent = this.workspace.newBlock('text_print'); + connectParentAndCheckConnections( + this.block, parent, 'TEXT', string, number); + }); + test('Permissive parent with inputs different types', function() { + var string = this.workspace.newBlock('text'); + var array = this.workspace.newBlock('lists_create_empty'); + + connectInputsAndCheckConnections(this.block, string, array); + + var parent = this.workspace.newBlock('text_print'); + connectParentAndCheckConnections( + this.block, parent, 'TEXT', string, array); + }); + test('Mismatch with then causes break with then', function() { + var number = this.workspace.newBlock('math_number'); + var string = this.workspace.newBlock('text'); + + connectInputsAndCheckConnections(this.block, number, string); + + var parent = this.workspace.newBlock('text_trim'); + connectParentAndCheckConnections( + this.block, parent, 'TEXT', null, string); + chai.assert.equal(number.getRootBlock(), number, + 'Input THEN disconnected'); + }); + test('Mismatch with else causes break with else', function() { + var string = this.workspace.newBlock('text'); + var number = this.workspace.newBlock('math_number'); + + connectInputsAndCheckConnections(this.block, string, number); + + var parent = this.workspace.newBlock('text_trim'); + connectParentAndCheckConnections(this.block, parent, 'TEXT', string); + chai.assert.equal(number.getRootBlock(), number, + 'Input ELSE disconnected'); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/metrics_test.js b/static/js/tests/mocha/metrics_test.js new file mode 100644 index 0000000..f252b17 --- /dev/null +++ b/static/js/tests/mocha/metrics_test.js @@ -0,0 +1,113 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Metrics tests. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +suite('Metrics', function() { + function assertDimensionsMatch(toCheck, left, top, width, height) { + chai.assert.equal(top, toCheck.top, 'Top did not match.'); + chai.assert.equal(left, toCheck.left, 'Left did not match.'); + chai.assert.equal(width, toCheck.width, 'Width did not match.'); + chai.assert.equal(height, toCheck.height, 'Height did not match.'); + } + + // 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 + }; + } + + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + 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/static/js/tests/mocha/names_test.js b/static/js/tests/mocha/names_test.js new file mode 100644 index 0000000..c8abefd --- /dev/null +++ b/static/js/tests/mocha/names_test.js @@ -0,0 +1,62 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly names tests. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +suite('Names', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + test('Safe name', function() { + var varDB = new Blockly.Names('window,door'); + chai.assert.equal(varDB.safeName_(''), 'unnamed','SafeName empty.'); + chai.assert.equal( varDB.safeName_('foobar'), 'foobar','SafeName ok.'); + chai.assert.equal(varDB.safeName_('9lives'), 'my_9lives', 'SafeName number start.'); + chai.assert.equal(varDB.safeName_('lives9'), 'lives9', 'SafeName number end.'); + chai.assert.equal(varDB.safeName_('!@#$'), '____', 'SafeName special chars.'); + chai.assert.equal(varDB.safeName_('door'), 'door', 'SafeName reserved.'); + }); + + test('Get name', function() { + var varDB = new Blockly.Names('window,door'); + chai.assert.equal(varDB.getName('Foo.bar', 'var'), 'Foo_bar', 'Name add #1.'); + chai.assert.equal(varDB.getName('Foo.bar', 'var'), 'Foo_bar', 'Name get #1.'); + chai.assert.equal(varDB.getName('Foo bar', 'var'), 'Foo_bar2', 'Name add #2.'); + chai.assert.equal(varDB.getName('foo BAR', 'var'), 'Foo_bar2', 'Name get #2.'); + chai.assert.equal(varDB.getName('door', 'var'), 'door2', 'Name add #3.'); + chai.assert.equal(varDB.getName('Foo.bar', 'proc'), 'Foo_bar3', 'Name add #4.'); + chai.assert.equal(varDB.getName('Foo.bar', 'var'), 'Foo_bar', 'Name get #1b.'); + chai.assert.equal(varDB.getName('Foo.bar', 'proc'), 'Foo_bar3', 'Name get #4.'); + }); + + test('Get distinct name', function() { + var varDB = new Blockly.Names('window,door'); + chai.assert.equal(varDB.getDistinctName('Foo.bar', 'var'), 'Foo_bar', + 'Name distinct #1.'); + chai.assert.equal(varDB.getDistinctName('Foo.bar', 'var'), 'Foo_bar2', + 'Name distinct #2.'); + chai.assert.equal(varDB.getDistinctName('Foo.bar', 'proc'), 'Foo_bar3', + 'Name distinct #3.'); + varDB.reset(); + chai.assert.equal(varDB.getDistinctName('Foo.bar', 'var'), 'Foo_bar', + 'Name distinct #4.'); + }); + + test('name equals', function() { + chai.assert.isTrue(Blockly.Names.equals('Foo.bar', 'Foo.bar'), 'Name equals #1.'); + chai.assert.isFalse(Blockly.Names.equals('Foo.bar', 'Foo_bar'), 'Name equals #2.'); + chai.assert.isTrue(Blockly.Names.equals('Foo.bar', 'FOO.BAR'), 'Name equals #3.'); + }); + +}); diff --git a/static/js/tests/mocha/navigation_modify_test.js b/static/js/tests/mocha/navigation_modify_test.js new file mode 100644 index 0000000..38da4c9 --- /dev/null +++ b/static/js/tests/mocha/navigation_modify_test.js @@ -0,0 +1,420 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Insert/Modify', function() { + function assertModifyFails() { + var modifyResult; + var warnings = captureWarnings(function() { + modifyResult = Blockly.navigation.modify_(); + }); + chai.assert.isFalse(modifyResult); + chai.assert.equal(warnings.length, 1, + 'Expecting 1 warnings for why modify failed.'); + } + setup(function() { + sharedTestSetup.call(this); + // NOTE: block positions chosen such that they aren't unintentionally + // bumped out of bounds during tests. + var xmlText = '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + defineStackBlock(this.sharedCleanup); + defineRowBlock(this.sharedCleanup); + defineStatementBlock(this.sharedCleanup); + + 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() { + sharedTestTeardown.call(this); + }); + + 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))); + assertModifyFails(); + }); + 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)); + assertModifyFails(); + 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)); + assertModifyFails(); + 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)); + assertModifyFails(); + 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)); + assertModifyFails(); + 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)); + assertModifyFails(); + }); + 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)); + assertModifyFails(); + chai.assert.isNull(this.row_block_1.getParent()); + }); + + }); + + 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)); + assertModifyFails(); + }); + test('Cursor on really incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.previousConnection)); + assertModifyFails(); + }); + 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(pos.x, 100); + chai.assert.equal(pos.y, 200); + }); + + 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(pos.x, 100); + chai.assert.equal(pos.y, 200); + }); + + 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(pos.x, 100); + chai.assert.equal(pos.y, 200); + }); + + 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(pos.x, 100); + chai.assert.equal(pos.y, 200); + }); + + 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(pos.x, 100); + chai.assert.equal(pos.y, 200); + }); + + test('Cursor on workspace', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createWorkspaceNode( + this.workspace, new Blockly.utils.Coordinate(100, 100))); + assertModifyFails(); + }); + }); + + 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))); + assertModifyFails(); + }); + }); + 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)); + assertModifyFails(); + }); + test('Cursor on stack block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_1)); + assertModifyFails(); + }); + test('Cursor on next connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.nextConnection)); + assertModifyFails(); + }); + test('Cursor on previous connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.previousConnection)); + assertModifyFails(); + }); + }); + 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)); + assertModifyFails(); + }); + test('Cursor on row block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_1)); + assertModifyFails(); + }); + test('Cursor on value input connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.inputList[0].connection)); + assertModifyFails(); + }); + test('Cursor on output connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.outputConnection)); + assertModifyFails(); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/navigation_test.js b/static/js/tests/mocha/navigation_test.js new file mode 100644 index 0000000..9e3e319 --- /dev/null +++ b/static/js/tests/mocha/navigation_test.js @@ -0,0 +1,803 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Navigation tests. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + + +suite('Navigation', function() { + function createNavigationWorkspace(enableKeyboardNav, readOnly) { + var toolbox = document.getElementById('toolbox-categories'); + var workspace = + Blockly.inject('blocklyDiv', {toolbox: toolbox, readOnly: readOnly}); + if (enableKeyboardNav) { + Blockly.navigation.enableKeyboardAccessibility(); + Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; + } + return workspace; + } + + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + // 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.workspace); + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + var testCases = [ + [ + 'Calls toolbox selectNext_', + createKeyDownEvent(Blockly.utils.KeyCodes.S, 'NotAField'), 'selectNext_' + ], + [ + 'Calls toolbox selectPrevious_', + createKeyDownEvent(Blockly.utils.KeyCodes.W, 'NotAField'), + 'selectPrevious_' + ], + [ + 'Calls toolbox selectParent_', + createKeyDownEvent(Blockly.utils.KeyCodes.D, 'NotAField'), + 'selectChild_' + ], + [ + 'Calls toolbox selectChild_', + createKeyDownEvent(Blockly.utils.KeyCodes.A, 'NotAField'), + 'selectParent_' + ] + ]; + + testCases.forEach(function(testCase) { + var testCaseName = testCase[0]; + var mockEvent = testCase[1]; + var stubName = testCase[2]; + test(testCaseName, function() { + var toolbox = this.workspace.getToolbox(); + var selectStub = sinon.stub(toolbox, stubName); + toolbox.selectedItem_ = toolbox.contents_[0]; + Blockly.onKeyDown(mockEvent); + sinon.assert.called(selectStub); + }); + }); + + test('Go to flyout', function() { + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.D, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + 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; + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.E, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + test('Focuses workspace from toolbox (escape)', function() { + Blockly.navigation.currentState_ = Blockly.navigation.STATE_TOOLBOX; + var mockEvent = + createKeyDownEvent(Blockly.utils.KeyCodes.ESC, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + 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.navigation.focusToolbox_(this.workspace); + Blockly.navigation.focusFlyout_(this.workspace); + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + // Should be a no-op + test('Previous at beginning', function() { + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.W, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + 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"); + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.W, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + 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() { + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.S, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + 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() { + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.A, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_TOOLBOX); + }); + + test('Mark', function() { + var mockEvent = + createKeyDownEvent(Blockly.utils.KeyCodes.ENTER, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + chai.assert.equal(this.workspace.getTopBlocks().length, 1); + }); + + test('Exit', function() { + var mockEvent = + createKeyDownEvent(Blockly.utils.KeyCodes.ESC, 'NotAField'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + 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'); + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + test('Previous', function() { + var prevSpy = sinon.spy(this.workspace.getCursor(), 'prev'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var wEvent = createKeyDownEvent(Blockly.utils.KeyCodes.W, ''); + + Blockly.onKeyDown(wEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(prevSpy); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + + test('Next', function() { + var nextSpy = sinon.spy(this.workspace.getCursor(), 'next'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var sEvent = createKeyDownEvent(Blockly.utils.KeyCodes.S, ''); + + Blockly.onKeyDown(sEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(nextSpy); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + + test('Out', function() { + var outSpy = sinon.spy(this.workspace.getCursor(), 'out'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var aEvent = createKeyDownEvent(Blockly.utils.KeyCodes.A, ''); + + Blockly.onKeyDown(aEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(outSpy); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + + test('In', function() { + var inSpy = sinon.spy(this.workspace.getCursor(), 'in'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var dEvent = createKeyDownEvent(Blockly.utils.KeyCodes.D, ''); + + Blockly.onKeyDown(dEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(inSpy); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + + test('Insert', function() { + // Stub modify as we are not testing its behavior, only if it was called. + // Otherwise, there is a warning because there is no marked node. + var modifyStub = sinon.stub(Blockly.navigation, 'modify_').returns(true); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var iEvent = createKeyDownEvent(Blockly.utils.KeyCodes.I, ''); + + Blockly.onKeyDown(iEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(modifyStub); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + + test('Mark', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode(this.basicBlock.previousConnection)); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var enterEvent = createKeyDownEvent(Blockly.utils.KeyCodes.ENTER, ''); + + Blockly.onKeyDown(enterEvent); + + var markedNode = this.workspace.getMarker(Blockly.navigation.MARKER_NAME).getCurNode(); + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.equal(markedNode.getLocation(), this.basicBlock.previousConnection); + chai.assert.equal( + Blockly.navigation.currentState_, Blockly.navigation.STATE_WS); + }); + + test('Toolbox', function() { + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + var tEvent = createKeyDownEvent(Blockly.utils.KeyCodes.T, ''); + + Blockly.onKeyDown(tEvent); + + var firstCategory = this.workspace.getToolbox().contents_[0]; + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.equal( + this.workspace.getToolbox().getSelectedItem(), 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'); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + + test('Action does not exist', function() { + var block = this.workspace.getTopBlocks()[0]; + var field = block.inputList[0].fieldRow[0]; + var fieldSpy = sinon.spy(field, 'onBlocklyAction'); + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.N, ''); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + this.workspace.getCursor().setCurNode(Blockly.ASTNode.createFieldNode(field)); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isFalse(keyDownSpy.returned(true)); + sinon.assert.notCalled(fieldSpy); + }); + + test('Action exists - field handles action', function() { + var block = this.workspace.getTopBlocks()[0]; + var field = block.inputList[0].fieldRow[0]; + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.A, ''); + var fieldSpy = sinon.stub(field, 'onBlocklyAction').returns(true); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + this.workspace.getCursor().setCurNode(Blockly.ASTNode.createFieldNode(field)); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(fieldSpy); + + }); + + test('Action exists - field does not handle action', function() { + var block = this.workspace.getTopBlocks()[0]; + var field = block.inputList[0].fieldRow[0]; + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.A, ''); + var fieldSpy = sinon.spy(field, 'onBlocklyAction'); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + this.workspace.getCursor().setCurNode(Blockly.ASTNode.createFieldNode(field)); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + sinon.assert.calledOnce(fieldSpy); + }); + + test('Toggle Action Off', function() { + var mockEvent = createKeyDownEvent( + Blockly.utils.KeyCodes.K, '', + [Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.CTRL]); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + this.workspace.keyboardAccessibilityMode = true; + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.isFalse(this.workspace.keyboardAccessibilityMode); + }); + + test('Toggle Action On', function() { + var mockEvent = createKeyDownEvent( + Blockly.utils.KeyCodes.K, '', + [Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.CTRL]); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + this.workspace.keyboardAccessibilityMode = false; + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + chai.assert.isTrue(this.workspace.keyboardAccessibilityMode); + }); + + 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 = createNavigationWorkspace(true, true); + + Blockly.mainWorkspace = this.workspace; + this.workspace.getCursor().drawer_ = null; + + this.fieldBlock1 = this.workspace.newBlock('field_block'); + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + test('Perform valid action for read only', function() { + var astNode = Blockly.ASTNode.createBlockNode(this.fieldBlock1); + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.S, ''); + this.workspace.getCursor().setCurNode(astNode); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(true)); + }); + + test('Perform invalid action for read only', function() { + var astNode = Blockly.ASTNode.createBlockNode(this.fieldBlock1); + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.I, ''); + this.workspace.getCursor().setCurNode(astNode); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(false)); + }); + + test('Try to perform action on a field', function() { + var field = this.fieldBlock1.inputList[0].fieldRow[0]; + var astNode = Blockly.ASTNode.createFieldNode(field); + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.ENTER, ''); + this.workspace.getCursor().setCurNode(astNode); + var keyDownSpy = + sinon.spy(Blockly.ShortcutRegistry.registry, 'onKeyDown'); + + Blockly.onKeyDown(mockEvent); + + chai.assert.isTrue(keyDownSpy.returned(false)); + }); + }); + }); + + suite('Insert Functions', 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); + + var basicBlock = this.workspace.newBlock('basic_block'); + var basicBlock2 = this.workspace.newBlock('basic_block'); + + this.basicBlock = basicBlock; + this.basicBlock2 = basicBlock2; + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + 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_(this.workspace); + Blockly.navigation.focusFlyout_(this.workspace); + Blockly.navigation.insertFromFlyout(this.workspace); + + 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_(this.workspace); + Blockly.navigation.focusFlyout_(this.workspace); + Blockly.navigation.insertFromFlyout(this.workspace); + + 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() { + workspaceTeardown.call(this, this.workspace); + }); + + 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.isNull(this.basicBlock3.nextConnection.targetConnection); + }); + + 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.isNull(this.inlineBlock2.outputConnection.targetBlock()); + 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() { + workspaceTeardown.call(this, this.workspace); + }); + + 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/static/js/tests/mocha/procedures_test.js b/static/js/tests/mocha/procedures_test.js new file mode 100644 index 0000000..95791ef --- /dev/null +++ b/static/js/tests/mocha/procedures_test.js @@ -0,0 +1,1159 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.require('Blockly.Blocks.procedures'); +goog.require('Blockly.Msg'); + +suite('Procedures', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.workspace.createVariable('preCreatedVar', '', 'preCreatedVarId'); + this.workspace.createVariable( + 'preCreatedTypedVar', 'type', 'preCreatedTypedVarId'); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('allProcedures', function() { + test('Only Procedures', function() { + var noReturnBlock = new Blockly.Block(this.workspace, 'procedures_defnoreturn'); + noReturnBlock.setFieldValue('no return', 'NAME'); + var returnBlock = new Blockly.Block(this.workspace, 'procedures_defreturn'); + returnBlock.setFieldValue('return', 'NAME'); + + var allProcedures = Blockly.Procedures.allProcedures(this.workspace); + chai.assert.lengthOf(allProcedures, 2); + + chai.assert.lengthOf(allProcedures[0], 1); + chai.assert.equal(allProcedures[0][0][0], 'no return'); + + chai.assert.lengthOf(allProcedures[1], 1); + chai.assert.equal(allProcedures[1][0][0], 'return'); + }); + test('Multiple Blocks', function() { + var noReturnBlock = new Blockly.Block(this.workspace, 'procedures_defnoreturn'); + noReturnBlock.setFieldValue('no return', 'NAME'); + var returnBlock = new Blockly.Block(this.workspace, 'procedures_defreturn'); + returnBlock.setFieldValue('return', 'NAME'); + var returnBlock2 = new Blockly.Block(this.workspace, 'procedures_defreturn'); + returnBlock2.setFieldValue('return2', 'NAME'); + var _ = new Blockly.Block(this.workspace, 'controls_if'); + + var allProcedures = Blockly.Procedures.allProcedures(this.workspace); + chai.assert.lengthOf(allProcedures, 2); + + chai.assert.lengthOf(allProcedures[0], 1); + chai.assert.equal(allProcedures[0][0][0], 'no return'); + + chai.assert.lengthOf(allProcedures[1], 2); + chai.assert.equal(allProcedures[1][0][0], 'return'); + chai.assert.equal(allProcedures[1][1][0], 'return2'); + }); + test('No Procedures', function() { + var _ = new Blockly.Block(this.workspace, 'controls_if'); + var allProcedures = Blockly.Procedures.allProcedures(this.workspace); + chai.assert.lengthOf(allProcedures, 2); + chai.assert.lengthOf(allProcedures[0], 0, 'No procedures_defnoreturn blocks expected'); + chai.assert.lengthOf(allProcedures[1], 0, 'No procedures_defreturn blocks expected'); + }); + }); + + suite('isNameUsed', function() { + test('No Blocks', function() { + chai.assert.isFalse( + Blockly.Procedures.isNameUsed('name1', this.workspace) + ); + }); + }); + + suite('Enable/Disable', function() { + setup(function() { + var toolbox = document.getElementById('toolbox-categories'); + this.workspaceSvg = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspaceSvg); + sinon.restore(); + }); + suite('Inherited disabled', function() { + setup(function() { + var dom = Blockly.Xml.textToDom( + '' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + 'foo' + + '' + + '' + + 'baz' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + Blockly.Events.disable(); + Blockly.Xml.appendDomToWorkspace(dom, this.workspaceSvg); + Blockly.Events.enable(); + + this.barDef = this.workspaceSvg.getBlockById('bar-def'); + this.fooDef = this.workspaceSvg.getBlockById('foo-def'); + this.bazDef = this.workspaceSvg.getBlockById('baz-def'); + + this.barCalls = [ + this.workspaceSvg.getBlockById('bar-c1'), + this.workspaceSvg.getBlockById('bar-c2')]; + this.fooCalls = [ + this.workspaceSvg.getBlockById('foo-c1'), + this.workspaceSvg.getBlockById('foo-c2')]; + this.bazCall = this.workspaceSvg.getBlockById('baz-c1'); + }); + test('Nested caller', function() { + this.barDef.setEnabled(false); + + for (var i = 0; i < 2; i++) { + chai.assert.isFalse(this.barCalls[i].isEnabled(), + 'Callers are disabled when their definition is disabled ' + + '(bar call ' + i + ')'); + } + chai.assert.isTrue(this.fooCalls[0].isEnabled(), + 'Callers in definitions are disabled by inheritance'); + chai.assert.isTrue(this.fooCalls[0].getInheritedDisabled(), + 'Callers in definitions are disabled by inheritance'); + + this.fooDef.setEnabled(false); + + for (var i = 0; i < 2; i++) { + chai.assert.isFalse(this.fooCalls[i].isEnabled(), + 'Callers are disabled when their definition is disabled ' + + '(foo call ' + i + ')'); + } + + this.barDef.setEnabled(true); + + for (var i = 0; i < 2; i++) { + chai.assert.isTrue(this.barCalls[i].isEnabled(), + 'Callers are reenabled with their definition ' + + '(bar call ' + i + ')'); + } + chai.assert.isFalse(this.fooCalls[0].isEnabled(), + 'Nested disabled callers remain disabled'); + chai.assert.isFalse(this.fooCalls[0].getInheritedDisabled(), + 'Nested disabled callers remain disabled, not by inheritance'); + }); + test('Caller in return', function() { + this.bazDef.setEnabled(false); + + chai.assert.isFalse(this.bazCall.isEnabled(), + 'Caller is disabled with its definition'); + + chai.assert.isTrue(this.barCalls[1].isEnabled(), + 'Caller in the return is disabled by inheritance'); + chai.assert.isTrue(this.barCalls[1].getInheritedDisabled(), + 'Caller in the return is disabled by inheritance'); + + this.barDef.setEnabled(false); + + for (var i = 0; i < 2; i++) { + chai.assert.isFalse(this.barCalls[i].isEnabled(), + 'Callers are disabled when their definition is disabled ' + + '(bar call ' + i + ')'); + } + + this.bazDef.setEnabled(true); + + chai.assert.isFalse(this.barCalls[1].isEnabled(), + 'Caller in return remains disabled'); + chai.assert.isFalse(this.barCalls[1].getInheritedDisabled(), + 'Caller in return remains disabled, not by inheritance'); + }); + }); + }); + + suite('Multiple block serialization', function() { + function assertDefAndCallBlocks(workspace, noReturnNames, returnNames, hasCallers) { + const allProcedures = Blockly.Procedures.allProcedures(workspace); + const defNoReturnBlocks = allProcedures[0]; + chai.assert.lengthOf(defNoReturnBlocks, noReturnNames.length); + for (let i = 0; i < noReturnNames.length; i++) { + const expectedName = noReturnNames[i]; + chai.assert.equal(defNoReturnBlocks[i][0], expectedName); + if (hasCallers) { + const callers = + Blockly.Procedures.getCallers(expectedName, workspace); + chai.assert.lengthOf(callers, 1); + } + } + const defReturnBlocks = allProcedures[1]; + chai.assert.lengthOf(defReturnBlocks, returnNames.length); + for (let i = 0; i < returnNames.length; i++) { + const expectedName = returnNames[i]; + chai.assert.equal(defReturnBlocks[i][0], expectedName); + if (hasCallers) { + const callers = + Blockly.Procedures.getCallers(expectedName, workspace); + chai.assert.lengthOf(callers, 1); + } + } + + // Expecting def and caller blocks are the only blocks on workspace + let expectedCount = noReturnNames.length + returnNames.length; + if (hasCallers) { + expectedCount *= 2; + } + const blocks = workspace.getAllBlocks(false); + chai.assert.lengthOf(blocks, expectedCount); + } + suite('no name renamed to unnamed', function() { + test('defnoreturn and defreturn', function() { + var xml = Blockly.Xml.textToDom(` + + + + `); + Blockly.Xml.domToWorkspace(xml, this.workspace); + assertDefAndCallBlocks( + this.workspace, ['unnamed'], ['unnamed2'], false); + }); + test('defreturn and defnoreturn', function() { + var xml = Blockly.Xml.textToDom(` + + + + `); + Blockly.Xml.domToWorkspace(xml, this.workspace); + assertDefAndCallBlocks( + this.workspace, ['unnamed2'], ['unnamed'], false); + }); + test('callnoreturn (no def in xml)', function() { + var xml = Blockly.Xml.textToDom(` + + + `); + Blockly.Xml.domToWorkspace(xml, this.workspace); + assertDefAndCallBlocks( + this.workspace, ['unnamed'], [], true); + }); + test('callreturn (no def in xml)', function() { + var xml = Blockly.Xml.textToDom(` + + + `); + Blockly.Xml.domToWorkspace(xml, this.workspace); + assertDefAndCallBlocks( + this.workspace, [], ['unnamed'], true); + }); + test('callnoreturn and callreturn (no def in xml)', function() { + var xml = Blockly.Xml.textToDom(` + + + + `); + Blockly.Xml.domToWorkspace(xml, this.workspace); + assertDefAndCallBlocks( + this.workspace, ['unnamed'], ['unnamed2'], true); + }); + test('callreturn and callnoreturn (no def in xml)', function() { + var xml = Blockly.Xml.textToDom(` + + + + `); + Blockly.Xml.domToWorkspace(xml, this.workspace); + assertDefAndCallBlocks( + this.workspace, ['unnamed2'], ['unnamed'], true); + }); + }); + suite('caller param mismatch', function() { + test.skip('callreturn with missing args', function() { + // TODO: How do we want it to behave in this situation? + var defBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(` + + do something + + + + + `), this.workspace); + var callBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + assertDefBlockStructure(defBlock, true, ['x'], ['arg']); + assertCallBlockStructure(callBlock, ['x'], ['arg']); + }); + test.skip('callreturn with bad args', function() { + // TODO: How do we want it to behave in this situation? + var defBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(` + + do something + + + + + `), this.workspace); + var callBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(` + + + + + + `), this.workspace); + assertDefBlockStructure(defBlock, true, ['x'], ['arg']); + assertCallBlockStructure(callBlock, ['x'], ['arg']); + }); + test.skip('callnoreturn with missing args', function() { + // TODO: How do we want it to behave in this situation? + var defBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(` + + do something + + + + + `), this.workspace); + var callBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + assertDefBlockStructure(defBlock, false, ['x'], ['arg']); + assertCallBlockStructure(callBlock, ['x'], ['arg']); + }); + test.skip('callnoreturn with bad args', function() { + // TODO: How do we want it to behave in this situation? + var defBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(` + + do something + + + + + `), this.workspace); + var callBlock = Blockly.Xml.domToBlock(Blockly.Xml.textToDom(` + + + + + + `), this.workspace); + assertDefBlockStructure(defBlock, false, ['x'], ['arg']); + assertCallBlockStructure(callBlock, ['x'], ['arg']); + }); + }); + }); + + const testSuites = [ + {title: 'procedures_defreturn', hasReturn: true, + defType: 'procedures_defreturn', callType: 'procedures_callreturn'}, + {title: 'procedures_defnoreturn', hasReturn: false, + defType: 'procedures_defnoreturn', callType: 'procedures_callnoreturn'}, + ]; + + testSuites.forEach((testSuite) => { + suite(testSuite.title, function() { + suite('Structure', function() { + setup(function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + }); + test('Definition block', function() { + assertDefBlockStructure(this.defBlock, testSuite.hasReturn); + }); + + test('Call block', function() { + this.callBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callBlock.setFieldValue('proc name', 'NAME'); + assertCallBlockStructure(this.callBlock); + }); + }); + suite('isNameUsed', function() { + setup(function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + this.callBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callBlock.setFieldValue('proc name', 'NAME'); + }); + test('True', function() { + chai.assert.isTrue( + Blockly.Procedures.isNameUsed('proc name', this.workspace)); + }); + test('False', function() { + chai.assert.isFalse( + Blockly.Procedures.isNameUsed('unused proc name', this.workspace)); + }); + }); + suite('rename', function() { + setup(function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + this.callBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callBlock.setFieldValue('proc name', 'NAME'); + sinon.stub(this.defBlock.getField('NAME'), 'resizeEditor_'); + }); + test('Simple, Programmatic', function() { + this.defBlock.setFieldValue( + this.defBlock.getFieldValue('NAME') + '2', + 'NAME' + ); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), 'proc name2'); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), 'proc name2'); + }); + test('Simple, Input', function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'proc name'; + defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + + defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + '2'; + defInput.onHtmlInputChange_(null); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), 'proc name2'); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), 'proc name2'); + }); + test('lower -> CAPS', function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'proc name'; + defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + + defInput.htmlInput_.value = 'PROC NAME'; + defInput.onHtmlInputChange_(null); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), 'PROC NAME'); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), 'PROC NAME'); + }); + test('CAPS -> lower', function() { + this.defBlock.setFieldValue('PROC NAME', 'NAME'); + this.callBlock.setFieldValue('PROC NAME', 'NAME'); + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'PROC NAME'; + defInput.htmlInput_.untypedDefaultValue_ = 'PROC NAME'; + + defInput.htmlInput_.value = 'proc name'; + defInput.onHtmlInputChange_(null); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), 'proc name'); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), 'proc name'); + }); + test('Whitespace', function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'proc name'; + defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + + defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + ' '; + defInput.onHtmlInputChange_(null); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), 'proc name'); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), 'proc name'); + }); + test('Whitespace then Text', function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'proc name'; + defInput.htmlInput_.untypedDefaultValue_ = 'proc 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'), 'proc name 2'); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), 'proc name 2'); + }); + test('Set Empty', function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'proc name'; + defInput.htmlInput_.untypedDefaultValue_ = 'proc 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']); + }); + test('Set Empty, and Create New', function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'proc name'; + defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + + defInput.htmlInput_.value = ''; + defInput.onHtmlInputChange_(null); + var newDefBlock = new Blockly.Block(this.workspace, testSuite.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']); + }); + }); + suite('getCallers', function() { + setup(function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + this.callBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callBlock.setFieldValue('proc name', 'NAME'); + }); + test('Simple', function() { + var callers = + Blockly.Procedures.getCallers('proc name', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + }); + test('Multiple Callers', function() { + var caller2 = new Blockly.Block(this.workspace, testSuite.callType); + caller2.setFieldValue('proc name', 'NAME'); + var caller3 = new Blockly.Block(this.workspace, testSuite.callType); + caller3.setFieldValue('proc name', 'NAME'); + + var callers = + Blockly.Procedures.getCallers('proc name', 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); + }); + test('Multiple Procedures', function() { + var def2 = new Blockly.Block(this.workspace, testSuite.defType); + def2.setFieldValue('proc name2', 'NAME'); + var caller2 = new Blockly.Block(this.workspace, testSuite.callType); + caller2.setFieldValue('proc name2', 'NAME'); + + var callers = + Blockly.Procedures.getCallers('proc name', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + }); + // 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.callBlock.setFieldValue('PROC NAME', 'NAME'); + var callers = + Blockly.Procedures.getCallers('proc name', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + }); + test('Multiple Workspaces', function() { + var workspace = new Blockly.Workspace(); + try { + var def2 = new Blockly.Block(workspace, testSuite.defType); + def2.setFieldValue('proc name', 'NAME'); + var caller2 = new Blockly.Block(workspace, testSuite.callType); + caller2.setFieldValue('proc name', 'NAME'); + + var callers = + Blockly.Procedures.getCallers('proc name', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + + callers = Blockly.Procedures.getCallers('proc name', workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], caller2); + } finally { + workspaceTeardown.call(this, workspace); + } + }); + }); + suite('getDefinition', function() { + setup(function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + this.callBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callBlock.setFieldValue('proc name', 'NAME'); + }); + test('Simple', function() { + var def = + Blockly.Procedures.getDefinition('proc name', this.workspace); + chai.assert.equal(def, this.defBlock); + }); + test('Multiple Procedures', function() { + var def2 = new Blockly.Block(this.workspace, testSuite.defType); + def2.setFieldValue('proc name2', 'NAME'); + var caller2 = new Blockly.Block(this.workspace, testSuite.callType); + caller2.setFieldValue('proc name2', 'NAME'); + + var def = + Blockly.Procedures.getDefinition('proc name', this.workspace); + chai.assert.equal(def, this.defBlock); + }); + test('Multiple Workspaces', function() { + var workspace = new Blockly.Workspace(); + try { + var def2 = new Blockly.Block(workspace, testSuite.defType); + def2.setFieldValue('proc name', 'NAME'); + var caller2 = new Blockly.Block(workspace, testSuite.callType); + caller2.setFieldValue('proc name', 'NAME'); + + var def = + Blockly.Procedures.getDefinition('proc name', this.workspace); + chai.assert.equal(def, this.defBlock); + + def = Blockly.Procedures.getDefinition('proc name', workspace); + chai.assert.equal(def, def2); + } finally { + workspaceTeardown.call(this, workspace); + } + }); + }); + + suite('Enable/Disable', function() { + setup(function() { + var toolbox = document.getElementById('toolbox-categories'); + this.workspaceSvg = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspaceSvg); + }); + const domText = (testSuite.defType === 'procedures_defreturn') ? + ('' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '') : + ('' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + setup(function() { + var dom = Blockly.Xml.textToDom(domText); + + Blockly.Xml.appendDomToWorkspace(dom, this.workspaceSvg); + this.barDef = this.workspaceSvg.getBlockById('bar-def'); + this.barCalls = [ + this.workspaceSvg.getBlockById('bar-c1'), + this.workspaceSvg.getBlockById('bar-c2') + ]; + }); + + test('Set disabled updates callers', function() { + this.workspaceSvg.clearUndo(); + Blockly.Events.setGroup('g1'); + this.barDef.setEnabled(false); + Blockly.Events.setGroup(false); + + for (var i = 0; i < 2; i++) { + chai.assert.isFalse(this.barCalls[i].isEnabled(), + 'Callers are disabled when their definition is disabled (call ' + + i + ')'); + } + var firedEvents = this.workspaceSvg.undoStack_; + chai.assert.equal(firedEvents.length, 3, + 'An event was fired for the definition and each caller'); + for (var i = 0; i < 3; i++) { + chai.assert.equal(firedEvents[i].group, 'g1', + 'Disable events are in the same group (event ' + i + ')'); + } + + this.workspaceSvg.clearUndo(); + Blockly.Events.setGroup('g2'); + this.barDef.setEnabled(true); + Blockly.Events.setGroup(false); + + for (var i = 0; i < 2; i++) { + chai.assert.isTrue(this.barCalls[i].isEnabled(), + 'Callers are enabled when their definition is enabled (call ' + + i + ')'); + } + chai.assert.equal(firedEvents.length,3, + 'An event was fired for the definition and each caller'); + for (var i = 0; i < 3; i++) { + chai.assert.equal(firedEvents[i].group, 'g2', + 'Enable events are in the same group (event ' + i + ')'); + } + }); + test('Set disabled updates callers while remembering old caller state', function() { + this.barCalls[0].setEnabled(false); + this.workspaceSvg.clearUndo(); + Blockly.Events.setGroup('g1'); + this.barDef.setEnabled(false); + Blockly.Events.setGroup(false); + + for (var i = 0; i < 2; i++) { + chai.assert.isFalse(this.barCalls[i].isEnabled(), + 'Callers are disabled when their definition is disabled (call ' + + i + ')'); + } + var firedEvents = this.workspaceSvg.undoStack_; + chai.assert.equal(firedEvents.length, 2, + 'An event was fired for the definition and the enabled caller'); + for (var i = 0; i < 2; i++) { + chai.assert.equal(firedEvents[i].group, 'g1', + 'Disable events are in the same group (event ' + i + ')'); + } + + this.workspaceSvg.clearUndo(); + Blockly.Events.setGroup('g2'); + this.barDef.setEnabled(true); + Blockly.Events.setGroup(false); + + chai.assert.isFalse(this.barCalls[0].isEnabled(), + 'Caller remains in disabled state when the definition is enabled'); + chai.assert.isTrue(this.barCalls[1].isEnabled(), + 'Caller returns to previous enabled state when the definition is enabled'); + chai.assert.equal(firedEvents.length,2, + 'An event was fired for the definition and the enabled caller'); + for (var i = 0; i < 2; i++) { + chai.assert.equal(firedEvents[i].group, 'g2', + 'Enable events are in the same group (event ' + i + ')'); + } + }); + }); + suite('Mutation', function() { + setup(function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + this.callBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callBlock.setFieldValue('proc name', 'NAME'); + 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); + } + if (testSuite.defType === 'procedures_defreturn') { + test('Has Statements', function() { + setStatementValue(this.workspace, this.defBlock, true); + chai.assert.isTrue(this.defBlock.hasStatements_); + }); + test('Has No Statements', function() { + setStatementValue(this.workspace, this.defBlock, false); + chai.assert.isFalse(this.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]); + } + } + test('Simple Add Arg', function() { + var args = ['arg1']; + createMutator.call(this, args); + assertArgs.call(this, args); + }); + test('Multiple Args', function() { + var args = ['arg1', 'arg2', 'arg3']; + createMutator.call(this, args); + assertArgs.call(this, args); + }); + test('Simple Change Arg', function() { + createMutator.call(this, ['arg1']); + this.argBlock.setFieldValue('arg2', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['arg2']); + }); + test('lower -> CAPS', function() { + createMutator.call(this, ['arg']); + this.argBlock.setFieldValue('ARG', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['ARG']); + }); + test('CAPS -> lower', function() { + createMutator.call(this, ['ARG']); + this.argBlock.setFieldValue('arg', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['arg']); + }); + // Test case for #1958 + test('Set Arg Empty', function() { + var args = ['arg1']; + createMutator.call(this, args); + this.argBlock.setFieldValue('', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, args); + }); + test('Whitespace', function() { + var args = ['arg1']; + createMutator.call(this, args); + this.argBlock.setFieldValue(' ', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, args); + }); + test('Whitespace and Text', function() { + createMutator.call(this, ['arg1']); + this.argBlock.setFieldValue(' text ', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['text']); + }); + test('<>', function() { + var args = ['<>']; + createMutator.call(this, args); + assertArgs.call(this, args); + }); + }); + }); + suite('Decomposition', function() { + suite('Statements', function() { + if (testSuite.defType === 'procedures_defreturn') { + test('Has Statement Input', function() { + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.defBlock.decompose(mutatorWorkspace); + var statementInput = mutatorWorkspace.getTopBlocks()[0] + .getInput('STATEMENT_INPUT'); + chai.assert.isNotNull(statementInput); + }); + test('Has Statements', function() { + this.defBlock.hasStatements_ = true; + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.defBlock.decompose(mutatorWorkspace); + var statementValue = mutatorWorkspace.getTopBlocks()[0] + .getField('STATEMENTS').getValueBoolean(); + chai.assert.isTrue(statementValue); + }); + test('No Has Statements', function() { + this.defBlock.hasStatements_ = false; + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.defBlock.decompose(mutatorWorkspace); + var statementValue = mutatorWorkspace.getTopBlocks()[0] + .getField('STATEMENTS').getValueBoolean(); + chai.assert.isFalse(statementValue); + }); + } else { + test('Has no Statement Input', function() { + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.defBlock.decompose(mutatorWorkspace); + var statementInput = mutatorWorkspace.getTopBlocks()[0] + .getInput('STATEMENT_INPUT'); + chai.assert.isNull(statementInput); + }); + } + }); + 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() { + assertArguments.call(this, ['arg']); + }); + test('Multiple Args', function() { + assertArguments.call(this, ['arg1', 'arg2']); + }); + test('<>', function() { + assertArguments.call(this, ['<>']); + }); + }); + }); + }); + /** + * Test cases for serialization tests. + * @type {Array} + */ + const testCases = [ + { + title: 'Minimal definition', + xml: '', + expectedXml: + '\n' + + ' unnamed\n' + + '', + assertBlockStructure: + (block) => { + assertDefBlockStructure(block, testSuite.hasReturn); + }, + }, + { + title: 'Common definition', + xml: + '' + + ' do something' + + '', + expectedXml: + '\n' + + ' do something\n' + + '', + assertBlockStructure: + (block) => { + assertDefBlockStructure(block, testSuite.hasReturn); + }, + }, + { + title: 'With vars definition', + xml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' do something\n' + + '', + expectedXml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' do something\n' + + '', + assertBlockStructure: + (block) => { + assertDefBlockStructure( + block, testSuite.hasReturn, ['x', 'y'], ['arg1', 'arg2']); + }, + }, + { + title: 'With pre-created vars definition', + xml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' do something\n' + + '', + expectedXml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' do something\n' + + '', + assertBlockStructure: + (block) => { + assertDefBlockStructure(block, testSuite.hasReturn, + ['preCreatedVar'], ['preCreatedVarId']); + }, + }, + { + title: 'With pre-created typed vars definition', + xml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' do something\n' + + '', + expectedXml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' do something\n' + + '', + assertBlockStructure: + (block) => { + assertDefBlockStructure(block, testSuite.hasReturn, + ['preCreatedTypedVar'], ['preCreatedTypedVarId']); + }, + }, + { + title: 'No statements definition', + xml: + '\n' + + ' \n' + + ' do something\n' + + '', + expectedXml: + '\n' + + ' \n' + + ' do something\n' + + '', + assertBlockStructure: + (block) => { + assertDefBlockStructure(block, true, [], [], false); + }, + }, + { + title: 'Minimal caller', + xml: '', + expectedXml: + '\n' + + ' \n' + + '', + assertBlockStructure: + (block) => { + assertCallBlockStructure(block); + }, + }, + { + title: 'Common caller', + xml: + '\n' + + ' \n' + + '', + expectedXml: + '\n' + + ' \n' + + '', + assertBlockStructure: + (block) => { + assertCallBlockStructure(block); + }, + }, + { + title: 'With pre-created vars caller', + xml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + '', + expectedXml: + '\n' + + ' \n' + + ' \n' + + ' \n' + + '', + assertBlockStructure: + (block) => { + assertCallBlockStructure(block, ['preCreatedVar'], ['preCreatedVarId']); + }, + }, + ]; + testHelpers.runSerializationTestSuite(testCases); + }); + }); +}); diff --git a/static/js/tests/mocha/procedures_test_helpers.js b/static/js/tests/mocha/procedures_test_helpers.js new file mode 100644 index 0000000..3abe470 --- /dev/null +++ b/static/js/tests/mocha/procedures_test_helpers.js @@ -0,0 +1,135 @@ +/** + * Asserts that the procedure definition or call block has the expected var + * models. + * @param {!Blockly.Block} block The procedure definition or call block to + * check. + * @param {!Array} varIds An array of variable ids. + * @private + */ +function assertBlockVarModels(block, varIds) { + const expectedVarModels = []; + for (let i = 0; i < varIds.length; i++) { + expectedVarModels.push(block.workspace.getVariableById(varIds[i])); + } + chai.assert.sameDeepOrderedMembers(block.getVarModels(), expectedVarModels); +} + +/** + * Asserts that the procedure call block has the expected arguments. + * @param {!Blockly.Block} callBlock The procedure definition block. + * @param {Array=} args An array of argument names. + * @private + */ +function assertCallBlockArgsStructure_(callBlock, args) { + // inputList also contains "TOPROW" + chai.assert.equal(callBlock.inputList.length - 1, args.length, + 'call block has the expected number of args'); + + for (let i = 0; i < args.length; i++) { + const expectedName = args[i]; + const callInput = callBlock.inputList[i + 1]; + chai.assert.equal(callInput.type, Blockly.INPUT_VALUE); + chai.assert.equal(callInput.name, 'ARG' + i); + chai.assert.equal(callInput.fieldRow[0].getValue(), expectedName, + 'Call block consts did not match expected.'); + } + chai.assert.sameOrderedMembers(callBlock.getVars(), args); +} + +/** + * Asserts that the procedure definition block has the expected inputs and + * fields. + * @param {!Blockly.Block} defBlock The procedure definition block. + * @param {boolean=} hasReturn If we expect the procedure def to have a return + * input or not. + * @param {Array=} args An array of argument names. + * @param {Array=} varIds An array of variable ids. + * @param {boolean=} hasStatements If we expect the procedure def to have a + * statement input or not. + */ +function assertDefBlockStructure(defBlock, hasReturn = false, + args = [], varIds = [], hasStatements = true) { + if (hasStatements) { + chai.assert.isNotNull(defBlock.getInput('STACK'), + 'Def block should have STACK input'); + } else { + chai.assert.isNull(defBlock.getInput('STACK'), + 'Def block should not have STACK input'); + } + if (hasReturn) { + chai.assert.isNotNull(defBlock.getInput('RETURN'), + 'Def block should have RETURN input'); + } else { + chai.assert.isNull(defBlock.getInput('RETURN'), + 'Def block should not have RETURN input'); + } + if (args.length) { + chai.assert.include(defBlock.toString(), 'with', + 'Def block string should include "with"'); + } else { + chai.assert.notInclude(defBlock.toString(), 'with', + 'Def block string should not include "with"'); + } + + chai.assert.sameOrderedMembers(defBlock.getVars(), args); + assertBlockVarModels(defBlock, varIds); +} + +/** + * Asserts that the procedure definition block has the expected inputs and + * fields. + * @param {!Blockly.Block} callBlock The procedure call block. + * @param {Array=} args An array of argument names. + * @param {Array=} varIds An array of variable ids. + */ +function assertCallBlockStructure(callBlock, args = [], varIds = []) { + if (args.length) { + chai.assert.include(callBlock.toString(), 'with'); + } else { + chai.assert.notInclude(callBlock.toString(), 'with'); + } + + assertCallBlockArgsStructure_(callBlock, args); + assertBlockVarModels(callBlock, varIds); +} + +/** + * Creates procedure definition block using domToBlock call. + * @param {!Blockly.Workspace} workspace The Blockly workspace. + * @param {boolean=} hasReturn Whether the procedure definition should have + * return. + * @param {Array=} args An array of argument names. + * @return {Blockly.Block} The created block. + */ +function createProcDefBlock( + workspace, hasReturn = false, args = []) { + const type = hasReturn ? + 'procedures_defreturn' : 'procedures_defnoreturn'; + let xml = ''; + for (let i = 0; i < args.length; i ++) { + xml += + ' \n'; + } + xml += + ' proc name' + + ''; + return Blockly.Xml.domToBlock(Blockly.Xml.textToDom(xml), workspace); +} + +/** + * Creates procedure call block using domToBlock call. + * @param {!Blockly.Workspace} workspace The Blockly workspace. + * @param {boolean=} hasReturn Whether the corresponding procedure definition + * has return. + * @return {Blockly.Block} The created block. + */ +function createProcCallBlock( + workspace, hasReturn = false) { + const type = hasReturn ? + 'procedures_callreturn' : 'procedures_callnoreturn'; + return Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), workspace); +} diff --git a/static/js/tests/mocha/registry_test.js b/static/js/tests/mocha/registry_test.js new file mode 100644 index 0000000..f417119 --- /dev/null +++ b/static/js/tests/mocha/registry_test.js @@ -0,0 +1,96 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Tests for Blockly.registry + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +suite('Registry', function() { + var TestClass = function() {}; + TestClass.prototype.testMethod = function() { + return 'something'; + }; + + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + if (Blockly.registry.typeMap_['test'] && + Blockly.registry.typeMap_['test']['test_name']) { + delete Blockly.registry.typeMap_['test']['test_name']; + } + }); + suite('Registration', function() { + test('Simple', function() { + Blockly.registry.register('test', 'test_name', TestClass); + }); + test('Empty String Key', function() { + chai.assert.throws(function() { + Blockly.registry.register('test', '', TestClass); + }, 'Invalid name'); + }); + test('Class as Key', function() { + chai.assert.throws(function() { + Blockly.registry.register('test', TestClass, ''); + }, 'Invalid name'); + }); + test('Overwrite a Key', function() { + Blockly.registry.register('test', 'test_name', TestClass); + chai.assert.throws(function() { + Blockly.registry.register('test', 'test_name', TestClass); + }, 'already registered'); + }); + test('Null Value', function() { + chai.assert.throws(function() { + Blockly.registry.register('test', 'field_custom_test', null); + }, 'Can not register a null value'); + }); + }); + suite('getClassFromOptions', function() { + setup(function() { + this.defaultClass = function() {}; + this.defaultClass.prototype.testMethod = function() { + return 'default'; + }; + this.options = { + 'plugins': { + 'test' : 'test_name' + } + }; + Blockly.registry.typeMap_['test'] = { + 'test_name': TestClass, + 'default': this.defaultClass + }; + }); + test('Simple - Plugin name given', function() { + var testClass = Blockly.registry.getClassFromOptions('test', this.options); + chai.assert.instanceOf(new testClass(), TestClass); + }); + test('Simple - Plugin class given', function() { + this.options.plugins['test'] = TestClass; + var testClass = Blockly.registry.getClassFromOptions('test', this.options); + chai.assert.instanceOf(new testClass(), TestClass); + }); + test('No Plugin Name Given', function() { + delete this.options['plugins']['test']; + var testClass = Blockly.registry.getClassFromOptions('test', this.options); + chai.assert.instanceOf(new testClass(), this.defaultClass); + }); + test('Incorrect Plugin Name', function() { + this.options['plugins']['test'] = 'random'; + var testClass; + var warnings = captureWarnings(() => { + testClass = Blockly.registry.getClassFromOptions('test', this.options); + }); + chai.assert.isNull(testClass); + chai.assert.equal(warnings.length, 1, + 'Expecting 1 warning about no name "random" found.'); + }); + }); +}); diff --git a/static/js/tests/mocha/run_mocha_tests_in_browser.js b/static/js/tests/mocha/run_mocha_tests_in_browser.js new file mode 100644 index 0000000..5adeabc --- /dev/null +++ b/static/js/tests/mocha/run_mocha_tests_in_browser.js @@ -0,0 +1,76 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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' + }, + path: '/wd/hub' + }; + // Run in headless mode on Github Actions. + if (process.env.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'; + }, { + timeout: 50000 + }); + + 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/static/js/tests/mocha/shortcut_registry_test.js b/static/js/tests/mocha/shortcut_registry_test.js new file mode 100644 index 0000000..b374187 --- /dev/null +++ b/static/js/tests/mocha/shortcut_registry_test.js @@ -0,0 +1,355 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Keyboard Shortcut Registry Test', function() { + setup(function() { + sharedTestSetup.call(this); + this.registry = new Blockly.ShortcutRegistry(); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Registering', function() { + test('Registering a shortcut', function() { + var testShortcut = {'name': 'test_shortcut'}; + this.registry.register(testShortcut, true); + var shortcut = this.registry.registry_['test_shortcut']; + chai.assert.equal(shortcut.name, 'test_shortcut'); + }); + test('Registers shortcut with same name', function() { + var registry = this.registry; + var testShortcut = {'name': 'test_shortcut'}; + + registry.registry_['test_shortcut'] = [testShortcut]; + + var shouldThrow = function() { + registry.register(testShortcut); + }; + chai.assert.throws( + shouldThrow, Error, + 'Shortcut with name "test_shortcut" already exists.'); + }); + test( + 'Registers shortcut with same name opt_allowOverrides=true', + function() { + var registry = this.registry; + var testShortcut = {'name': 'test_shortcut'}; + var otherShortcut = { + 'name': 'test_shortcut', + 'callback': function() {} + }; + + registry.registry_['test_shortcut'] = [testShortcut]; + + var shouldNotThrow = function() { + registry.register(otherShortcut, true); + }; + chai.assert.doesNotThrow(shouldNotThrow); + chai.assert.exists(registry.registry_['test_shortcut'].callback); + }); + }); + + suite('Unregistering', function() { + test('Unregistering a shortcut', function() { + var testShortcut = {'name': 'test_shortcut'}; + this.registry.registry_['test'] = [testShortcut]; + chai.assert.isOk(this.registry.registry_['test']); + this.registry.unregister('test', 'test_shortcut'); + chai.assert.isUndefined(this.registry.registry_['test']); + }); + test('Unregistering a nonexistent shortcut', function() { + var consoleStub = sinon.stub(console, 'warn'); + chai.assert.isUndefined(this.registry.registry_['test']); + + var registry = this.registry; + chai.assert.isFalse(registry.unregister('test', 'test_shortcut')); + sinon.assert.calledOnceWithExactly(consoleStub, 'Keyboard shortcut with name "test" not found.'); + }); + test('Unregistering a shortcut with key mappings', function() { + var testShortcut = {'name': 'test_shortcut'}; + this.registry.keyMap_['keyCode'] = ['test_shortcut']; + this.registry.registry_['test_shortcut'] = testShortcut; + + this.registry.unregister('test_shortcut'); + + var shortcut = this.registry.registry_['test']; + var keyMappings = this.registry.keyMap_['keyCode']; + chai.assert.isUndefined(shortcut); + chai.assert.isUndefined(keyMappings); + }); + test('Unregistering a shortcut with colliding key mappings', function() { + var testShortcut = {'name': 'test_shortcut'}; + this.registry.keyMap_['keyCode'] = ['test_shortcut', 'other_shortcutt']; + this.registry.registry_['test_shortcut'] = testShortcut; + + this.registry.unregister('test_shortcut'); + + var shortcut = this.registry.registry_['test']; + var keyMappings = this.registry.keyMap_['keyCode']; + chai.assert.lengthOf(keyMappings, 1); + chai.assert.isUndefined(shortcut); + }); + }); + + suite('addKeyMapping', function() { + test('Adds a key mapping', function() { + this.registry.registry_['test_shortcut'] = {'name': 'test_shortcut'}; + + this.registry.addKeyMapping('keyCode', 'test_shortcut'); + + var shortcutNames = this.registry.keyMap_['keyCode']; + chai.assert.lengthOf(shortcutNames, 1); + chai.assert.equal(shortcutNames[0], 'test_shortcut'); + }); + test('Adds a colliding key mapping - opt_allowCollision=true', function() { + this.registry.registry_['test_shortcut'] = {'name': 'test_shortcut'}; + this.registry.keyMap_['keyCode'] = ['test_shortcut_2']; + + this.registry.addKeyMapping('keyCode', 'test_shortcut', true); + + var shortcutNames = this.registry.keyMap_['keyCode']; + chai.assert.lengthOf(shortcutNames, 2); + chai.assert.equal(shortcutNames[0], 'test_shortcut'); + chai.assert.equal(shortcutNames[1], 'test_shortcut_2'); + }); + test('Adds a colliding key mapping - opt_allowCollision=false', function() { + this.registry.registry_['test_shortcut'] = {'name': 'test_shortcut'}; + this.registry.keyMap_['keyCode'] = ['test_shortcut_2']; + + var registry = this.registry; + var shouldThrow = function() { + registry.addKeyMapping('keyCode', 'test_shortcut'); + }; + chai.assert.throws( + shouldThrow, Error, + 'Shortcut with name "test_shortcut" collides with shortcuts test_shortcut_2'); + }); + }); + + suite('removeKeyMapping', function() { + test('Removes a key mapping', function() { + this.registry.registry_['test_shortcut'] = {'name': 'test_shortcut'}; + this.registry.keyMap_['keyCode'] = ['test_shortcut', 'test_shortcut_2']; + + var isRemoved = + this.registry.removeKeyMapping('keyCode', 'test_shortcut'); + + var shortcutNames = this.registry.keyMap_['keyCode']; + chai.assert.lengthOf(shortcutNames, 1); + chai.assert.equal(shortcutNames[0], 'test_shortcut_2'); + chai.assert.isTrue(isRemoved); + }); + test('Removes last key mapping for a key', function() { + this.registry.registry_['test_shortcut'] = {'name': 'test_shortcut'}; + this.registry.keyMap_['keyCode'] = ['test_shortcut']; + + this.registry.removeKeyMapping('keyCode', 'test_shortcut'); + + var shortcutNames = this.registry.keyMap_['keyCode']; + chai.assert.isUndefined(shortcutNames); + }); + test('Removes a key map that does not exist opt_quiet=false', function() { + var consoleStub = sinon.stub(console, 'warn'); + this.registry.keyMap_['keyCode'] = ['test_shortcut_2']; + + var isRemoved = + this.registry.removeKeyMapping('keyCode', 'test_shortcut'); + + chai.assert.isFalse(isRemoved); + sinon.assert.calledOnceWithExactly( + consoleStub, + 'No keyboard shortcut with name "test_shortcut" registered with key code "keyCode"'); + }); + test( + 'Removes a key map that does not exist from empty key mapping opt_quiet=false', + function() { + var consoleStub = sinon.stub(console, 'warn'); + + var isRemoved = + this.registry.removeKeyMapping('keyCode', 'test_shortcut'); + + chai.assert.isFalse(isRemoved); + sinon.assert.calledOnceWithExactly( + consoleStub, + 'No keyboard shortcut with name "test_shortcut" registered with key code "keyCode"'); + }); + }); + + suite('Setters/Getters', function() { + test('Sets the key map', function() { + this.registry.setKeyMap({'keyCode': ['test_shortcut']}); + chai.assert.lengthOf(Object.keys(this.registry.keyMap_), 1); + chai.assert.equal(this.registry.keyMap_['keyCode'][0], 'test_shortcut'); + }); + test('Gets a copy of the key map', function() { + this.registry.keyMap_['keyCode'] = ['a']; + var keyMapCopy = this.registry.getKeyMap(); + keyMapCopy['keyCode'] = ['b']; + chai.assert.equal(this.registry.keyMap_['keyCode'][0], 'a'); + }); + test('Gets a copy of the registry', function() { + this.registry.registry_['shortcutName'] = {'name': 'shortcutName'}; + var registrycopy = this.registry.getRegistry(); + registrycopy['shortcutName']['name'] = 'shortcutName1'; + chai.assert.equal( + this.registry.registry_['shortcutName']['name'], 'shortcutName'); + }); + test('Gets keyboard shortcuts from a key code', function() { + this.registry.keyMap_['keyCode'] = ['shortcutName']; + var shortcutNames = this.registry.getShortcutNamesByKeyCode('keyCode'); + chai.assert.equal(shortcutNames[0], 'shortcutName'); + }); + test('Gets keycodes by shortcut name', function() { + this.registry.keyMap_['keyCode'] = ['shortcutName']; + this.registry.keyMap_['keyCode1'] = ['shortcutName']; + var shortcutNames = + this.registry.getKeyCodesByShortcutName('shortcutName'); + chai.assert.lengthOf(shortcutNames, 2); + chai.assert.equal(shortcutNames[0], 'keyCode'); + chai.assert.equal(shortcutNames[1], 'keyCode1'); + }); + }); + + suite('onKeyDown', function() { + function addShortcut(registry, shortcut, keyCode, returns) { + registry.register(shortcut, true); + registry.addKeyMapping(keyCode, shortcut.name, true); + return sinon.stub(shortcut, 'callback').returns(returns); + } + + setup(function() { + this.testShortcut = { + 'name': 'test_shortcut', + 'callback': function() { + return true; + }, + 'precondition': function() { + return true; + } + }; + this.callBackStub = + addShortcut(this.registry, this.testShortcut, 'keyCode', true); + }); + test('Execute a shortcut from event', function() { + var event = createKeyDownEvent('keyCode', ''); + chai.assert.isTrue(this.registry.onKeyDown(this.workspace, event)); + sinon.assert.calledOnce(this.callBackStub); + }); + test('No shortcut executed from event', function() { + var event = createKeyDownEvent('nonExistentKeyCode', ''); + chai.assert.isFalse(this.registry.onKeyDown(this.workspace, event)); + }); + test('No precondition available - execute callback', function() { + delete this.testShortcut['precondition']; + var event = createKeyDownEvent('keyCode', ''); + chai.assert.isTrue(this.registry.onKeyDown(this.workspace, event)); + sinon.assert.calledOnce(this.callBackStub); + }); + test('Execute all shortcuts in list', function() { + var event = createKeyDownEvent('keyCode', ''); + var testShortcut2 = { + 'name': 'test_shortcut_2', + 'callback': function() { + return false; + }, + 'precondition': function() { + return false; + } + }; + var testShortcut2Stub = + addShortcut(this.registry, testShortcut2, 'keyCode', false); + chai.assert.isTrue(this.registry.onKeyDown(this.workspace, event)); + sinon.assert.calledOnce(testShortcut2Stub); + sinon.assert.calledOnce(this.callBackStub); + }); + test('Stop executing shortcut when event is handled', function() { + var event = createKeyDownEvent('keyCode', ''); + var testShortcut2 = { + 'name': 'test_shortcut_2', + 'callback': function() { + return false; + }, + 'precondition': function() { + return false; + } + }; + var testShortcut2Stub = + addShortcut(this.registry, testShortcut2, 'keyCode', true); + chai.assert.isTrue(this.registry.onKeyDown(this.workspace, event)); + sinon.assert.calledOnce(testShortcut2Stub); + sinon.assert.notCalled(this.callBackStub); + }); + }); + + suite('createSerializedKey', function() { + test('Serialize key', function() { + var serializedKey = + this.registry.createSerializedKey(Blockly.utils.KeyCodes.A); + chai.assert.equal(serializedKey, '65'); + }); + + test('Serialize key code and modifier', function() { + var serializedKey = this.registry.createSerializedKey( + Blockly.utils.KeyCodes.A, [Blockly.utils.KeyCodes.CTRL]); + chai.assert.equal(serializedKey, 'Control+65'); + }); + test('Serialize only a modifier', function() { + var serializedKey = this.registry.createSerializedKey( + null, [Blockly.utils.KeyCodes.CTRL]); + chai.assert.equal(serializedKey, 'Control'); + }); + test('Serialize multiple modifiers', function() { + var serializedKey = this.registry.createSerializedKey( + null, [Blockly.utils.KeyCodes.CTRL, Blockly.utils.KeyCodes.SHIFT]); + chai.assert.equal(serializedKey, 'Shift+Control'); + }); + test('Order of modifiers should result in same serialized key', function() { + var serializedKey = this.registry.createSerializedKey( + null, [Blockly.utils.KeyCodes.CTRL, Blockly.utils.KeyCodes.SHIFT]); + chai.assert.equal(serializedKey, 'Shift+Control'); + var serializedKeyNewOrder = this.registry.createSerializedKey( + null, [Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.CTRL]); + chai.assert.equal(serializedKeyNewOrder, 'Shift+Control'); + }); + }); + + suite('serializeKeyEvent', function() { + test('Serialize key', function() { + var mockEvent = createKeyDownEvent(Blockly.utils.KeyCodes.A, ''); + var serializedKey = this.registry.serializeKeyEvent_(mockEvent); + chai.assert.equal(serializedKey, '65'); + }); + test('Serialize key code and modifier', function() { + var mockEvent = createKeyDownEvent( + Blockly.utils.KeyCodes.A, '', [Blockly.utils.KeyCodes.CTRL]); + var serializedKey = this.registry.serializeKeyEvent_(mockEvent); + chai.assert.equal(serializedKey, 'Control+65'); + }); + test('Serialize only a modifier', function() { + var mockEvent = + createKeyDownEvent(null, '', [Blockly.utils.KeyCodes.CTRL]); + var serializedKey = this.registry.serializeKeyEvent_(mockEvent); + chai.assert.equal(serializedKey, 'Control'); + }); + test('Serialize multiple modifiers', function() { + var mockEvent = createKeyDownEvent( + null, '', + [Blockly.utils.KeyCodes.CTRL, Blockly.utils.KeyCodes.SHIFT]); + var serializedKey = this.registry.serializeKeyEvent_(mockEvent); + chai.assert.equal(serializedKey, 'Shift+Control'); + }); + test('Throw error when incorrect modifier', function() { + var registry = this.registry; + var shouldThrow = function() { + registry.createSerializedKey(Blockly.utils.KeyCodes.K, ['s']); + }; + chai.assert.throws(shouldThrow, Error, 's is not a valid modifier key.'); + }); + }); + + teardown(function() {}); +}); diff --git a/static/js/tests/mocha/test_helpers.js b/static/js/tests/mocha/test_helpers.js new file mode 100644 index 0000000..1510953 --- /dev/null +++ b/static/js/tests/mocha/test_helpers.js @@ -0,0 +1,625 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * 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 assertVariableValues(container, name, type, id) { + var variable = container.getVariableById(id); + chai.assert.isDefined(variable); + chai.assert.equal(variable.name, name); + chai.assert.equal(variable.type, type); + chai.assert.equal(variable.getId(), id); +} + +/** + * Captures 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); + }; + innerFunc(); + } finally { + console.warn = nativeConsoleWarn; + } + return msgs; +} + +/** + * Asserts that the given function logs the provided warning messages. + * @param {function} innerFunc The function to call. + * @param {Array|!RegExp} messages A list of regex for the expected + * messages (in the expected order). + */ +function assertWarnings(innerFunc, messages) { + if (!Array.isArray(messages)) { + messages = [messages]; + } + var warnings = captureWarnings(innerFunc); + chai.assert.lengthOf(warnings, messages.length); + messages.forEach((message, i) => { + chai.assert.match(warnings[i], message); + }); +} + +/** + * Asserts that the given function logs no warning messages. + * @param {function} innerFunc The function to call. + */ +function assertNoWarnings(innerFunc) { + assertWarnings(innerFunc, []); +} + +/** + * Stubs Blockly.utils.deprecation.warn call. + * @return {!SinonStub} The created stub. + */ +function createDeprecationWarningStub() { + return sinon.stub(Blockly.utils.deprecation, 'warn'); +} + +/** + * Asserts whether the given deprecation warning stub or call was called with + * the expected functionName. + * @param {!SinonSpy|!SinonSpyCall} spyOrSpyCall The spy or spy call to use. + * @param {string} functionName The function name to check that the given spy or + * spy call was called with. + */ +function assertDeprecationWarningCall(spyOrSpyCall, functionName) { + sinon.assert.calledWith(spyOrSpyCall, functionName); +} + +/** + * Asserts that there was a single deprecation warning call with the given + * functionName passed. + * @param {!SinonSpy} spy The spy to use. + * @param {string} functionName The function name to check that the given spy + * was called with. + */ +function assertSingleDeprecationWarningCall(spy, functionName) { + sinon.assert.calledOnce(spy); + assertDeprecationWarningCall(spy.getCall(0), functionName); +} + +/** + * Safely disposes of Blockly workspace, logging any errors. + * Assumes that sharedTestSetup has also been called. This should be called + * using workspaceTeardown.call(this). + * @param {!Blockly.Workspace} workspace The workspace to dispose. + */ +function workspaceTeardown(workspace) { + try { + this.clock.runAll(); // Run all queued setTimeout calls. + workspace.dispose(); + this.clock.runAll(); // Run all remaining queued setTimeout calls. + } catch (e) { + var testRef = this.currentTest || this.test; + console.error(testRef.fullTitle() + '\n', e); + } +} + +/** + * Creates stub for Blockly.Events.fire that advances the clock forward after + * the event fires so it is processed immediately instead of on a timeout. + * @param {!SinonClock} clock The sinon clock. + * @return {!SinonStub} The created stub. + * @private + */ +function createEventsFireStubFireImmediately_(clock) { + var stub = sinon.stub(Blockly.Events, 'fire'); + stub.callsFake(function(event) { + // Call original method. + stub.wrappedMethod.call(this, ...arguments); + // Advance clock forward to run any queued events. + clock.runAll(); + }); + return stub; +} + +/** + * Adds message to shared cleanup object so that it is cleaned from + * Blockly.Messages global in sharedTestTeardown. + * @param {!Object} sharedCleanupObj The shared cleanup object created in + * sharedTestSetup. + * @param {string} message The message to add to shared cleanup object. + */ +function addMessageToCleanup(sharedCleanupObj, message) { + sharedCleanupObj.messagesCleanup_.push(message); +} + +/** + * Adds block type to shared cleanup object so that it is cleaned from + * Blockly.Blocks global in sharedTestTeardown. + * @param {!Object} sharedCleanupObj The shared cleanup object created in + * sharedTestSetup. + * @param {string} blockType The block type to add to shared cleanup object. + */ +function addBlockTypeToCleanup(sharedCleanupObj, blockType) { + sharedCleanupObj.blockTypesCleanup_.push(blockType); +} + +/** + * Wraps Blockly.defineBlocksWithJsonArray using stub in order to keep track of + * block types passed in to method on shared cleanup object so they are cleaned + * from Blockly.Blocks global in sharedTestTeardown. + * @param {!Object} sharedCleanupObj The shared cleanup object created in + * sharedTestSetup. + * @private + */ +function wrapDefineBlocksWithJsonArrayWithCleanup_(sharedCleanupObj) { + var stub = sinon.stub(Blockly, 'defineBlocksWithJsonArray'); + stub.callsFake(function(jsonArray) { + if (jsonArray) { + jsonArray.forEach((jsonBlock) => { + if (jsonBlock) { + addBlockTypeToCleanup(sharedCleanupObj, jsonBlock['type']); + } + }); + } + // Calls original method. + stub.wrappedMethod.call(this, ...arguments); + }); +} + +/** + * Shared setup method that sets up fake timer for clock so that pending + * setTimeout calls can be cleared in test teardown along with other common + * stubs. Should be called in setup of outermost suite using + * sharedTestSetup.call(this). + * The sinon fake timer defined on this.clock_ should not be reset in tests to + * avoid causing issues with cleanup in sharedTestTeardown. + * + * Stubs created in this setup (unless disabled by options passed): + * - Blockly.Events.fire - this.eventsFireStub - wraps fire event to trigger + * fireNow_ call immediately, rather than on timeout + * - Blockly.defineBlocksWithJsonArray - thin wrapper that adds logic to keep + * track of block types defined so that they can be undefined in + * sharedTestTeardown and calls original method. + * + * @param {Object} options Options to enable/disable setup + * of certain stubs. + */ +function sharedTestSetup(options = {}) { + this.sharedSetupCalled_ = true; + // Sandbox created for greater control when certain stubs are cleared. + this.sharedSetupSandbox_ = sinon.createSandbox(); + this.clock = this.sharedSetupSandbox_.useFakeTimers(); + if (options['fireEventsNow'] === undefined || options['fireEventsNow']) { + // Stubs event firing unless passed option "fireEventsNow: false" + this.eventsFireStub = createEventsFireStubFireImmediately_(this.clock); + } + this.sharedCleanup = { + blockTypesCleanup_: [], + messagesCleanup_: [] + + }; + this.blockTypesCleanup_ = this.sharedCleanup.blockTypesCleanup_; + this.messagesCleanup_ = this.sharedCleanup.messagesCleanup_; + wrapDefineBlocksWithJsonArrayWithCleanup_(this.sharedCleanup); +} + +/** + * Shared cleanup method that clears up pending setTimeout calls, disposes of + * workspace, and resets global variables. Should be called in setup of + * outermost suite using sharedTestTeardown.call(this). + */ +function sharedTestTeardown() { + var testRef = this.currentTest || this.test; + if (!this.sharedSetupCalled_) { + console.error('"' + testRef.fullTitle() + + '" did not call sharedTestSetup'); + } + + try { + if (this.workspace) { + workspaceTeardown.call(this, this.workspace); + this.workspace = null; + } else { + this.clock.runAll(); // Run all queued setTimeout calls. + } + } catch (e) { + console.error(testRef.fullTitle() + '\n', e); + } finally { + // Clear Blockly.Event state. + Blockly.Events.setGroup(false); + Blockly.Events.disabled_ = 0; + if (Blockly.Events.FIRE_QUEUE_.length) { + // If this happens, it may mean that some previous test is missing cleanup + // (i.e. a previous test added an event to the queue on a timeout that + // did not use a stubbed clock). + Blockly.Events.FIRE_QUEUE_.length = 0; + console.warn(testRef.fullTitle() + + '" needed cleanup of Blockly.Events.FIRE_QUEUE_. This may indicate ' + + 'leakage from an earlier test'); + } + + // Restore all stubbed methods. + this.sharedSetupSandbox_.restore(); + sinon.restore(); + + var blockTypes = this.sharedCleanup.blockTypesCleanup_; + for (let i = 0; i < blockTypes.length; i++) { + delete Blockly.Blocks[blockTypes[i]]; + } + var messages = this.sharedCleanup.messagesCleanup_; + for (let i = 0; i < messages.length; i++) { + delete Blockly.Msg[messages[i]]; + } + } +} + +/** + * Creates stub for Blockly.utils.genUid that returns the provided id or ids. + * Recommended to also assert that the stub is called the expected number of + * times. + * @param {string|!Array} returnIds The return values to use for the + * created stub. If a single value is passed, then the stub always returns + * that value. + * @return {!SinonStub} The created stub. + */ +function createGenUidStubWithReturns(returnIds) { + var stub = sinon.stub(Blockly.utils, "genUid"); + if (Array.isArray(returnIds)) { + for (var i = 0; i < returnIds.length; i++) { + stub.onCall(i).returns(returnIds[i]); + } + } else { + stub.returns(returnIds); + } + return stub; +} + +/** + * Creates spy for workspace fireChangeListener + * @param {!Blockly.Workspace} workspace The workspace to spy fireChangeListener + * calls on. + * @return {!SinonSpy} The created spy. + */ +function createFireChangeListenerSpy(workspace) { + return sinon.spy(workspace, 'fireChangeListener'); +} + +/** + * Asserts whether the given xml property has the expected property. + * @param {!Node} xmlValue The xml value to check. + * @param {!Node|string} expectedValue The expected value. + * @param {string=} message Optional message to use in assert message. + * @private + */ +function assertXmlPropertyEqual_(xmlValue, expectedValue, message) { + var value = Blockly.Xml.domToText(xmlValue); + if (expectedValue instanceof Node) { + expectedValue = Blockly.Xml.domToText(expectedValue); + } + chai.assert.equal(value, expectedValue, message); +} + +/** + * Asserts that the given object has the expected xml properties. + * @param {Object} obj The object to check. + * @param {Object} expectedXmlProperties The expected xml + * properties. + * @private + */ +function assertXmlProperties_(obj, expectedXmlProperties) { + Object.keys(expectedXmlProperties).map((key) => { + var value = obj[key]; + var expectedValue = expectedXmlProperties[key]; + if (expectedValue === undefined) { + chai.assert.isUndefined(value, + 'Expected ' + key + ' property to be undefined'); + return; + } + chai.assert.exists(value, 'Expected ' + key + ' property to exist'); + assertXmlPropertyEqual_(value, expectedValue, 'Checking property ' + key); + }); +} + +/** + * Whether given key indicates that the property is xml. + * @param {string} key The key to check. + * @return {boolean} Whether the given key is for xml property. + * @private + */ +function isXmlProperty_(key) { + return key.toLowerCase().endsWith('xml'); +} + +/** + * Asserts that the given event has the expected values. + * @param {!Blockly.Events.Abstract} event The event to check. + * @param {string} expectedType Expected type of event fired. + * @param {string} expectedWorkspaceId Expected workspace id of event fired. + * @param {?string} expectedBlockId Expected block id of event fired. + * @param {!Object} expectedProperties Map of of additional expected + * properties to check on fired event. + * @param {boolean=} [isUiEvent=false] Whether the event is a UI event. + * @param {string=} message Optional message to prepend assert messages. + */ +function assertEventEquals(event, expectedType, + expectedWorkspaceId, expectedBlockId, expectedProperties, isUiEvent = false, message) { + var prependMessage = message ? message + ' ' : ''; + prependMessage += 'Event fired '; + chai.assert.equal(event.type, expectedType, + prependMessage + 'type'); + chai.assert.equal(event.workspaceId, expectedWorkspaceId, + prependMessage + 'workspace id'); + chai.assert.equal(event.blockId, expectedBlockId, + prependMessage + 'block id'); + Object.keys(expectedProperties).map((key) => { + var value = event[key]; + var expectedValue = expectedProperties[key]; + if (expectedValue === undefined) { + chai.assert.isUndefined(value, prependMessage + key); + return; + } + chai.assert.exists(value, prependMessage + key); + if (isXmlProperty_(key)) { + assertXmlPropertyEqual_(value, expectedValue, + prependMessage + key); + } else { + chai.assert.equal(value, expectedValue, + prependMessage + key); + } + }); + if (isUiEvent) { + chai.assert.isTrue(event.isUiEvent); + } else { + chai.assert.isFalse(event.isUiEvent); + } +} + +/** + * Asserts that an event with the given values was fired. + * @param {!SinonSpy|!SinonSpyCall} spy The spy or spy call to use. + * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance + * type of event fired. + * @param {!Object} expectedProperties Map of of expected properties + * to check on fired event. + * @param {string} expectedWorkspaceId Expected workspace id of event fired. + * @param {?string=} expectedBlockId Expected block id of event fired. + */ +function assertEventFired(spy, instanceType, expectedProperties, + expectedWorkspaceId, expectedBlockId) { + expectedProperties = Object.assign({ + type: instanceType.prototype.type, + workspaceId: expectedWorkspaceId, + blockId: expectedBlockId, + }, expectedProperties); + var expectedEvent = + sinon.match.instanceOf(instanceType).and(sinon.match(expectedProperties)); + sinon.assert.calledWith(spy, expectedEvent); +} + +/** + * Asserts that an event with the given values was not fired. + * @param {!SpyCall} spy The spy to use. + * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance + * type of event fired. + * @param {!Object} expectedProperties Map of of expected properties + * to check on fired event. + * @param {string=} expectedWorkspaceId Expected workspace id of event fired. + * @param {?string=} expectedBlockId Expected block id of event fired. + */ +function assertEventNotFired(spy, instanceType, expectedProperties, + expectedWorkspaceId, expectedBlockId) { + expectedProperties.type = instanceType.prototype.type; + if (expectedWorkspaceId !== undefined) { + expectedProperties.workspaceId = expectedWorkspaceId; + } + if (expectedBlockId !== undefined) { + expectedProperties.blockId = expectedBlockId; + } + var expectedEvent = + sinon.match.instanceOf(instanceType).and(sinon.match(expectedProperties)); + sinon.assert.neverCalledWith(spy, expectedEvent); +} + +/** + * Filters out xml properties from given object based on key. + * @param {Object} properties The properties to filter. + * @return {[Object, Object]} A list containing split non + * xml properties and xml properties. + * @private + */ +function splitByXmlProperties_(properties) { + var xmlProperties = {}; + var nonXmlProperties = {}; + Object.keys(properties).forEach((key) => { + if (isXmlProperty_(key)) { + xmlProperties[key] = properties[key]; + return false; + } else { + nonXmlProperties[key] = properties[key]; + } + }); + return [nonXmlProperties, xmlProperties]; +} + +/** + * Asserts that the event passed to the nth call of the given spy has the + * expected values. Assumes that the event is passed as the first argument. + * @param {!SinonSpy} spy The spy to use. + * @param {number} n Which call to check. + * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance + * type of event fired. + * @param {Object} expectedProperties Map of of expected properties + * to check on fired event. + * @param {string} expectedWorkspaceId Expected workspace id of event fired. + * @param {?string=} expectedBlockId Expected block id of event fired. + */ +function assertNthCallEventArgEquals(spy, n, instanceType, expectedProperties, + expectedWorkspaceId, expectedBlockId) { + var nthCall = spy.getCall(n); + var splitProperties = splitByXmlProperties_(expectedProperties); + var nonXmlProperties = splitProperties[0]; + var xmlProperties = splitProperties[1]; + + assertEventFired(nthCall, instanceType, nonXmlProperties, expectedWorkspaceId, + expectedBlockId); + var eventArg = nthCall.firstArg; + assertXmlProperties_(eventArg, xmlProperties); +} + +function defineStackBlock(sharedCleanupObj) { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }]); +} + +function defineRowBlock(sharedCleanupObj) { + Blockly.defineBlocksWithJsonArray([{ + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }]); +} + +function defineStatementBlock(sharedCleanupObj) { + Blockly.defineBlocksWithJsonArray([{ + "type": "statement_block", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); +} +function defineBasicBlockWithField(sharedCleanupObj) { + Blockly.defineBlocksWithJsonArray([{ + "type": "test_field_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "NAME" + } + ], + "output": null + }]); +} + +function createTestBlock() { + return { + id: 'test', + rendered: false, + workspace: { + rendered: false + }, + 'isShadow': function() { + return false; + }, + 'renameVarById': Blockly.Block.prototype.renameVarById, + 'updateVarName': Blockly.Block.prototype.updateVarName, + }; +} + +function createRenderedBlock(workspaceSvg, type) { + var block = workspaceSvg.newBlock(type); + block.initSvg(); + block.render(); + return block; +} + +/** + * Triggers pointer event on target. + * @param {!EventTarget} target The object receiving the event. + * @param {string} type The type of mouse event (eg: mousedown, mouseup, + * click). + * @param {Object=} properties Properties to pass into event + * constructor. + */ +function dispatchPointerEvent(target, type, properties) { + const eventInitDict = { + cancelable: true, + bubbles: true, + isPrimary: true, + pressure: 0.5, + clientX: 10, + clientY: 10, + }; + if (properties) { + Object.assign(eventInitDict, properties); + } + const event = new PointerEvent(type, eventInitDict); + target.dispatchEvent(event); +} + +/** + * Creates a key down event used for testing. + * @param {number} keyCode The keycode for the event. Use Blockly.utils.KeyCodes enum. + * @param {string} type The type of the target. This only matters for the + * Blockly.utils.isTargetInput method. + * @param {Array} modifiers A list of modifiers. Use Blockly.utils.KeyCodes enum. + * @return {{keyCode: *, getModifierState: (function(): boolean), + * preventDefault: preventDefault, target: {type: *}}} The mocked keydown event. + */ +function createKeyDownEvent(keyCode, type, modifiers) { + var event = { + keyCode: keyCode, + target: {type: type}, + getModifierState: function(name) { + if (name == 'Shift' && this.shiftKey) { + return true; + } else if (name == 'Control' && this.ctrlKey) { + return true; + } else if (name == 'Meta' && this.metaKey) { + return true; + } else if (name == 'Alt' && this.altKey) { + return true; + } + return false; + }, + preventDefault: function() {} + }; + if (modifiers && modifiers.length > 0) { + event.altKey = modifiers.indexOf(Blockly.utils.KeyCodes.ALT) > -1; + event.ctrlKey = modifiers.indexOf(Blockly.utils.KeyCodes.CTRL) > -1; + event.metaKey = modifiers.indexOf(Blockly.utils.KeyCodes.META) > -1; + event.shiftKey = modifiers.indexOf(Blockly.utils.KeyCodes.SHIFT) > -1; + } + return event; +} + + +/** + * Simulates mouse click by triggering relevant mouse events. + * @param {!EventTarget} target The object receiving the event. + * @param {Object=} properties Properties to pass into event + * constructor. + */ +function simulateClick(target, properties) { + dispatchPointerEvent(target, 'pointerdown', properties); + dispatchPointerEvent(target, 'pointerup', properties); + dispatchPointerEvent(target, 'click', properties); +} diff --git a/static/js/tests/mocha/theme_test.js b/static/js/tests/mocha/theme_test.js new file mode 100644 index 0000000..d8fcc76 --- /dev/null +++ b/static/js/tests/mocha/theme_test.js @@ -0,0 +1,275 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly Theme tests. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +suite('Theme', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + // Clear all registered themes. + Blockly.registry.typeMap_['theme'] = {}; + }); + + function defineThemeTestBlocks(sharedCleanupObj) { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }]); + } + + 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); + chai.assert.equal(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(this.sharedCleanup); + try { + var blockStyles = createBlockStyles(); + var theme = new Blockly.Theme('themeName', blockStyles); + var workspace = new Blockly.WorkspaceSvg(new Blockly.Options({})); + var blockA = workspace.newBlock('stack_block'); + + blockA.setStyle = function() {this.styleName_ = 'styleTwo';}; + var refreshToolboxSelectionStub = + sinon.stub(workspace, 'refreshToolboxSelection'); + blockA.styleName_ = 'styleOne'; + + // Stubs are cleaned up in sharedTestTeardown + sinon.stub(Blockly, "getMainWorkspace").returns(workspace); + sinon.stub(Blockly, "hideChaff"); + + workspace.setTheme(theme); + + // Checks that the theme was set correctly on Blockly namespace + stringifyAndCompare(workspace.getTheme(), theme); + + // Checks that the setTheme function was called on the block + chai.assert.equal(blockA.getStyleName(), 'styleTwo'); + + // Checks that the toolbox refreshed method was called + sinon.assert.calledOnce(refreshToolboxSelectionStub); + + assertEventFired( + this.eventsFireStub, Blockly.Events.ThemeChange, + {themeName: 'themeName'}, workspace.id); + } finally { + workspaceTeardown.call(this, workspace); + } + }); + + 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/static/js/tests/mocha/toolbox_helper.js b/static/js/tests/mocha/toolbox_helper.js new file mode 100644 index 0000000..9d1f54e --- /dev/null +++ b/static/js/tests/mocha/toolbox_helper.js @@ -0,0 +1,185 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Get JSON for a toolbox that contains categories. + * @return {Blockly.utils.toolbox.ToolboxJson} The array holding information + * for a toolbox. + */ +function getCategoryJSON() { + return {"contents": [ + { + "kind": "CATEGORY", + "cssconfig": { + "container": "something" + }, + "contents": [ + { + "kind": "BLOCK", + "blockxml": 'FirstCategory-FirstBlock' + }, + { + "kind": "BLOCK", + "blockxml": 'FirstCategory-SecondBlock' + } + ], + "name": "First" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "blockxml": 'SecondCategory-FirstBlock' + } + ], + "name": "Second" + }]}; +} + +/** + * Get JSON for a simple toolbox. + * @return {Blockly.utils.toolbox.ToolboxJson} The array holding information + * for a simple toolbox. + */ +function getSimpleJSON() { + return {"contents":[ + { + "kind":"BLOCK", + "blockxml": "", + "type":"logic_operation" + }, + { + "kind":"SEP", + "gap":"20" + }, + { + "kind":"BUTTON", + "text": "insert", + "callbackkey": "insertConnectionRows" + }, + { + "kind":"LABEL", + "text":"tooltips" + } + ]}; +} + +/** + * Get JSON for a toolbox that contains categories that contain categories. + * @return {Blockly.utils.toolbox.ToolboxJson} The array holding information + * for a toolbox. + */ +function getDeeplyNestedJSON() { + return {"contents": [ + { + "kind": "CATEGORY", + "cssconfig": { + "container": "something" + }, + "contents": [{ + "kind": "CATEGORY", + "contents": [{ + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "blockxml": 'NestedCategory-FirstBlock' + }, + { + "kind": "BLOCK", + "blockxml": 'NestedCategory-SecondBlock' + } + ], + "name": "NestedCategoryInner" + }], + "name": "NestedCategoryMiddle", + }], + "name": "NestedCategoryOuter" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "blockxml": 'SecondCategory-FirstBlock' + } + ], + "name": "Second" + }]}; +} + +/** + * Get an array filled with xml elements. + * @return {Array} Array holding xml elements for a toolbox. + */ +function getXmlArray() { + // Need to use HTMLElement instead of Element so parser output is + // consistent with other tests + var block = document.createElement('block'); + block.setAttribute('type', 'logic_operation'); + var separator = Blockly.Xml.textToDom(''); + var button = Blockly.Xml.textToDom(''); + var label = Blockly.Xml.textToDom(''); + return [block, separator, button, label]; +} + +function getInjectedToolbox() { + /** + * Category: First + * sep + * basic_block + * basic_block + * Category: second + * basic_block + * Category: Variables + * custom: VARIABLE + * Category: NestedCategory + * Category: NestedItemOne + */ + var toolboxXml = document.getElementById('toolbox-test'); + var workspace = Blockly.inject('blocklyDiv', + { + toolbox: toolboxXml + }); + return workspace.getToolbox(); +} + +function getBasicToolbox() { + var workspace = new Blockly.WorkspaceSvg(new Blockly.Options({})); + var toolbox = new Blockly.Toolbox(workspace); + toolbox.HtmlDiv = document.createElement('div'); + toolbox.flyout_ = sinon.createStubInstance(Blockly.VerticalFlyout); + return toolbox; +} + +function getCollapsibleItem(toolbox) { + var contents = toolbox.contents_; + for (var i = 0; i < contents.length; i++) { + var item = contents[i]; + if (item.isCollapsible()) { + return item; + } + } +} + +function getNonCollapsibleItem(toolbox) { + var contents = toolbox.contents_; + for (var i = 0; i < contents.length; i++) { + var item = contents[i]; + if (!item.isCollapsible()) { + return item; + } + } +} + +function getChildItem(toolbox) { + return toolbox.getToolboxItemById('nestedCategory'); +} + +function getSeparator(toolbox) { + return toolbox.getToolboxItemById('separator'); +} diff --git a/static/js/tests/mocha/toolbox_test.js b/static/js/tests/mocha/toolbox_test.js new file mode 100644 index 0000000..0570f28 --- /dev/null +++ b/static/js/tests/mocha/toolbox_test.js @@ -0,0 +1,642 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Toolbox', function() { + + setup(function() { + sharedTestSetup.call(this); + defineStackBlock(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('init', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + + test('Init called -> HtmlDiv is created', function() { + chai.assert.isDefined(this.toolbox.HtmlDiv); + }); + test('Init called -> HtmlDiv is inserted before parent node', function() { + var toolboxDiv = Blockly.getMainWorkspace().getInjectionDiv().childNodes[0]; + chai.assert.equal(toolboxDiv.className, + 'blocklyToolboxDiv blocklyNonSelectable'); + }); + test('Init called -> Toolbox is subscribed to background and foreground colour', function() { + var themeManager = this.toolbox.workspace_.getThemeManager(); + var themeManagerSpy = sinon.spy(themeManager, 'subscribe'); + this.toolbox.init(); + sinon.assert.calledWith(themeManagerSpy, this.toolbox.HtmlDiv, + 'toolboxBackgroundColour', 'background-color'); + sinon.assert.calledWith(themeManagerSpy, this.toolbox.HtmlDiv, + 'toolboxForegroundColour', 'color'); + }); + test('Init called -> Render is called', function() { + var renderSpy = sinon.spy(this.toolbox, 'render'); + this.toolbox.init(); + sinon.assert.calledOnce(renderSpy); + }); + test('Init called -> Flyout is initialized', function() { + this.toolbox.init(); + chai.assert.isDefined(this.toolbox.flyout_); + }); + }); + + suite('render', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + test('Render called with valid toolboxDef -> Contents are created', function() { + var positionStub = sinon.stub(this.toolbox, 'position'); + this.toolbox.render({'contents': [ + {'kind': 'category', 'contents': []}, + {'kind': 'category', 'contents': []} + ]}); + chai.assert.lengthOf(this.toolbox.contents_, 2); + sinon.assert.called(positionStub); + }); + // TODO: Uncomment once implemented. + test.skip('Toolbox definition with both blocks and categories -> Should throw an error', function() { + var toolbox = this.toolbox; + var badToolboxDef = [ + { + "kind": "block" + }, + { + "kind": "category", + } + ]; + chai.assert.throws(function() { + toolbox.render({'contents' : badToolboxDef}); + }, 'Toolbox cannot have both blocks and categories in the root level.'); + }); + // TODO: Uncomment once implemented. + test.skip('Expanded set to true for a non collapsible toolbox item -> Should open flyout', function() { + this.toolbox.render(this.toolboxXml); + var selectedNode = this.toolbox.tree_.children_[0]; + chai.assert.isTrue(selectedNode.selected_); + }); + test('JSON toolbox definition -> Should create toolbox with contents', function() { + var jsonDef = {'contents' : [ + { + "kind": "category", + "contents": [ + { + "kind": "block", + "blockxml": 'FirstCategory-FirstBlock' + }, + { + "kind": "label", + "text": "Input/Output:", + "web-class": "ioLabel" + }, + { + "kind": "button", + "text": "insert", + "callbackkey": "insertConnectionStacks", + "web-class": "ioLabel" + }, + { + "kind": "sep", + "gap": "7" + } + ] + } + ]}; + this.toolbox.render(jsonDef); + chai.assert.lengthOf(this.toolbox.contents_, 1); + }); + }); + + suite('onClick_', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + + test('Toolbox clicked -> Should close flyout', function() { + var hideChaffStub = sinon.stub(Blockly, "hideChaff"); + var evt = new MouseEvent('click', {}); + this.toolbox.HtmlDiv.dispatchEvent(evt); + sinon.assert.calledOnce(hideChaffStub); + }); + test('Category clicked -> Should select category', function() { + var categoryXml = document.getElementsByClassName('blocklyTreeRow')[0]; + var evt = { + 'target': categoryXml + }; + var item = this.toolbox.contentMap_[categoryXml.getAttribute('id')]; + var setSelectedSpy = sinon.spy(this.toolbox, 'setSelectedItem'); + var onClickSpy = sinon.spy(item, 'onClick'); + this.toolbox.onClick_(evt); + sinon.assert.calledOnce(setSelectedSpy); + sinon.assert.calledOnce(onClickSpy); + }); + }); + + suite('onKeyDown_', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + + function createKeyDownMock(keyCode) { + return { + 'keyCode': keyCode, + 'preventDefault': function() {} + }; + } + + function testCorrectFunctionCalled(toolbox, keyCode, funcName) { + var event = createKeyDownMock(keyCode); + var preventDefaultEvent = sinon.stub(event, 'preventDefault'); + var selectMethodStub = sinon.stub(toolbox, funcName); + selectMethodStub.returns(true); + toolbox.onKeyDown_(event); + sinon.assert.called(selectMethodStub); + sinon.assert.called(preventDefaultEvent); + } + + test('Down button is pushed -> Should call selectNext_', function() { + testCorrectFunctionCalled(this.toolbox, Blockly.utils.KeyCodes.DOWN, 'selectNext_', true); + }); + test('Up button is pushed -> Should call selectPrevious_', function() { + testCorrectFunctionCalled(this.toolbox, Blockly.utils.KeyCodes.UP, 'selectPrevious_', true); + }); + test('Left button is pushed -> Should call selectParent_', function() { + testCorrectFunctionCalled(this.toolbox, Blockly.utils.KeyCodes.LEFT, 'selectParent_', true); + }); + test('Right button is pushed -> Should call selectChild_', function() { + testCorrectFunctionCalled(this.toolbox, Blockly.utils.KeyCodes.RIGHT, 'selectChild_', true); + }); + test('Enter button is pushed -> Should toggle expandedd', function() { + this.toolbox.selectedItem_ = getCollapsibleItem(this.toolbox); + var toggleExpandedStub = sinon.stub(this.toolbox.selectedItem_, 'toggleExpanded'); + var event = createKeyDownMock(Blockly.utils.KeyCodes.ENTER); + var preventDefaultEvent = sinon.stub(event, 'preventDefault'); + this.toolbox.onKeyDown_(event); + sinon.assert.called(toggleExpandedStub); + sinon.assert.called(preventDefaultEvent); + }); + test('Enter button is pushed when no item is selected -> Should not call prevent default', function() { + this.toolbox.selectedItem_ = null; + var event = createKeyDownMock(Blockly.utils.KeyCodes.ENTER); + var preventDefaultEvent = sinon.stub(event, 'preventDefault'); + this.toolbox.onKeyDown_(event); + sinon.assert.notCalled(preventDefaultEvent); + }); + }); + + suite('Select Methods', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + + suite('selectChild_', function() { + test('No item is selected -> Should not handle event', function() { + this.toolbox.selectedItem_ = null; + var handled = this.toolbox.selectChild_(); + chai.assert.isFalse(handled); + }); + test('Selected item is not collapsible -> Should not handle event', function() { + this.toolbox.selectedItem_ = getNonCollapsibleItem(this.toolbox); + var handled = this.toolbox.selectChild_(); + chai.assert.isFalse(handled); + }); + test('Selected item is collapsible -> Should expand', function() { + var collapsibleItem = getCollapsibleItem(this.toolbox); + this.toolbox.selectedItem_ = collapsibleItem; + var handled = this.toolbox.selectChild_(); + chai.assert.isTrue(handled); + chai.assert.isTrue(collapsibleItem.isExpanded()); + chai.assert.equal(this.toolbox.selectedItem_, collapsibleItem); + }); + + test('Selected item is expanded -> Should select child', function() { + var collapsibleItem = getCollapsibleItem(this.toolbox); + collapsibleItem.expanded_ = true; + var selectNextStub = sinon.stub(this.toolbox, 'selectNext_'); + this.toolbox.selectedItem_ = collapsibleItem; + var handled = this.toolbox.selectChild_(); + chai.assert.isTrue(handled); + sinon.assert.called(selectNextStub); + }); + }); + + suite('selectParent_', function() { + test('No item selected -> Should not handle event', function() { + this.toolbox.selectedItem_ = null; + var handled = this.toolbox.selectParent_(); + chai.assert.isFalse(handled); + }); + test('Selected item is expanded -> Should collapse', function() { + var collapsibleItem = getCollapsibleItem(this.toolbox); + collapsibleItem.expanded_ = true; + this.toolbox.selectedItem_ = collapsibleItem; + var handled = this.toolbox.selectParent_(); + chai.assert.isTrue(handled); + chai.assert.isFalse(collapsibleItem.isExpanded()); + chai.assert.equal(this.toolbox.selectedItem_, collapsibleItem); + }); + test('Selected item is not expanded -> Should get parent', function() { + var childItem = getChildItem(this.toolbox); + this.toolbox.selectedItem_ = childItem; + var handled = this.toolbox.selectParent_(); + chai.assert.isTrue(handled); + chai.assert.equal(this.toolbox.selectedItem_, childItem.getParent()); + }); + }); + + suite('selectNext_', function() { + test('No item is selected -> Should not handle event', function() { + this.toolbox.selectedItem_ = null; + var handled = this.toolbox.selectNext_(); + chai.assert.isFalse(handled); + }); + test('Next item is selectable -> Should select next item', function() { + var item = this.toolbox.contents_[0]; + this.toolbox.selectedItem_ = item; + var handled = this.toolbox.selectNext_(); + chai.assert.isTrue(handled); + chai.assert.equal(this.toolbox.selectedItem_, this.toolbox.contents_[1]); + }); + test('Selected item is last item -> Should not handle event', function() { + var item = this.toolbox.contents_[this.toolbox.contents_.length - 1]; + this.toolbox.selectedItem_ = item; + var handled = this.toolbox.selectNext_(); + chai.assert.isFalse(handled); + chai.assert.equal(this.toolbox.selectedItem_, item); + }); + test('Selected item is collapsed -> Should skip over its children', function() { + var item = getCollapsibleItem(this.toolbox); + var childItem = item.flyoutItems_[0]; + item.expanded_ = false; + this.toolbox.selectedItem_ = item; + var handled = this.toolbox.selectNext_(); + chai.assert.isTrue(handled); + chai.assert.notEqual(this.toolbox.selectedItem_, childItem); + }); + }); + + suite('selectPrevious', function() { + test('No item is selected -> Should not handle event', function() { + this.toolbox.selectedItem_ = null; + var handled = this.toolbox.selectPrevious_(); + chai.assert.isFalse(handled); + }); + test('Selected item is first item -> Should not handle event', function() { + var item = this.toolbox.contents_[0]; + this.toolbox.selectedItem_ = item; + var handled = this.toolbox.selectPrevious_(); + chai.assert.isFalse(handled); + chai.assert.equal(this.toolbox.selectedItem_, item); + }); + test('Previous item is selectable -> Should select previous item', function() { + var item = this.toolbox.contents_[1]; + var prevItem = this.toolbox.contents_[0]; + this.toolbox.selectedItem_ = item; + var handled = this.toolbox.selectPrevious_(); + chai.assert.isTrue(handled); + chai.assert.equal(this.toolbox.selectedItem_, prevItem); + }); + test('Previous item is collapsed -> Should skip over children of the previous item', function() { + var childItem = getChildItem(this.toolbox); + var parentItem = childItem.getParent(); + var parentIdx = this.toolbox.contents_.indexOf(parentItem); + // Gets the item after the parent. + var item = this.toolbox.contents_[parentIdx + 1]; + this.toolbox.selectedItem_ = item; + var handled = this.toolbox.selectPrevious_(); + chai.assert.isTrue(handled); + chai.assert.notEqual(this.toolbox.selectedItem_, childItem); + }); + }); + }); + + suite('setSelectedItem', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + + function setupSetSelected(toolbox, oldItem, newItem) { + toolbox.selectedItem_ = oldItem; + var newItemStub = sinon.stub(newItem, 'setSelected'); + toolbox.setSelectedItem(newItem); + return newItemStub; + } + + test('Selected item and new item are null -> Should not update the flyout', function() { + this.selectedItem_ = null; + this.toolbox.setSelectedItem(null); + var updateFlyoutStub = sinon.stub(this.toolbox, 'updateFlyout_'); + sinon.assert.notCalled(updateFlyoutStub); + }); + test('New item is not selectable -> Should not update the flyout', function() { + var separator = getSeparator(this.toolbox); + this.toolbox.setSelectedItem(separator); + var updateFlyoutStub = sinon.stub(this.toolbox, 'updateFlyout_'); + sinon.assert.notCalled(updateFlyoutStub); + }); + test('Select an item with no children -> Should select item', function() { + var oldItem = getCollapsibleItem(this.toolbox); + var oldItemStub = sinon.stub(oldItem, 'setSelected'); + var newItem = getNonCollapsibleItem(this.toolbox); + var newItemStub = setupSetSelected(this.toolbox, oldItem, newItem); + sinon.assert.calledWith(oldItemStub, false); + sinon.assert.calledWith(newItemStub, true); + }); + test('Select previously selected item with no children -> Should deselect', function() { + var newItem = getNonCollapsibleItem(this.toolbox); + var newItemStub = setupSetSelected(this.toolbox, newItem, newItem); + sinon.assert.calledWith(newItemStub, false); + }); + test('Select collapsible item -> Should select item', function() { + var newItem = getCollapsibleItem(this.toolbox); + var newItemStub = setupSetSelected(this.toolbox, null, newItem); + sinon.assert.calledWith(newItemStub, true); + }); + test('Select previously selected collapsible item -> Should not deselect', function() { + var newItem = getCollapsibleItem(this.toolbox); + var newItemStub = setupSetSelected(this.toolbox, newItem, newItem); + sinon.assert.notCalled(newItemStub); + }); + }); + + suite('updateFlyout_', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + + function testHideFlyout(toolbox, oldItem, newItem) { + var updateFlyoutStub = sinon.stub(toolbox.flyout_, 'hide'); + var newItem = getNonCollapsibleItem(toolbox); + toolbox.updateFlyout_(oldItem, newItem); + sinon.assert.called(updateFlyoutStub); + } + + test('Select previously selected item -> Should close flyout', function() { + var newItem = getNonCollapsibleItem(this.toolbox); + testHideFlyout(this.toolbox, newItem, newItem); + }); + test('No new item -> Should close flyout', function() { + testHideFlyout(this.toolbox, null, null); + }); + test('Select collapsible item -> Should close flyout', function() { + var newItem = getCollapsibleItem(this.toolbox); + testHideFlyout(this.toolbox,null, newItem); + }); + test('Select selectable item -> Should open flyout', function() { + var showFlyoutstub = sinon.stub(this.toolbox.flyout_, 'show'); + var scrollToStartFlyout = sinon.stub(this.toolbox.flyout_, 'scrollToStart'); + var newItem = getNonCollapsibleItem(this.toolbox); + this.toolbox.updateFlyout_(null, newItem); + sinon.assert.called(showFlyoutstub); + sinon.assert.called(scrollToStartFlyout); + }); + }); + + suite('position', function() { + setup(function() { + this.toolbox = getBasicToolbox(); + }); + + function checkHorizontalToolbox(toolbox) { + chai.assert.equal(toolbox.HtmlDiv.style.left, '0px', 'Check left position'); + chai.assert.equal(toolbox.HtmlDiv.style.height, 'auto', 'Check height'); + chai.assert.equal(toolbox.HtmlDiv.style.width, '100%', 'Check width'); + chai.assert.equal(toolbox.height_, toolbox.HtmlDiv.offsetHeight, 'Check height'); + } + function checkVerticalToolbox(toolbox) { + chai.assert.equal(toolbox.HtmlDiv.style.height, '100%', 'Check height'); + chai.assert.equal(toolbox.width_, toolbox.HtmlDiv.offsetWidth, 'Check width'); + } + test('HtmlDiv is not created -> Should not resize', function() { + var toolbox = this.toolbox; + toolbox.HtmlDiv = null; + toolbox.horizontalLayout_ = true; + toolbox.position(); + chai.assert.equal(toolbox.height_, 0); + }); + test('Horizontal toolbox at top -> Should anchor horizontal toolbox to top', function() { + var toolbox = this.toolbox; + toolbox.toolboxPosition = Blockly.TOOLBOX_AT_TOP; + toolbox.horizontalLayout_ = true; + toolbox.position(); + checkHorizontalToolbox(toolbox); + chai.assert.equal(toolbox.HtmlDiv.style.top, '0px', 'Check top'); + }); + test('Horizontal toolbox at bottom -> Should anchor horizontal toolbox to bottom', function() { + var toolbox = this.toolbox; + toolbox.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; + toolbox.horizontalLayout_ = true; + toolbox.position(); + checkHorizontalToolbox(toolbox); + chai.assert.equal(toolbox.HtmlDiv.style.bottom, '0px', 'Check bottom'); + }); + test('Vertical toolbox at right -> Should anchor to right', function() { + var toolbox = this.toolbox; + toolbox.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; + toolbox.horizontalLayout_ = false; + toolbox.position(); + chai.assert.equal(toolbox.HtmlDiv.style.right, '0px', 'Check right'); + checkVerticalToolbox(toolbox); + }); + test('Vertical toolbox at left -> Should anchor to left', function() { + var toolbox = this.toolbox; + toolbox.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; + toolbox.horizontalLayout_ = false; + toolbox.position(); + chai.assert.equal(toolbox.HtmlDiv.style.left, '0px', 'Check left'); + checkVerticalToolbox(toolbox); + }); + }); + + suite('parseMethods', function() { + setup(function() { + this.categoryToolboxJSON = getCategoryJSON(); + this.simpleToolboxJSON = getSimpleJSON(); + }); + + function checkValue(actual, expected, value) { + var actualVal = actual[value]; + var expectedVal = expected[value]; + chai.assert.equal(actualVal.toUpperCase(), expectedVal.toUpperCase(), 'Checking value for: ' + value); + } + function checkContents(actualContents, expectedContents) { + chai.assert.equal(actualContents.length, expectedContents.length); + for (var i = 0; i < actualContents.length; i++) { + // TODO: Check the values as well as all the keys. + chai.assert.containsAllKeys(actualContents[i], Object.keys(expectedContents[i])); + } + } + function checkCategory(actual, expected) { + checkValue(actual, expected, 'kind'); + checkValue(actual, expected, 'name'); + chai.assert.deepEqual(actual['cssconfig'], expected['cssconfig']); + checkContents(actual.contents, expected.contents); + } + function checkCategoryToolbox(actual, expected) { + var actualContents = actual['contents']; + var expectedContents = expected['contents']; + chai.assert.equal(actualContents.length, expectedContents.length); + for (var i = 0; i < expected.length; i++) { + checkCategory(actualContents[i], expected[i]); + } + } + function checkSimpleToolbox(actual, expected) { + checkContents(actual['contents'], expected['contents']); + } + + suite('parseToolbox', function() { + test('Category Toolbox: JSON', function() { + var toolboxDef = Blockly.utils.toolbox.convertToolboxDefToJson(this.categoryToolboxJSON); + chai.assert.isNotNull(toolboxDef); + checkCategoryToolbox(toolboxDef, this.categoryToolboxJSON); + }); + test('Simple Toolbox: JSON', function() { + var toolboxDef = Blockly.utils.toolbox.convertToolboxDefToJson(this.simpleToolboxJSON); + chai.assert.isNotNull(toolboxDef); + checkSimpleToolbox(toolboxDef, this.simpleToolboxJSON); + }); + test('Category Toolbox: xml', function() { + var toolboxXml = document.getElementById('toolbox-categories'); + var toolboxDef = Blockly.utils.toolbox.convertToolboxDefToJson(toolboxXml); + chai.assert.isNotNull(toolboxDef); + checkCategoryToolbox(toolboxDef, this.categoryToolboxJSON); + }); + test('Simple Toolbox: xml', function() { + var toolboxXml = document.getElementById('toolbox-simple'); + var toolboxDef = Blockly.utils.toolbox.convertToolboxDefToJson(toolboxXml); + chai.assert.isNotNull(toolboxDef); + checkSimpleToolbox(toolboxDef, this.simpleToolboxJSON); + }); + test('Simple Toolbox: string', function() { + var toolbox = ''; + toolbox += ' '; + toolbox += ' '; + toolbox += ''; + + var toolboxJson = { + 'contents': [ + { + 'kind': 'block', + 'type': 'controls_if' + }, + { + 'kind': 'block', + 'type': 'controls_if' + } + ] + }; + + var toolboxDef = Blockly.utils.toolbox.convertToolboxDefToJson(toolbox); + chai.assert.isNotNull(toolboxDef); + checkSimpleToolbox(toolboxDef, toolboxJson); + }); + test('Category Toolbox: string', function() { + var toolbox = ''; + toolbox += ' '; + toolbox += ' '; + toolbox += ''; + + var toolboxJson = { + 'contents': [ + { + 'kind': 'category', + 'name': 'a' + }, + { + 'kind': 'category', + 'name': 'b' + } + ] + }; + + var toolboxDef = Blockly.utils.toolbox.convertToolboxDefToJson(toolbox); + chai.assert.isNotNull(toolboxDef); + checkSimpleToolbox(toolboxDef, toolboxJson); + }); + }); + suite('parseFlyout', function() { + test('Array of Nodes', function() { + var xmlList = getXmlArray(); + var flyoutDef = Blockly.utils.toolbox.convertFlyoutDefToJsonArray(xmlList); + checkContents(flyoutDef, this.simpleToolboxJSON['contents']); + }); + test('NodeList', function() { + var nodeList = document.getElementById('toolbox-simple').childNodes; + var flyoutDef = Blockly.utils.toolbox.convertFlyoutDefToJsonArray(nodeList); + checkContents(flyoutDef, this.simpleToolboxJSON['contents']); + }); + test('List of json', function() { + var jsonList = this.simpleToolboxJSON['contents']; + var flyoutDef = Blockly.utils.toolbox.convertFlyoutDefToJsonArray(jsonList); + checkContents(flyoutDef, this.simpleToolboxJSON['contents']); + }); + test('Json', function() { + var flyoutDef = Blockly.utils.toolbox.convertFlyoutDefToJsonArray(this.simpleToolboxJSON); + checkContents(flyoutDef, this.simpleToolboxJSON['contents']); + }); + }); + }); + suite('Nested Categories', function() { + setup(function() { + this.toolbox = getInjectedToolbox(); + }); + teardown(function() { + this.toolbox.dispose(); + }); + test('Child categories visible if all ancestors expanded', function() { + this.toolbox.render(getDeeplyNestedJSON()); + var outerCategory = this.toolbox.contents_[0]; + var middleCategory = this.toolbox.contents_[1]; + var innerCategory = this.toolbox.contents_[2]; + + outerCategory.toggleExpanded(); + middleCategory.toggleExpanded(); + innerCategory.show(); + + chai.assert.isTrue(innerCategory.isVisible(), + 'All ancestors are expanded, so category should be visible'); + }); + test('Child categories not visible if any ancestor not expanded', function() { + this.toolbox.render(getDeeplyNestedJSON()); + var middleCategory = this.toolbox.contents_[1]; + var innerCategory = this.toolbox.contents_[2]; + + // Don't expand the outermost category + // Even though the direct parent of inner is expanded, it shouldn't be visible + // because all ancestor categories need to be visible, not just parent + middleCategory.toggleExpanded(); + innerCategory.show(); + + chai.assert.isFalse(innerCategory.isVisible(), + 'Not all ancestors are expanded, so category should not be visible'); + }); + }); +}); diff --git a/static/js/tests/mocha/tooltip_test.js b/static/js/tests/mocha/tooltip_test.js new file mode 100644 index 0000000..f378bd5 --- /dev/null +++ b/static/js/tests/mocha/tooltip_test.js @@ -0,0 +1,230 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Tooltip', function() { + + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('set/getTooltip', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "test_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "FIELD" + } + ] + } + ]); + }); + + teardown(function() { + delete Blockly.Blocks["test_block"]; + }); + + var tooltipText = 'testTooltip'; + + function assertTooltip(obj) { + chai.assert.equal(obj.getTooltip(), tooltipText); + } + + function setStringTooltip(obj) { + obj.setTooltip(tooltipText); + } + + function setFunctionTooltip(obj) { + obj.setTooltip(() => tooltipText); + } + + function setNestedFunctionTooltip(obj) { + function nestFunction(fn, count) { + if (!count) { + return fn; + } + return () => nestFunction(fn, --count); + } + obj.setTooltip(nestFunction(() => tooltipText, 5)); + } + + function setFunctionReturningObjectTooltip(obj) { + obj.setTooltip(() => { + return { + tooltip: tooltipText + }; + }); + } + + function setObjectTooltip(obj) { + obj.setTooltip({tooltip: tooltipText}); + } + + suite('Headless Blocks', function() { + setup(function() { + this.block = this.workspace.newBlock('test_block'); + }); + + test('String', function() { + setStringTooltip(this.block); + assertTooltip(this.block); + }); + + test('Function', function() { + setFunctionTooltip(this.block); + assertTooltip(this.block); + }); + + test('Nested Function', function() { + setNestedFunctionTooltip(this.block); + assertTooltip(this.block); + }); + + test('Function returning object', function() { + setFunctionReturningObjectTooltip(this.block); + chai.assert.throws(this.block.getTooltip.bind(this.block), + 'Tooltip function must return a string.'); + }); + + test('Object', function() { + setObjectTooltip(this.block); + assertTooltip(this.block); + }); + }); + + suite('Rendered Blocks', function() { + setup(function() { + this.renderedWorkspace = Blockly.inject('blocklyDiv'); + this.block = this.renderedWorkspace.newBlock('test_block'); + this.block.initSvg(); + this.block.render(); + }); + + teardown(function() { + workspaceTeardown.call(this, this.renderedWorkspace); + }); + + test('String', function() { + setStringTooltip(this.block); + assertTooltip(this.block); + }); + + test('Function', function() { + setFunctionTooltip(this.block); + assertTooltip(this.block); + }); + + test('Nested Function', function() { + setNestedFunctionTooltip(this.block); + assertTooltip(this.block); + }); + + test('Function returning object', function() { + setFunctionReturningObjectTooltip(this.block); + chai.assert.throws(this.block.getTooltip.bind(this.block), + 'Tooltip function must return a string.'); + }); + + test('Object', function() { + setObjectTooltip(this.block); + assertTooltip(this.block); + }); + }); + + suite('Headless Fields', function() { + setup(function() { + this.block = this.workspace.newBlock('test_block'); + this.field = this.block.getField('FIELD'); + }); + + test('String', function() { + setStringTooltip(this.field); + assertTooltip(this.field); + }); + + test('Function', function() { + setFunctionTooltip(this.field); + assertTooltip(this.field); + }); + + test('Nested Function', function() { + setNestedFunctionTooltip(this.field); + assertTooltip(this.field); + }); + + test('Function returning object', function() { + setFunctionReturningObjectTooltip(this.field); + chai.assert.throws(this.field.getTooltip.bind(this.field), + 'Tooltip function must return a string.'); + }); + + test('Object', function() { + setObjectTooltip(this.field); + assertTooltip(this.field); + }); + + test('Null', function() { + setStringTooltip(this.block); + this.field.setTooltip(null); + assertTooltip(this.field); + }); + }); + + suite('Rendered Fields', function() { + setup(function() { + this.renderedWorkspace = Blockly.inject('blocklyDiv'); + this.block = this.renderedWorkspace.newBlock('test_block'); + this.block.initSvg(); + this.block.render(); + this.field = this.block.getField('FIELD'); + }); + + teardown(function() { + workspaceTeardown.call(this, this.renderedWorkspace); + }); + + test('String', function() { + setStringTooltip(this.field); + assertTooltip(this.field); + }); + + test('Function', function() { + setFunctionTooltip(this.field); + assertTooltip(this.field); + }); + + test('Nested Function', function() { + setNestedFunctionTooltip(this.field); + assertTooltip(this.field); + }); + + test('Function returning object', function() { + setFunctionReturningObjectTooltip(this.field); + chai.assert.throws(this.field.getTooltip.bind(this.field), + 'Tooltip function must return a string.'); + }); + + test('Object', function() { + setObjectTooltip(this.field); + assertTooltip(this.field); + }); + + test('Null', function() { + setStringTooltip(this.block); + this.field.setTooltip(null); + assertTooltip(this.field); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/trashcan_test.js b/static/js/tests/mocha/trashcan_test.js new file mode 100644 index 0000000..9e0122d --- /dev/null +++ b/static/js/tests/mocha/trashcan_test.js @@ -0,0 +1,328 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite("Trashcan", function() { + function fireDeleteEvent(workspace, xmlString) { + var xml = Blockly.Xml.textToDom( + '' + + xmlString + ''); + xml = xml.children[0]; + var event = new Blockly.Events.Delete(); + event.oldXml = xml; + event.workspaceId = workspace.id; + Blockly.Events.fire(event); + } + function fireNonDeleteEvent(workspace, oldXml) { + var event = new Blockly.Events.Abstract(); + event.type = 'dummy_type'; + event.workspaceId = workspace.id; + if (oldXml) { + event.oldXml = oldXml; + } + Blockly.Events.fire(/** @type {Blockly.Events.Abstract} */ event); + } + + setup(function() { + sharedTestSetup.call(this); + this.workspace = Blockly.inject('blocklyDiv', + {'trashcan': true, 'maxTrashcanContents': Infinity}); + this.trashcan = this.workspace.trashcan; + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite("Events", function() { + test("Delete", function() { + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Non-Delete", function() { + fireNonDeleteEvent(this.workspace); + chai.assert.equal(this.trashcan.contents_.length, 0); + }); + test("Non-Delete w/ oldXml", function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + '' + ); + xml = xml.children[0]; + fireNonDeleteEvent(this.workspace, xml); + chai.assert.equal(this.trashcan.contents_.length, 0); + }); + test("Shadow Delete", function() { + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 0); + }); + test("Click without contents - fires workspace click", function() { + simulateClick(this.trashcan.svgGroup_); + + assertEventNotFired( + this.eventsFireStub, Blockly.Events.TrashcanOpen, {}); + assertEventFired( + this.eventsFireStub, Blockly.Events.Click, {targetType: 'workspace'}, + this.workspace.id, null); + }); + test("Click with contents - fires trashcanOpen", function() { + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 1); + // Stub flyout interaction. + var showFlyoutStub = sinon.stub(this.trashcan.flyout, "show"); + + simulateClick(this.trashcan.svgGroup_); + + sinon.assert.calledOnce(showFlyoutStub); + + assertEventFired( + this.eventsFireStub, Blockly.Events.TrashcanOpen, + {isOpen: true}, this.workspace.id); + assertEventNotFired( + this.eventsFireStub, Blockly.Events.Click, {}); + }); + test("Click outside trashcan - fires trashcanClose", function() { + sinon.stub(this.trashcan.flyout, 'isVisible').returns(true); + // Stub flyout interaction. + var hideFlyoutStub = sinon.stub(this.trashcan.flyout, "hide"); + + simulateClick(this.workspace.svgGroup_); + + sinon.assert.calledOnce(hideFlyoutStub); + + assertEventFired( + this.eventsFireStub, Blockly.Events.TrashcanOpen, + {isOpen: false}, this.workspace.id); + assertEventFired( + this.eventsFireStub, Blockly.Events.Click, {targetType: 'workspace'}, + this.workspace.id, null); + }); + }); + suite("Unique Contents", function() { + test("Simple", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Different Coords", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Different IDs", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("No Disabled - Disabled True", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + // 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() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Movable - Movable False", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Field Values", function() { + fireDeleteEvent(this.workspace, + '' + + ' dummy_value1' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' dummy_value2' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Values - Values", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Value Blocks", function() { + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Statements - Statements", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Statement Blocks", function() { + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Next - Next", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Next Blocks", function() { + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Comment - Comment", function() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, + '' + + ' comment_text' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Comment Text", function() { + fireDeleteEvent(this.workspace, + '' + + ' comment_text1' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' comment_text2' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Comment Size", function() { + fireDeleteEvent(this.workspace, + '' + + ' comment_text' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' 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() { + fireDeleteEvent(this.workspace, + '' + + ' comment_text' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' 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() { + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, + '' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Mutator", function() { + fireDeleteEvent(this.workspace, + '' + + ' ' + + '' + ); + fireDeleteEvent(this.workspace, + '' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + }); + suite("Max Contents", function() { + test("Max 0", function() { + this.workspace.options.maxTrashcanContents = 0; + fireDeleteEvent(this.workspace, + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 0); + this.workspace.options.maxTrashcanContents = Infinity; + }); + test("Last In First Out", function() { + this.workspace.options.maxTrashcanContents = 1; + fireDeleteEvent(this.workspace, ''); + fireDeleteEvent(this.workspace, ''); + chai.assert.equal(this.trashcan.contents_.length, 1); + chai.assert.equal( + Blockly.Xml.textToDom(this.trashcan.contents_[0]) + .getAttribute('type'), + 'dummy_type2' + ); + this.workspace.options.maxTrashcanContents = Infinity; + }); + }); +}); diff --git a/static/js/tests/mocha/utils_test.js b/static/js/tests/mocha/utils_test.js new file mode 100644 index 0000000..11c6fdb --- /dev/null +++ b/static/js/tests/mocha/utils_test.js @@ -0,0 +1,352 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Utils', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + 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('tokenizeInterpolation', function() { + test('Basic', function() { + var tokens = Blockly.utils.tokenizeInterpolation(''); + chai.assert.deepEqual(tokens, [], 'Null interpolation'); + + tokens = Blockly.utils.tokenizeInterpolation('Hello'); + chai.assert.deepEqual(tokens, ['Hello'], 'No interpolation'); + + tokens = Blockly.utils.tokenizeInterpolation('Hello%World'); + chai.assert.deepEqual(tokens, ['Hello%World'], 'Unescaped %.'); + + tokens = Blockly.utils.tokenizeInterpolation('Hello%%World'); + chai.assert.deepEqual(tokens, ['Hello%World'], 'Escaped %.'); + + tokens = Blockly.utils.tokenizeInterpolation('Hello %1 World'); + chai.assert.deepEqual(tokens, ['Hello ', 1, ' World'], 'Interpolation.'); + + tokens = Blockly.utils.tokenizeInterpolation('%123Hello%456World%789'); + chai.assert.deepEqual(tokens, [123, 'Hello', 456, 'World', 789], 'Interpolations.'); + + tokens = Blockly.utils.tokenizeInterpolation('%%%x%%0%00%01%'); + chai.assert.deepEqual(tokens, ['%%x%0', 0, 1, '%'], 'Torture interpolations.'); + }); + + test('String table', function() { + Blockly.Msg = Blockly.Msg || {}; + Blockly.Msg.STRING_REF = 'test string'; + var tokens = Blockly.utils.tokenizeInterpolation('%{bky_string_ref}'); + chai.assert.deepEqual(tokens, ['test string'], 'String table reference, lowercase'); + tokens = Blockly.utils.tokenizeInterpolation('%{BKY_STRING_REF}'); + chai.assert.deepEqual(tokens, ['test string'], 'String table reference, uppercase'); + + Blockly.Msg.WITH_PARAM = 'before %1 after'; + tokens = Blockly.utils.tokenizeInterpolation('%{bky_with_param}'); + chai.assert.deepEqual(tokens, ['before ', 1, ' after'], 'String table reference, with parameter'); + + Blockly.Msg.RECURSE = 'before %{bky_string_ref} after'; + tokens = Blockly.utils.tokenizeInterpolation('%{bky_recurse}'); + chai.assert.deepEqual(tokens, ['before test string after'], 'String table reference, with subreference'); + }); + + test('Error cases', function() { + var tokens = Blockly.utils.tokenizeInterpolation('%{bky_undefined}'); + chai.assert.deepEqual(tokens, ['%{bky_undefined}'], 'Undefined string table reference'); + + Blockly.Msg['1'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{1} after'); + chai.assert.deepEqual(tokens, ['before %{1} after'], 'Invalid initial digit in string table reference'); + + Blockly.Msg['TWO WORDS'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{two words} after'); + chai.assert.deepEqual(tokens, ['before %{two words} after'], 'Invalid character in string table reference: space'); + + Blockly.Msg['TWO-WORDS'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{two-words} after'); + chai.assert.deepEqual(tokens, ['before %{two-words} after'], 'Invalid character in string table reference: dash'); + + Blockly.Msg['TWO.WORDS'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{two.words} after'); + chai.assert.deepEqual(tokens, ['before %{two.words} after'], 'Invalid character in string table reference: period'); + + Blockly.Msg['AB&C'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{ab&c} after'); + chai.assert.deepEqual(tokens, ['before %{ab&c} after'], 'Invalid character in string table reference: &'); + + Blockly.Msg['UNCLOSED'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{unclosed'); + chai.assert.deepEqual(tokens, ['before %{unclosed'], 'String table reference, with parameter'); + }); + }); + + test('replaceMessageReferences', function() { + 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(''); + chai.assert.equal(resultString, '', 'Empty string produces empty string'); + + resultString = Blockly.utils.replaceMessageReferences('%%'); + chai.assert.equal(resultString, '%', 'Escaped %'); + resultString = Blockly.utils.replaceMessageReferences('%%{bky_string_ref}'); + chai.assert.equal(resultString, '%{bky_string_ref}', 'Escaped %'); + + resultString = Blockly.utils.replaceMessageReferences('%a'); + chai.assert.equal(resultString, '%a', 'Unrecognized % escape code treated as literal'); + + resultString = Blockly.utils.replaceMessageReferences('%1'); + chai.assert.equal(resultString, '%1', 'Interpolation tokens ignored.'); + resultString = Blockly.utils.replaceMessageReferences('%1 %2'); + chai.assert.equal(resultString, '%1 %2', 'Interpolation tokens ignored.'); + resultString = Blockly.utils.replaceMessageReferences('before %1 after'); + chai.assert.equal(resultString, 'before %1 after', 'Interpolation tokens ignored.'); + + // Blockly.Msg.STRING_REF cases: + resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref}'); + chai.assert.equal(resultString, 'test string', 'Message ref dereferenced.'); + resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref} after'); + chai.assert.equal(resultString, 'before test string after', 'Message ref dereferenced.'); + + // Blockly.Msg.STRING_REF_WITH_ARG cases: + resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref_with_arg}'); + chai.assert.equal(resultString, 'test %1 string', 'Message ref dereferenced with argument preserved.'); + resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref_with_arg} after'); + chai.assert.equal(resultString, 'before test %1 string after', 'Message ref dereferenced with argument preserved.'); + + // Blockly.Msg.STRING_REF_WITH_SUBREF cases: + resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref_with_subref}'); + chai.assert.equal(resultString, 'test subref string', 'Message ref and subref dereferenced.'); + resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref_with_subref} after'); + chai.assert.equal(resultString, 'before test subref string after', 'Message ref and subref dereferenced.'); + }); + + test('arrayRemove', function() { + var arr = [1, 2, 3, 2]; + chai.assert.isFalse(Blockly.utils.arrayRemove(arr, 0), 'Remove Not found'); + chai.assert.equal(arr.join(','), '1,2,3,2', 'Remove Not found result'); + chai.assert.isTrue(Blockly.utils.arrayRemove(arr, 2), 'Remove item'); + chai.assert.equal(arr.join(','), '1,3,2', 'Remove item result'); + chai.assert.isTrue(Blockly.utils.arrayRemove(arr, 2), 'Remove item again'); + chai.assert.equal(arr.join(','), '1,3', 'Remove item again result'); + }); + + test('XY_REGEX_', function() { + var regex = Blockly.utils.getRelativeXY.XY_REGEX_; + var m; + m = 'INVALID'.match(regex); + chai.assert.isNull(m); + + m = 'translate(10)'.match(regex); + chai.assert.equal(m[1], '10', 'translate(10), x'); + chai.assert.isUndefined(m[3], 'translate(10), y'); + + m = 'translate(11, 12)'.match(regex); + chai.assert.equal(m[1], '11', 'translate(11, 12), x'); + chai.assert.equal(m[3], '12', 'translate(11, 12), y'); + + m = 'translate(13,14)'.match(regex); + chai.assert.equal(m[1], '13', 'translate(13,14), x'); + chai.assert.equal(m[3], '14', 'translate(13,14), y'); + + m = 'translate(15 16)'.match(regex); + chai.assert.equal(m[1], '15', 'translate(15 16), x'); + chai.assert.equal(m[3], '16', 'translate(15 16), y'); + + m = 'translate(1.23456e+42 0.123456e-42)'.match(regex); + chai.assert.equal(m[1], '1.23456e+42', 'translate(1.23456e+42 0.123456e-42), x'); + chai.assert.equal(m[3], '0.123456e-42', 'translate(1.23456e+42 0.123456e-42), y'); + }); + + test('XY_STYLE_REGEX_', function() { + var regex = Blockly.utils.getRelativeXY.XY_STYLE_REGEX_; + var m; + m = 'INVALID'.match(regex); + chai.assert.isNull(m); + + m = 'transform:translate(9px)'.match(regex); + chai.assert.equal(m[1], '9', 'transform:translate(9px), x'); + chai.assert.isUndefined(m[3], 'transform:translate(9px), y'); + + m = 'transform:translate3d(10px)'.match(regex); + chai.assert.equal(m[1], '10', 'transform:translate3d(10px), x'); + chai.assert.isUndefined(m[3], 'transform:translate(10px), y'); + + m = 'transform: translate(11px, 12px)'.match(regex); + chai.assert.equal(m[1], '11', 'transform: translate(11px, 12px), x'); + chai.assert.equal(m[3], '12', 'transform: translate(11px, 12px), y'); + + m = 'transform: translate(13px,14px)'.match(regex); + chai.assert.equal(m[1], '13', 'transform: translate(13px,14px), x'); + chai.assert.equal(m[3], '14', 'transform: translate(13px,14px), y'); + + m = 'transform: translate(15px 16px)'.match(regex); + chai.assert.equal(m[1], '15', 'transform: translate(15px 16px), x'); + chai.assert.equal(m[3], '16', 'transform: translate(15px 16px), y'); + + m = 'transform: translate(1.23456e+42px 0.123456e-42px)'.match(regex); + chai.assert.equal(m[1], '1.23456e+42', 'transform: translate(1.23456e+42px 0.123456e-42px), x'); + chai.assert.equal(m[3], '0.123456e-42', 'transform: translate(1.23456e+42px 0.123456e-42px), y'); + + m = 'transform:translate3d(20px, 21px, 22px)'.match(regex); + chai.assert.equal(m[1], '20', 'transform:translate3d(20px, 21px, 22px), x'); + chai.assert.equal(m[3], '21', 'transform:translate3d(20px, 21px, 22px), y'); + + m = 'transform:translate3d(23px,24px,25px)'.match(regex); + chai.assert.equal(m[1], '23', 'transform:translate3d(23px,24px,25px), x'); + chai.assert.equal(m[3], '24', 'transform:translate3d(23px,24px,25px), y'); + + m = 'transform:translate3d(26px 27px 28px)'.match(regex); + chai.assert.equal(m[1], '26', 'transform:translate3d(26px 27px 28px), x'); + chai.assert.equal(m[3], '27', 'transform:translate3d(26px 27px 28px), y'); + + m = 'transform:translate3d(1.23456e+42px 0.123456e-42px 42px)'.match(regex); + chai.assert.equal(m[1], '1.23456e+42', 'transform:translate3d(1.23456e+42px 0.123456e-42px 42px), x'); + chai.assert.equal(m[3], '0.123456e-42', 'transform:translate3d(1.23456e+42px 0.123456e-42px 42px), y'); + }); + + suite('DOM', function() { + test('addClass', function() { + var p = document.createElement('p'); + Blockly.utils.dom.addClass(p, 'one'); + chai.assert.equal(p.className, 'one', 'Adding "one"'); + Blockly.utils.dom.addClass(p, 'one'); + chai.assert.equal(p.className, 'one', 'Adding duplicate "one"'); + Blockly.utils.dom.addClass(p, 'two'); + chai.assert.equal(p.className, 'one two', 'Adding "two"'); + Blockly.utils.dom.addClass(p, 'two'); + chai.assert.equal(p.className, 'one two', 'Adding duplicate "two"'); + Blockly.utils.dom.addClass(p, 'three'); + chai.assert.equal(p.className, 'one two three', 'Adding "three"'); + }); + + test('hasClass', function() { + var p = document.createElement('p'); + p.className = ' one three two three '; + chai.assert.isTrue(Blockly.utils.dom.hasClass(p, 'one'), 'Has "one"'); + chai.assert.isTrue(Blockly.utils.dom.hasClass(p, 'two'), 'Has "two"'); + chai.assert.isTrue(Blockly.utils.dom.hasClass(p, 'three'), 'Has "three"'); + chai.assert.isFalse(Blockly.utils.dom.hasClass(p, 'four'), 'Has no "four"'); + chai.assert.isFalse(Blockly.utils.dom.hasClass(p, 't'), 'Has no "t"'); + }); + + test('removeClass', function() { + var p = document.createElement('p'); + p.className = ' one three two three '; + Blockly.utils.dom.removeClass(p, 'two'); + chai.assert.equal(p.className, 'one three three', 'Removing "two"'); + Blockly.utils.dom.removeClass(p, 'four'); + chai.assert.equal(p.className, 'one three three', 'Removing "four"'); + Blockly.utils.dom.removeClass(p, 'three'); + chai.assert.equal(p.className, 'one', 'Removing "three"'); + Blockly.utils.dom.removeClass(p, 'ne'); + chai.assert.equal(p.className, 'one', 'Removing "ne"'); + Blockly.utils.dom.removeClass(p, 'one'); + chai.assert.equal(p.className, '', 'Removing "one"'); + Blockly.utils.dom.removeClass(p, 'zero'); + chai.assert.equal(p.className, '', 'Removing "zero"'); + }); + }); + + suite('String', function() { + test('starts with', function() { + chai.assert.isFalse(Blockly.utils.string.startsWith('123', '2'), 'Does not start with'); + chai.assert.isTrue(Blockly.utils.string.startsWith('123', '12'), 'Start with'); + chai.assert.isTrue(Blockly.utils.string.startsWith('123', ''), 'Start with empty string 1'); + chai.assert.isTrue(Blockly.utils.string.startsWith('', ''), 'Start with empty string 12'); + }); + + test('shortest string length', function() { + var len = Blockly.utils.string.shortestStringLength('one,two,three,four,five'.split(',')); + chai.assert.equal(len, 3, 'Length of "one"'); + len = Blockly.utils.string.shortestStringLength('one,two,three,four,five,'.split(',')); + chai.assert.equal(len, 0, 'Length of ""'); + len = Blockly.utils.string.shortestStringLength(['Hello World']); + chai.assert.equal(len, 11, 'List of one'); + len = Blockly.utils.string.shortestStringLength([]); + chai.assert.equal(len, 0, 'Empty list'); + }); + + test('comment word prefix', function() { + var len = Blockly.utils.string.commonWordPrefix('one,two,three,four,five'.split(',')); + chai.assert.equal(len, 0, 'No prefix'); + len = Blockly.utils.string.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(',')); + chai.assert.equal(len, 0, 'No word prefix'); + len = Blockly.utils.string.commonWordPrefix('abc de,abc de,abc de,abc de'.split(',')); + chai.assert.equal(len, 6, 'Full equality'); + len = Blockly.utils.string.commonWordPrefix('abc deX,abc deY'.split(',')); + chai.assert.equal(len, 4, 'One word prefix'); + len = Blockly.utils.string.commonWordPrefix('abc de,abc deY'.split(',')); + chai.assert.equal(len, 4, 'Overflow no'); + len = Blockly.utils.string.commonWordPrefix('abc de,abc de Y'.split(',')); + chai.assert.equal(len, 6, 'Overflow yes'); + len = Blockly.utils.string.commonWordPrefix(['Hello World']); + chai.assert.equal(len, 11, 'List of one'); + len = Blockly.utils.string.commonWordPrefix([]); + chai.assert.equal(len, 0, 'Empty list'); + len = Blockly.utils.string.commonWordPrefix('turn left,turn right'.split(',')); + chai.assert.equal(len, 0, 'No prefix due to &nbsp;'); + len = Blockly.utils.string.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(',')); + chai.assert.equal(len, 0, 'No prefix due to \\u00A0'); + }); + + test('comment word suffix', function() { + var len = Blockly.utils.string.commonWordSuffix('one,two,three,four,five'.split(',')); + chai.assert.equal(len, 0, 'No suffix'); + len = Blockly.utils.string.commonWordSuffix('oneX,twoX,threeX,fourX,fiveX'.split(',')); + chai.assert.equal(len, 0, 'No word suffix'); + len = Blockly.utils.string.commonWordSuffix('abc de,abc de,abc de,abc de'.split(',')); + chai.assert.equal(len, 6, 'Full equality'); + len = Blockly.utils.string.commonWordSuffix('Xabc de,Yabc de'.split(',')); + chai.assert.equal(len, 3, 'One word suffix'); + len = Blockly.utils.string.commonWordSuffix('abc de,Yabc de'.split(',')); + chai.assert.equal(len, 3, 'Overflow no'); + len = Blockly.utils.string.commonWordSuffix('abc de,Y abc de'.split(',')); + chai.assert.equal(len, 6, 'Overflow yes'); + len = Blockly.utils.string.commonWordSuffix(['Hello World']); + chai.assert.equal(len, 11, 'List of one'); + len = Blockly.utils.string.commonWordSuffix([]); + chai.assert.equal(len, 0, 'Empty list'); + }); + }); + + suite('Math', function() { + test('toRadians', function() { + var quarter = Math.PI / 2; + chai.assert.equal(Blockly.utils.math.toRadians(-90), -quarter, '-90'); + chai.assert.equal(Blockly.utils.math.toRadians(0), 0, '0'); + chai.assert.equal(Blockly.utils.math.toRadians(90), quarter, '90'); + chai.assert.equal(Blockly.utils.math.toRadians(180), 2 * quarter, '180'); + chai.assert.equal(Blockly.utils.math.toRadians(270), 3 * quarter, '270'); + chai.assert.equal(Blockly.utils.math.toRadians(360), 4 * quarter, '360'); + chai.assert.equal(Blockly.utils.math.toRadians(360 + 90), 5 * quarter, '450'); + }); + + test('toDegrees', function() { + var quarter = Math.PI / 2; + chai.assert.equal(Blockly.utils.math.toDegrees(-quarter), -90, '-90'); + chai.assert.equal(Blockly.utils.math.toDegrees(0), 0, '0'); + chai.assert.equal(Blockly.utils.math.toDegrees(quarter), 90, '90'); + chai.assert.equal(Blockly.utils.math.toDegrees(2 * quarter), 180, '180'); + chai.assert.equal(Blockly.utils.math.toDegrees(3 * quarter), 270, '270'); + chai.assert.equal(Blockly.utils.math.toDegrees(4 * quarter), 360, '360'); + chai.assert.equal(Blockly.utils.math.toDegrees(5 * quarter), 360 + 90, '450'); + }); + }); +}); diff --git a/static/js/tests/mocha/variable_map_test.js b/static/js/tests/mocha/variable_map_test.js new file mode 100644 index 0000000..35078f1 --- /dev/null +++ b/static/js/tests/mocha/variable_map_test.js @@ -0,0 +1,250 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Variable Map', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.variableMap = new Blockly.VariableMap(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('createVariable', function() { + test('Trivial', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + }); + + test('Already exists', function() { + // Expect that when the variable already exists, the variableMap_ is unchanged. + this.variableMap.createVariable('name1', 'type1', 'id1'); + + // Assert there is only one variable in the this.variableMap. + var keys = Object.keys(this.variableMap.variableMap_); + chai.assert.equal(keys.length, 1); + var varMapLength = this.variableMap.variableMap_[keys[0]].length; + chai.assert.equal(varMapLength, 1); + + this.variableMap.createVariable('name1', 'type1'); + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + // Check that the size of the variableMap_ did not change. + keys = Object.keys(this.variableMap.variableMap_); + chai.assert.equal(keys.length, 1); + varMapLength = this.variableMap.variableMap_[keys[0]].length; + chai.assert.equal(varMapLength, 1); + }); + + test('Name already exists', function() { + // Expect that when a variable with the same name but a different type already + // exists, the new variable is created. + this.variableMap.createVariable('name1', 'type1', 'id1'); + + // Assert there is only one variable in the this.variableMap. + var keys = Object.keys(this.variableMap.variableMap_); + chai.assert.equal(keys.length, 1); + var varMapLength = this.variableMap.variableMap_[keys[0]].length; + chai.assert.equal(varMapLength, 1); + + this.variableMap.createVariable('name1', 'type2', 'id2'); + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + assertVariableValues(this.variableMap, 'name1', 'type2', 'id2'); + // Check that the size of the variableMap_ did change. + keys = Object.keys(this.variableMap.variableMap_); + chai.assert.equal(keys.length, 2); + }); + + test('Null type', function() { + this.variableMap.createVariable('name1', null, 'id1'); + assertVariableValues(this.variableMap, 'name1', '', 'id1'); + }); + + test('Undefined type', function() { + this.variableMap.createVariable('name2', undefined, 'id2'); + assertVariableValues(this.variableMap, 'name2', '', 'id2'); + }); + + test('Null id', function() { + createGenUidStubWithReturns('1'); + this.variableMap.createVariable('name1', 'type1', null); + assertVariableValues(this.variableMap, 'name1', 'type1', '1'); + }); + + test('Undefined id', function() { + createGenUidStubWithReturns('1'); + this.variableMap.createVariable('name1', 'type1', undefined); + assertVariableValues(this.variableMap, 'name1', 'type1', '1'); + }); + + test('Two variables same type', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + this.variableMap.createVariable('name2', 'type1', 'id2'); + + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + assertVariableValues(this.variableMap, 'name2', 'type1', 'id2'); + }); + + test('Two variables same name', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + this.variableMap.createVariable('name1', 'type2', 'id2'); + + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + assertVariableValues(this.variableMap, 'name1', 'type2', 'id2'); + }); + + suite('Error cases', function() { + test('Id already exists', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + var variableMap = this.variableMap; + chai.assert.throws(function() { + variableMap.createVariable('name2', 'type2', 'id1'); + }, /"id1".*in use/); + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + }); + + test('Mismatched id', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + var variableMap = this.variableMap; + chai.assert.throws(function() { + variableMap.createVariable('name1', 'type1', 'id2'); + }, /"name1".*in use/); + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + }); + + test('Mismatched type', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + var variableMap = this.variableMap; + chai.assert.throws(function() { + variableMap.createVariable('name1', 'type2', 'id1'); + }); + assertVariableValues(this.variableMap, 'name1', 'type1', 'id1'); + chai.assert.isNull(this.variableMap.getVariableById('id2')); + }); + }); + }); + + suite('getVariable', function() { + test('By name and type', function() { + var var1 = this.variableMap.createVariable('name1', 'type1', 'id1'); + var var2 = this.variableMap.createVariable('name2', 'type1', 'id2'); + var var3 = this.variableMap.createVariable('name3', 'type2', 'id3'); + var result1 = this.variableMap.getVariable('name1', 'type1'); + var result2 = this.variableMap.getVariable('name2', 'type1'); + var result3 = this.variableMap.getVariable('name3', 'type2'); + + // Searching by name + type is correct. + chai.assert.equal(result1, var1); + chai.assert.equal(result2, var2); + chai.assert.equal(result3, var3); + + // Searching only by name defaults to the '' type. + chai.assert.isNull(this.variableMap.getVariable('name1')); + chai.assert.isNull(this.variableMap.getVariable('name2')); + chai.assert.isNull(this.variableMap.getVariable('name3')); + }); + + test('Not found', function() { + var result = this.variableMap.getVariable('name1'); + chai.assert.isNull(result); + }); + }); + + suite('getVariableById', function() { + test('Trivial', function() { + var var1 = this.variableMap.createVariable('name1', 'type1', 'id1'); + var var2 = this.variableMap.createVariable('name2', 'type1', 'id2'); + var var3 = this.variableMap.createVariable('name3', 'type2', 'id3'); + var result1 = this.variableMap.getVariableById('id1'); + var result2 = this.variableMap.getVariableById('id2'); + var result3 = this.variableMap.getVariableById('id3'); + + chai.assert.equal(result1, var1); + chai.assert.equal(result2, var2); + chai.assert.equal(result3, var3); + }); + + test('Not found', function() { + var result = this.variableMap.getVariableById('id1'); + chai.assert.isNull(result); + }); + }); + + suite('getVariableTypes', function() { + test('Trivial', function() { + this.variableMap.createVariable('name1', 'type1', 'id1'); + this.variableMap.createVariable('name2', 'type1', 'id2'); + this.variableMap.createVariable('name3', 'type2', 'id3'); + this.variableMap.createVariable('name4', 'type3', 'id4'); + var resultArray = this.variableMap.getVariableTypes(); + // The empty string is always an option. + chai.assert.deepEqual(resultArray, ['type1', 'type2', 'type3', '']); + }); + + test('None', function() { + // The empty string is always an option. + var resultArray = this.variableMap.getVariableTypes(); + chai.assert.deepEqual(resultArray, ['']); + }); + }); + + suite('getVariablesOfType', function() { + test('Trivial', function() { + var var1 = this.variableMap.createVariable('name1', 'type1', 'id1'); + var var2 = this.variableMap.createVariable('name2', 'type1', 'id2'); + this.variableMap.createVariable('name3', 'type2', 'id3'); + this.variableMap.createVariable('name4', 'type3', 'id4'); + var resultArray1 = this.variableMap.getVariablesOfType('type1'); + var resultArray2 = this.variableMap.getVariablesOfType('type5'); + chai.assert.deepEqual(resultArray1, [var1, var2]); + chai.assert.deepEqual(resultArray2, []); + }); + + test('Null', function() { + var var1 = this.variableMap.createVariable('name1', '', 'id1'); + var var2 = this.variableMap.createVariable('name2', '', 'id2'); + var var3 = this.variableMap.createVariable('name3', '', 'id3'); + this.variableMap.createVariable('name4', 'type1', 'id4'); + var resultArray = this.variableMap.getVariablesOfType(null); + chai.assert.deepEqual(resultArray, [var1, var2, var3]); + }); + + test('Empty string', function() { + var var1 = this.variableMap.createVariable('name1', null, 'id1'); + var var2 = this.variableMap.createVariable('name2', null, 'id2'); + var resultArray = this.variableMap.getVariablesOfType(''); + chai.assert.deepEqual(resultArray, [var1, var2]); + }); + + test('Deleted', function() { + var variable = this.variableMap.createVariable('name1', null, 'id1'); + this.variableMap.deleteVariable(variable); + var resultArray = this.variableMap.getVariablesOfType(''); + chai.assert.deepEqual(resultArray, []); + }); + + test('Does not exist', function() { + var resultArray = this.variableMap.getVariablesOfType('type1'); + chai.assert.deepEqual(resultArray, []); + }); + }); + + suite('getAllVariables', function() { + test('Trivial', function() { + var var1 = this.variableMap.createVariable('name1', 'type1', 'id1'); + var var2 = this.variableMap.createVariable('name2', 'type1', 'id2'); + var var3 = this.variableMap.createVariable('name3', 'type2', 'id3'); + var resultArray = this.variableMap.getAllVariables(); + chai.assert.deepEqual(resultArray, [var1, var2, var3]); + }); + + test('None', function() { + var resultArray = this.variableMap.getAllVariables(); + chai.assert.deepEqual(resultArray, []); + }); + }); +}); diff --git a/static/js/tests/mocha/variable_model_test.js b/static/js/tests/mocha/variable_model_test.js new file mode 100644 index 0000000..0598da7 --- /dev/null +++ b/static/js/tests/mocha/variable_model_test.js @@ -0,0 +1,59 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Variable Model', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + test('Trivial', function() { + var variable = new Blockly.VariableModel( + this.workspace, 'test', 'test_type', 'test_id'); + chai.assert.equal(variable.name, 'test'); + chai.assert.equal(variable.type, 'test_type'); + chai.assert.equal(variable.id_, 'test_id'); + }); + + test('Null type', function() { + var variable = new Blockly.VariableModel( + this.workspace, 'test', null, 'test_id'); + chai.assert.equal(variable.type, ''); + }); + + test('Undefined type', function() { + var variable = new Blockly.VariableModel( + this.workspace, 'test', undefined, 'test_id'); + chai.assert.equal(variable.type, ''); + }); + + test('Null id', function() { + var variable = new Blockly.VariableModel( + this.workspace, 'test', 'test_type', null); + chai.assert.equal(variable.name, 'test'); + chai.assert.equal(variable.type, 'test_type'); + chai.assert.exists(variable.id_); + }); + + test('Undefined id', function() { + var variable = new Blockly.VariableModel( + this.workspace, 'test', 'test_type', undefined); + chai.assert.equal(variable.name, 'test'); + chai.assert.equal(variable.type, 'test_type'); + chai.assert.exists(variable.id_); + }); + + test('Only name provided', function() { + var variable = new Blockly.VariableModel(this.workspace, 'test'); + chai.assert.equal(variable.name, 'test'); + chai.assert.equal(variable.type, ''); + chai.assert.exists(variable.id_); + }); +}); diff --git a/static/js/tests/mocha/variables_test.js b/static/js/tests/mocha/variables_test.js new file mode 100644 index 0000000..2ed765c --- /dev/null +++ b/static/js/tests/mocha/variables_test.js @@ -0,0 +1,137 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Variables', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + Blockly.defineBlocksWithJsonArray([{ + "type": "get_var_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variableTypes": ["", "type1", "type2"] + } + ] + }]); + this.workspace.createVariable('foo', 'type1', '1'); + this.workspace.createVariable('bar', 'type1', '2'); + this.workspace.createVariable('baz', 'type1', '3'); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + /** + * 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 createTestVarBlock(workspace, variable_id) { + // 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; + } + + suite('allUsedVarModels', function() { + test('All used', function() { + createTestVarBlock(this.workspace, '1'); + createTestVarBlock(this.workspace, '2'); + createTestVarBlock(this.workspace, '3'); + + var result = Blockly.Variables.allUsedVarModels(this.workspace); + chai.assert.equal(result.length, 3, + 'Expected three variables in the list of used variables'); + }); + + test('Some unused', function() { + createTestVarBlock(this.workspace, '2'); + + var result = Blockly.Variables.allUsedVarModels(this.workspace); + chai.assert.equal(result.length, 1, + 'Expected one variable in the list of used variables'); + chai.assert.equal(result[0].getId(), '2', + 'Expected variable with ID 2 in the list of used variables'); + }); + + test('Var used twice', function() { + createTestVarBlock(this.workspace, '2'); + createTestVarBlock(this.workspace, '2'); + + var result = Blockly.Variables.allUsedVarModels(this.workspace); + // Using the same variable multiple times should not change the number of + // elements in the list. + chai.assert.equal(result.length, 1, + 'Expected one variable in the list of used variables'); + chai.assert.equal(result[0].getId(), '2', + 'Expected variable with ID 2 in the list of used variables'); + }); + + test('All unused', function() { + var result = Blockly.Variables.allUsedVarModels(this.workspace); + chai.assert.equal(result.length, 0, + 'Expected no variables in the list of used variables'); + }); + }); + + suite('getVariable', function() { + test('By id', function() { + var var1 = this.workspace.createVariable('name1', 'type1', 'id1'); + var var2 = this.workspace.createVariable('name2', 'type1', 'id2'); + var var3 = this.workspace.createVariable('name3', 'type2', 'id3'); + var result1 = Blockly.Variables.getVariable(this.workspace, 'id1'); + var result2 = Blockly.Variables.getVariable(this.workspace, 'id2'); + var result3 = Blockly.Variables.getVariable(this.workspace, 'id3'); + + chai.assert.equal(var1, result1); + chai.assert.equal(var2, result2); + chai.assert.equal(var3, result3); + }); + + test('By name and type', function() { + var var1 = this.workspace.createVariable('name1', 'type1', 'id1'); + var var2 = this.workspace.createVariable('name2', 'type1', 'id2'); + var var3 = this.workspace.createVariable('name3', 'type2', 'id3'); + var result1 = + Blockly.Variables.getVariable(this.workspace, null, 'name1', 'type1'); + var result2 = + Blockly.Variables.getVariable(this.workspace, null, 'name2', 'type1'); + var result3 = + Blockly.Variables.getVariable(this.workspace, null, 'name3', 'type2'); + + // Searching by name + type is correct. + chai.assert.equal(var1, result1); + chai.assert.equal(var2, result2); + chai.assert.equal(var3, result3); + }); + + test('Bad id with name and type fallback', function() { + var var1 = this.workspace.createVariable('name1', 'type1', 'id1'); + var var2 = this.workspace.createVariable('name2', 'type1', 'id2'); + var var3 = this.workspace.createVariable('name3', 'type2', 'id3'); + var result1 = + Blockly.Variables.getVariable(this.workspace, 'badId', 'name1', 'type1'); + var result2 = + Blockly.Variables.getVariable(this.workspace, 'badId', 'name2', 'type1'); + var result3 = + Blockly.Variables.getVariable(this.workspace, 'badId', 'name3', 'type2'); + + // Searching by ID failed, but falling back onto name + type is correct. + chai.assert.equal(var1, result1); + chai.assert.equal(var2, result2); + chai.assert.equal(var3, result3); + }); + }); +}); diff --git a/static/js/tests/mocha/widget_div_test.js b/static/js/tests/mocha/widget_div_test.js new file mode 100644 index 0000000..84571dd --- /dev/null +++ b/static/js/tests/mocha/widget_div_test.js @@ -0,0 +1,167 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('WidgetDiv', function() { + setup(function() { + sharedTestSetup.call(this); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('positionWithAnchor', function() { + function makeBBox(left, top, width, height) { + return { + left: left, + right: left + width, + top: top, + bottom: top + height, + width: width, + height: height + }; + } + + setup(function() { + Blockly.WidgetDiv.createDom(); + this.viewportBBox = makeBBox(0, 0, 1000, 1003); + this.widgetSize = { + width: 100, + height: 102 + }; + this.anchorSize = { + width: 90, + height: 91 + }; + + this.testWidgetPosition = function( + anchorBBox, rtl, expectedX, expectedY, expectedHeight) { + Blockly.WidgetDiv.positionWithAnchor( + this.viewportBBox, anchorBBox, this.widgetSize, rtl); + var style = Blockly.WidgetDiv.DIV.style; + chai.assert.equal(style.left, expectedX + 'px', 'Left'); + chai.assert.equal(style.top, expectedY + 'px', 'Top'); + chai.assert.equal(style.height, expectedHeight + 'px', 'Height'); + }; + }); + + suite('LTR', function() { + test('noConflict', function() { + // Anchor placed in the middle. + var anchorBBox = + makeBBox(500, 500, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed just below at the left side of the + // anchor. + var expectedX = anchorBBox.left; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, false, expectedX, expectedY, this.widgetSize.height); + }); + + test('topConflict', function() { + // Anchor close to the top. + var anchorBBox = + makeBBox(500, 50, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed just below the anchor. + var expectedX = anchorBBox.left; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, false, expectedX, expectedY, this.widgetSize.height); + }); + + test('bottomConflict', function() { + // Anchor placed close to the bottom. + var anchorBBox = + makeBBox(500, 900, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed just above the anchor. + var expectedX = anchorBBox.left; + var expectedY = anchorBBox.top - this.widgetSize.height; + this.testWidgetPosition( + anchorBBox, false, expectedX, expectedY, this.widgetSize.height); + }); + + test('leftConflict', function() { + // Anchor placed close to the left side. + var anchorBBox = + makeBBox(50, 500, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed at the anchor. + var expectedX = anchorBBox.left; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, false, expectedX, expectedY, this.widgetSize.height); + }); + + test('rightConflict', function() { + // Anchor placed close to the right side. + var anchorBBox = + makeBBox(950, 500, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed as far right as possible--at the edge of + // the screen. + var expectedX = this.viewportBBox.width - this.widgetSize.width; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, false, expectedX, expectedY, this.widgetSize.height); + }); + }); + suite('RTL', function() { + test('noConflict', function() { + // Anchor placed in the middle + var anchorBBox = + makeBBox(500, 500, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed at the right side of the anchor. + var expectedX = anchorBBox.right - this.widgetSize.width; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, true, expectedX, expectedY, this.widgetSize.height); + }); + + test('topConflict', function() { + // Anchor close to the top. + var anchorBBox = + makeBBox(500, 50, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed just below the anchor. + var expectedX = anchorBBox.right - this.widgetSize.width; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, true, expectedX, expectedY, this.widgetSize.height); + }); + + test('bottomConflict', function() { + // Anchor placed close to the bottom. + var anchorBBox = + makeBBox(500, 900, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed just above the anchor. + var expectedX = anchorBBox.right - this.widgetSize.width; + var expectedY = anchorBBox.top - this.widgetSize.height; + this.testWidgetPosition( + anchorBBox, true, expectedX, expectedY, this.widgetSize.height); + }); + + test('leftConflict', function() { + // Anchor placed close to the left side. + var anchorBBox = + makeBBox(10, 500, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed as far left as possible--at the edge of + // the screen. + var expectedX = 0; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, true, expectedX, expectedY, this.widgetSize.height); + }); + + test('rightConflict', function() { + // Anchor placed close to the right side. + var anchorBBox = + makeBBox(950, 500, this.anchorSize.width, this.anchorSize.height); + // The widget div should be placed as far right as possible--at the edge of + // the screen. + var expectedX = this.viewportBBox.width - this.widgetSize.width; + var expectedY = anchorBBox.top + this.anchorSize.height; + this.testWidgetPosition( + anchorBBox, true, expectedX, expectedY, this.widgetSize.height); + }); + }); + }); +}); diff --git a/static/js/tests/mocha/workspace_comment_test.js b/static/js/tests/mocha/workspace_comment_test.js new file mode 100644 index 0000000..421633e --- /dev/null +++ b/static/js/tests/mocha/workspace_comment_test.js @@ -0,0 +1,198 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.require('Blockly.WorkspaceComment'); + +suite('Workspace comment', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('getTopComments(ordered=true)', function() { + test('No comments', function() { + chai.assert.equal(this.workspace.getTopComments(true).length, 0); + }); + + test('One comment', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + chai.assert.equal(this.workspace.getTopComments(true).length, 1); + chai.assert.equal(this.workspace.commentDB_['comment id'], comment); + }); + + test('After clear empty workspace', function() { + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopComments(true).length, 0); + }); + + test('After clear non-empty workspace', function() { + new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopComments(true).length, 0); + chai.assert.isFalse('comment id' in this.workspace.commentDB_); + }); + + test('After dispose', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + comment.dispose(); + chai.assert.equal(this.workspace.getTopComments(true).length, 0); + chai.assert.isFalse('comment id' in this.workspace.commentDB_); + }); + }); + + suite('getTopComments(ordered=false)', function() { + test('No comments', function() { + chai.assert.equal(this.workspace.getTopComments(false).length, 0); + }); + + test('One comment', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + chai.assert.equal(this.workspace.getTopComments(false).length, 1); + chai.assert.equal(this.workspace.commentDB_['comment id'], comment); + }); + + test('After clear empty workspace', function() { + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopComments(false).length, 0); + }); + + test('After clear non-empty workspace', function() { + new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopComments(false).length, 0); + chai.assert.isFalse('comment id' in this.workspace.commentDB_); + }); + + test('After dispose', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + comment.dispose(); + chai.assert.equal(this.workspace.getTopComments(false).length, 0); + chai.assert.isFalse('comment id' in this.workspace.commentDB_); + }); + }); + + suite('getCommentById', function() { + test('Trivial', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + chai.assert.equal(this.workspace.getCommentById(comment.id), comment); + }); + + test('Null id', function() { + chai.assert.isNull(this.workspace.getCommentById(null)); + }); + + test('Non-existent id', function() { + chai.assert.isNull(this.workspace.getCommentById('badId')); + }); + + test('After dispose', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + comment.dispose(); + chai.assert.isNull(this.workspace.getCommentById(comment.id)); + }); + }); + + suite('dispose', function() { + test('Called twice', function() { + var comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + comment.dispose(); + // Nothing should go wrong the second time dispose is called. + comment.dispose(); + }); + }); + + suite('Width and height', function() { + setup(function() { + this.comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 10, 20, 'comment id'); + }); + + test('Initial values', function() { + chai.assert.equal(this.comment.getWidth(), 20, 'Width'); + chai.assert.equal(this.comment.getHeight(), 10, 'Height'); + }); + + test('setWidth does not affect height', function() { + this.comment.setWidth(30); + chai.assert.equal(this.comment.getWidth(), 30, 'Width'); + chai.assert.equal(this.comment.getHeight(), 10, 'Height'); + }); + + test('setHeight does not affect width', function() { + this.comment.setHeight(30); + chai.assert.equal(this.comment.getWidth(), 20, 'Width'); + chai.assert.equal(this.comment.getHeight(), 30, 'Height'); + }); + }); + + suite('XY position', function() { + setup(function() { + this.comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 10, 20, 'comment id'); + }); + + test('Initial position', function() { + var xy = this.comment.getXY(); + chai.assert.equal(xy.x, 0, 'Initial X position'); + chai.assert.equal(xy.y, 0,'Initial Y position'); + }); + + test('moveBy', function() { + this.comment.moveBy(10, 100); + var xy = this.comment.getXY(); + chai.assert.equal(xy.x, 10, 'New X position'); + chai.assert.equal(xy.y, 100, 'New Y position'); + }); + + }); + + suite('Content', function() { + setup(function() { + + this.comment = new Blockly.WorkspaceComment( + this.workspace, 'comment text', 0, 0, 'comment id'); + }); + + teardown(function() { + sinon.restore(); + }); + + test('After creation', function() { + chai.assert.equal( + this.comment.getContent(), 'comment text'); + chai.assert.equal( + this.workspace.undoStack_.length, 1,'Workspace undo stack'); + }); + + test('Set to same value', function() { + this.comment.setContent('comment text'); + chai.assert.equal(this.comment.getContent(), 'comment text'); + // Setting the text to the old value does not fire an event. + chai.assert.equal( + this.workspace.undoStack_.length, 1, 'Workspace undo stack'); + }); + + test('Set to different value', function() { + this.comment.setContent('new comment text'); + chai.assert.equal(this.comment.getContent(), 'new comment text'); + chai.assert.equal( + this.workspace.undoStack_.length, 2, 'Workspace undo stack'); + }); + }); +}); diff --git a/static/js/tests/mocha/workspace_svg_test.js b/static/js/tests/mocha/workspace_svg_test.js new file mode 100644 index 0000000..84c6174 --- /dev/null +++ b/static/js/tests/mocha/workspace_svg_test.js @@ -0,0 +1,345 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('WorkspaceSvg', function() { + setup(function() { + sharedTestSetup.call(this); + var toolbox = document.getElementById('toolbox-categories'); + this.workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + Blockly.defineBlocksWithJsonArray([{ + 'type': 'simple_test_block', + 'message0': 'simple test block', + 'output': null + }, + { + 'type': 'test_val_in', + 'message0': 'test in %1', + 'args0': [ + { + 'type': 'input_value', + 'name': 'NAME' + } + ] + }]); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + test('dispose of WorkspaceSvg without dom throws no error', function() { + var ws = new Blockly.WorkspaceSvg(new Blockly.Options({})); + ws.dispose(); + }); + + test('appendDomToWorkspace alignment', function() { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + Blockly.Xml.appendDomToWorkspace(dom, this.workspace); + chai.assert.equal(this.workspace.getAllBlocks(false).length, 1, + 'Block count'); + Blockly.Xml.appendDomToWorkspace(dom, this.workspace); + chai.assert.equal(this.workspace.getAllBlocks(false).length, 2, + 'Block count'); + var blocks = this.workspace.getAllBlocks(false); + chai.assert.equal(blocks[0].getRelativeToSurfaceXY().x, 21, + 'Block 1 position x'); + chai.assert.equal(blocks[0].getRelativeToSurfaceXY().y, 23, + 'Block 1 position y'); + chai.assert.equal(blocks[1].getRelativeToSurfaceXY().x, 21, + 'Block 2 position x'); + // Y separation value defined in appendDomToWorkspace as 10 + chai.assert.equal(blocks[1].getRelativeToSurfaceXY().y, + 23 + blocks[0].getHeightWidth().height + 10, + 'Block 2 position y'); + }); + + test('Replacing shadow disposes svg', function() { + var dom = Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '' + + ''); + + Blockly.Xml.appendDomToWorkspace(dom, this.workspace); + var blocks = this.workspace.getAllBlocks(false); + chai.assert.equal(blocks.length, 2,'Block count'); + var shadowBlock = blocks[1]; + chai.assert.exists(shadowBlock.getSvgRoot()); + + var block = this.workspace.newBlock('simple_test_block'); + block.initSvg(); + + var inputConnection = + this.workspace.getTopBlocks()[0].getInput('NAME').connection; + inputConnection.connect(block.outputConnection); + chai.assert.exists(block.getSvgRoot()); + chai.assert.notExists(shadowBlock.getSvgRoot()); + }); + + suite('updateToolbox', function() { + test('Passes in null when toolbox exists', function() { + chai.assert.throws(function() { + this.workspace.updateToolbox(null); + }.bind(this), 'Can\'t nullify an existing toolbox.'); + }); + test('Passes in toolbox def when current toolbox is null', function() { + this.workspace.options.languageTree = null; + chai.assert.throws(function() { + this.workspace.updateToolbox({'contents': []}); + }.bind(this), 'Existing toolbox is null. Can\'t create new toolbox.'); + }); + test('Existing toolbox has no categories', function() { + sinon.stub(Blockly.utils.toolbox, 'hasCategories').returns(true); + this.workspace.toolbox_ = null; + chai.assert.throws(function() { + this.workspace.updateToolbox({'contents': []}); + }.bind(this), 'Existing toolbox has no categories. Can\'t change mode.'); + }); + test('Existing toolbox has categories', function() { + sinon.stub(Blockly.utils.toolbox, 'hasCategories').returns(false); + this.workspace.flyout_ = null; + chai.assert.throws(function() { + this.workspace.updateToolbox({'contents': []}); + }.bind(this), 'Existing toolbox has categories. Can\'t change mode.'); + }); + test('Passing in string as toolboxdef', function() { + var parseToolboxFake = sinon.spy(Blockly.utils.toolbox, 'parseToolboxTree'); + this.workspace.updateToolbox(''); + sinon.assert.calledOnce(parseToolboxFake); + }); + }); + + suite('addTopBlock', function() { + setup(function() { + this.targetWorkspace = new Blockly.Workspace(); + this.workspace.isFlyout = true; + this.workspace.targetWorkspace = this.targetWorkspace; + Blockly.defineBlocksWithJsonArray([{ + "type": "get_var_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variableTypes": ["", "type1", "type2"] + } + ] + }]); + }); + + teardown(function() { + // 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. + workspaceTeardown.call(this, this.targetWorkspace); + }); + + test('Trivial Flyout is True', function() { + this.targetWorkspace.createVariable('name1', '', '1'); + + // Flyout.init usually does this binding. + this.workspace.variableMap_ = this.targetWorkspace.getVariableMap(); + + Blockly.Events.disable(); + var block = new Blockly.Block(this.workspace, 'get_var_block'); + block.inputList[0].fieldRow[0].setValue('1'); + Blockly.Events.enable(); + + this.workspace.removeTopBlock(block); + this.workspace.addTopBlock(block); + assertVariableValues(this.workspace, 'name1', '', '1'); + }); + }); + + suite('Viewport change events', function() { + function resetEventHistory(eventsFireStub, changeListenerSpy) { + eventsFireStub.resetHistory(); + changeListenerSpy.resetHistory(); + } + function assertSpyFiredViewportEvent(spy, workspace, expectedProperties) { + assertEventFired( + spy, Blockly.Events.ViewportChange, expectedProperties, + workspace.id); + assertEventFired(spy, Blockly.Events.ViewportChange, expectedProperties, + workspace.id); + } + function assertViewportEventFired(eventsFireStub, changeListenerSpy, + workspace, expectedEventCount = 1) { + var metrics = workspace.getMetrics(); + var expectedProperties = { + scale: workspace.scale, + viewTop: metrics.viewTop, + viewLeft: metrics.viewLeft + }; + assertSpyFiredViewportEvent( + eventsFireStub, workspace, expectedProperties); + assertSpyFiredViewportEvent( + changeListenerSpy, workspace,expectedProperties); + sinon.assert.callCount(changeListenerSpy, expectedEventCount); + sinon.assert.callCount(eventsFireStub, expectedEventCount); + } + function runViewportEventTest(eventTriggerFunc, eventsFireStub, + changeListenerSpy, workspace, clock, expectedEventCount = 1) { + clock.runAll(); + resetEventHistory(eventsFireStub, changeListenerSpy); + eventTriggerFunc(); + assertViewportEventFired( + eventsFireStub, changeListenerSpy, workspace, expectedEventCount); + } + setup(function() { + defineStackBlock(); + this.changeListenerSpy = createFireChangeListenerSpy(this.workspace); + }); + teardown(function() { + delete Blockly.Blocks['stack_block']; + }); + + suite('zoom', function() { + test('setScale', function() { + runViewportEventTest(() => this.workspace.setScale(2), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('zoom(50, 50, 1)', function() { + runViewportEventTest(() => this.workspace.zoom(50, 50, 1), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('zoom(50, 50, -1)', function() { + runViewportEventTest(() => this.workspace.zoom(50, 50, -1), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('zoomCenter(1)', function() { + runViewportEventTest(() => this.workspace.zoomCenter(1), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('zoomCenter(-1)', function() { + runViewportEventTest(() => this.workspace.zoomCenter(-1), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('zoomToFit', function() { + var block = this.workspace.newBlock('stack_block'); + block.initSvg(); + block.render(); + runViewportEventTest(() => this.workspace.zoomToFit(), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + }); + suite('scroll', function() { + test('centerOnBlock', function() { + var block = this.workspace.newBlock('stack_block'); + block.initSvg(); + block.render(); + runViewportEventTest(() => this.workspace.zoomToFit(block.id), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('scroll', function() { + runViewportEventTest(() => this.workspace.scroll(50, 50), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + test('scrollCenter', function() { + runViewportEventTest(() => this.workspace.scrollCenter(), + this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock); + }); + }); + suite('Blocks triggering viewport changes', function() { + test('block move that triggers scroll', function() { + var block = this.workspace.newBlock('stack_block'); + block.initSvg(); + block.render(); + this.clock.runAll(); + resetEventHistory(this.eventsFireStub, this.changeListenerSpy); + // Expect 2 events, 1 move, 1 viewport + runViewportEventTest(() => { + block.moveBy(1000, 1000); + }, this.eventsFireStub, this.changeListenerSpy, this.workspace, + this.clock, 2); + }); + test('domToWorkspace that doesn\'t trigger scroll' , function() { + // 4 blocks with space in center. + Blockly.Xml.domToWorkspace( + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + ''), + this.workspace); + var xmlDom = Blockly.Xml.textToDom( + ''); + this.clock.runAll(); + resetEventHistory(this.eventsFireStub, this.changeListenerSpy); + // Add block in center of other blocks, not triggering scroll. + Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom( + ''), this.workspace); + this.clock.runAll(); + assertEventNotFired( + this.eventsFireStub, Blockly.Events.ViewportChange, {}); + assertEventNotFired( + this.changeListenerSpy, Blockly.Events.ViewportChange, {}); + }); + test('domToWorkspace at 0,0 that doesn\'t trigger scroll' , function() { + // 4 blocks with space in center. + Blockly.Xml.domToWorkspace( + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + ''), + this.workspace); + var xmlDom = Blockly.Xml.textToDom( + ''); + this.clock.runAll(); + resetEventHistory(this.eventsFireStub, this.changeListenerSpy); + // Add block in center of other blocks, not triggering scroll. + Blockly.Xml.domToWorkspace(xmlDom, this.workspace); + this.clock.runAll(); + assertEventNotFired( + this.eventsFireStub, Blockly.Events.ViewportChange, {}); + assertEventNotFired( + this.changeListenerSpy, Blockly.Events.ViewportChange, {}); + }); + test.skip('domToWorkspace multiple blocks triggers one viewport event', function() { + // TODO: Un-skip after adding filtering for consecutive viewport events. + var addingMultipleBlocks = () => { + Blockly.Xml.domToWorkspace( + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + ''), + this.workspace); + }; + // Expect 10 events, 4 create, 4 move, 1 viewport, 1 finished loading + runViewportEventTest(addingMultipleBlocks, this.eventsFireStub, + this.changeListenerSpy, this.workspace, this.clock, 10); + }); + }); + }); + + suite('Workspace Base class', function() { + testAWorkspace(); + }); +}); diff --git a/static/js/tests/mocha/workspace_test.js b/static/js/tests/mocha/workspace_test.js new file mode 100644 index 0000000..e9bc9ec --- /dev/null +++ b/static/js/tests/mocha/workspace_test.js @@ -0,0 +1,1542 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Workspace', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + // eslint-disable-next-line no-use-before-define + testAWorkspace(); +}); + +function testAWorkspace() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "get_var_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variableTypes": ["", "type1", "type2"] + } + ] + }]); + }); + + teardown(function() { + // Clear Blockly.Event state. + Blockly.Events.setGroup(false); + Blockly.Events.disabled_ = 0; + sinon.restore(); + }); + + function assertBlockVarModelName(workspace, blockIndex, name) { + var block = workspace.topBlocks_[blockIndex]; + chai.assert.exists(block, 'Block at topBlocks_[' + blockIndex + ']'); + var varModel = block.getVarModels()[0]; + chai.assert.exists(varModel, + 'VariableModel for block at topBlocks_[' + blockIndex + ']'); + var blockVarName = varModel.name; + chai.assert.equal(blockVarName, name, + 'VariableModel name for block at topBlocks_[' + blockIndex + ']'); + } + + function createVarBlocksNoEvents(workspace, ids) { + var blocks = []; + // Turn off events to avoid testing XML at the same time. + Blockly.Events.disable(); + for (var i = 0, id; (id = ids[i]); i++) { + var block = new Blockly.Block(workspace, 'get_var_block'); + block.inputList[0].fieldRow[0].setValue(id); + blocks.push(block); + } + Blockly.Events.enable(); + return blocks; + } + + suite('clear', function() { + test('Trivial', function() { + sinon.stub(Blockly.Events, "setGroup").returns(null); + this.workspace.createVariable('name1', 'type1', 'id1'); + this.workspace.createVariable('name2', 'type2', 'id2'); + this.workspace.newBlock(''); + + this.workspace.clear(); + chai.assert.equal(this.workspace.topBlocks_.length, 0); + var varMapLength = + Object.keys(this.workspace.variableMap_.variableMap_).length; + chai.assert.equal(varMapLength, 0); + }); + + test('No variables', function() { + sinon.stub(Blockly.Events, "setGroup").returns(null); + this.workspace.newBlock(''); + + this.workspace.clear(); + chai.assert.equal(this.workspace.topBlocks_.length, 0); + var varMapLength = + Object.keys(this.workspace.variableMap_.variableMap_).length; + chai.assert.equal(varMapLength, 0); + }); + }); + + suite('deleteVariable', function() { + setup(function() { + // Create two variables of different types. + this.var1 = this.workspace.createVariable('name1', 'type1', 'id1'); + this.var2 = this.workspace.createVariable('name2', 'type2', 'id2'); + // Create blocks to refer to both of them. + createVarBlocksNoEvents(this.workspace, ['id1', 'id1', 'id2']); + }); + + test('deleteVariableById(id2) one usage', function() { + // Deleting variable one usage should not trigger confirm dialog. + var stub = + sinon.stub(Blockly, "confirm").callsArgWith(1, true); + this.workspace.deleteVariableById('id2'); + + sinon.assert.notCalled(stub); + var variable = this.workspace.getVariableById('id2'); + chai.assert.isNull(variable); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertBlockVarModelName(this.workspace, 0, 'name1'); + }); + + test('deleteVariableById(id1) multiple usages confirm', function() { + // Deleting variable with multiple usages triggers confirm dialog. + var stub = + sinon.stub(Blockly, "confirm").callsArgWith(1, true); + this.workspace.deleteVariableById('id1'); + + sinon.assert.calledOnce(stub); + var variable = this.workspace.getVariableById('id1'); + chai.assert.isNull(variable); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertBlockVarModelName(this.workspace, 0, 'name2'); + }); + + test('deleteVariableById(id1) multiple usages cancel', function() { + // Deleting variable with multiple usages triggers confirm dialog. + var stub = + sinon.stub(Blockly, "confirm").callsArgWith(1, false); + this.workspace.deleteVariableById('id1'); + + sinon.assert.calledOnce(stub); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertBlockVarModelName(this.workspace, 1, 'name1'); + assertBlockVarModelName(this.workspace, 2, 'name2'); + }); + }); + + suite('renameVariableById', function() { + setup(function() { + this.workspace.createVariable('name1', 'type1', 'id1'); + }); + + test('No references rename to name2', function() { + this.workspace.renameVariableById('id1', 'name2'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + // Renaming should not have created a new variable. + chai.assert.equal(this.workspace.getAllVariables().length, 1); + }); + + test('Reference exists rename to name2', function() { + createVarBlocksNoEvents(this.workspace, ['id1']); + + this.workspace.renameVariableById('id1', 'name2'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + // Renaming should not have created a new variable. + chai.assert.equal(this.workspace.getAllVariables().length, 1); + assertBlockVarModelName(this.workspace, 0, 'name2'); + }); + + test('Reference exists different capitalization rename to Name1', function() { + createVarBlocksNoEvents(this.workspace, ['id1']); + + this.workspace.renameVariableById('id1', 'Name1'); + assertVariableValues(this.workspace, 'Name1', 'type1', 'id1'); + // Renaming should not have created a new variable. + chai.assert.equal(this.workspace.getAllVariables().length, 1); + assertBlockVarModelName(this.workspace, 0, 'Name1'); + }); + + suite('Two variables rename overlap', function() { + test('Same type rename variable with id1 to name2', function() { + this.workspace.createVariable('name2', 'type1', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + + this.workspace.renameVariableById('id1', 'name2'); + + // The second variable should remain unchanged. + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + // The first variable should have been deleted. + var variable = this.workspace.getVariableById('id1'); + chai.assert.isNull(variable); + // There should only be one variable left. + chai.assert.equal(this.workspace.getAllVariables().length, 1); + + // Both blocks should now reference variable with name2. + assertBlockVarModelName(this.workspace, 0, 'name2'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + }); + + test('Different type rename variable with id1 to name2', function() { + this.workspace.createVariable('name2', 'type2', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + + this.workspace.renameVariableById('id1', 'name2'); + + // Variables with different type are allowed to have the same name. + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + // Both blocks should now reference variable with name2. + assertBlockVarModelName(this.workspace, 0, 'name2'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + }); + + test('Same type different capitalization rename variable with id1 to Name2', function() { + this.workspace.createVariable('name2', 'type1', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + + this.workspace.renameVariableById('id1', 'Name2'); + + // The second variable should be updated. + assertVariableValues(this.workspace, 'Name2', 'type1', 'id2'); + // The first variable should have been deleted. + var variable = this.workspace.getVariableById('id1'); + chai.assert.isNull(variable); + // There should only be one variable left. + chai.assert.equal(this.workspace.getAllVariables().length, 1); + + // Both blocks should now reference variable with Name2. + assertBlockVarModelName(this.workspace, 0, 'Name2'); + assertBlockVarModelName(this.workspace, 1, 'Name2'); + }); + + test('Different type different capitalization rename variable with id1 to Name2', function() { + this.workspace.createVariable('name2', 'type2', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + + this.workspace.renameVariableById('id1', 'Name2'); + + // Variables with different type are allowed to have the same name. + assertVariableValues(this.workspace, 'Name2', 'type1', 'id1'); + // Second variable should remain unchanged. + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + // Only first block should use new capitalization. + assertBlockVarModelName(this.workspace, 0, 'Name2'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + }); + }); + }); + + suite('getTopBlocks(ordered=true)', function() { + test('Empty workspace', function() { + chai.assert.equal(this.workspace.getTopBlocks(true).length, 0); + }); + + test('Flat workspace one block', function() { + this.workspace.newBlock(''); + chai.assert.equal(this.workspace.getTopBlocks(true).length, 1); + }); + + test('Flat workspace one block after dispose', function() { + var blockA = this.workspace.newBlock(''); + this.workspace.newBlock(''); + blockA.dispose(); + chai.assert.equal(this.workspace.getTopBlocks(true).length, 1); + }); + + test('Flat workspace two blocks', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + chai.assert.equal(this.workspace.getTopBlocks(true).length, 2); + }); + + test('Clear', function() { + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopBlocks(true).length, 0, + 'Clear empty workspace'); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopBlocks(true).length, 0); + }); + }); + + suite('getTopBlocks(ordered=false)', function() { + test('Empty workspace', function() { + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0); + }); + + test('Flat workspace one block', function() { + this.workspace.newBlock(''); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 1); + }); + + test('Flat workspace one block after dispose', function() { + var blockA = this.workspace.newBlock(''); + this.workspace.newBlock(''); + blockA.dispose(); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 1); + }); + + test('Flat workspace two blocks', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 2); + }); + + test('Clear empty workspace', function() { + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0); + }); + + test('Clear non-empty workspace', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.clear(); + chai.assert.equal(this.workspace.getTopBlocks(false).length, 0); + }); + }); + + suite('getAllBlocks', function() { + test('Empty workspace', function() { + chai.assert.equal(this.workspace.getAllBlocks(true).length, 0); + }); + + test('Flat workspace one block', function() { + this.workspace.newBlock(''); + chai.assert.equal(this.workspace.getAllBlocks(true).length, 1); + }); + + test('Flat workspace one block after dispose', function() { + var blockA = this.workspace.newBlock(''); + this.workspace.newBlock(''); + blockA.dispose(); + chai.assert.equal(this.workspace.getAllBlocks(true).length, 1); + }); + + test('Flat workspace two blocks', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + chai.assert.equal(this.workspace.getAllBlocks(true).length, 2); + }); + + test('Clear', function() { + this.workspace.clear(); + chai.assert.equal(this.workspace.getAllBlocks(true).length, 0, + 'Clear empty workspace'); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.clear(); + chai.assert.equal(this.workspace.getAllBlocks(true).length, 0); + }); + }); + + suite('remainingCapacity', function() { + setup(function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + }); + + test('No block limit', function() { + chai.assert.equal(this.workspace.remainingCapacity(), Infinity); + }); + + test('Under block limit', function() { + this.workspace.options.maxBlocks = 3; + chai.assert.equal(this.workspace.remainingCapacity(), 1); + this.workspace.options.maxBlocks = 4; + chai.assert.equal(this.workspace.remainingCapacity(), 2); + }); + + test('At block limit', function() { + this.workspace.options.maxBlocks = 2; + chai.assert.equal(this.workspace.remainingCapacity(), 0); + }); + + test('At block limit of 0 after clear', function() { + this.workspace.options.maxBlocks = 0; + this.workspace.clear(); + chai.assert.equal(this.workspace.remainingCapacity(), 0); + }); + + test('Over block limit', function() { + this.workspace.options.maxBlocks = 1; + chai.assert.equal(this.workspace.remainingCapacity(), -1); + }); + + test('Over block limit of 0', function() { + this.workspace.options.maxBlocks = 0; + chai.assert.equal(this.workspace.remainingCapacity(), -2); + }); + }); + + suite('remainingCapacityOfType', function() { + setup(function() { + this.workspace.newBlock('get_var_block'); + this.workspace.newBlock('get_var_block'); + this.workspace.options.maxInstances = {}; + }); + + test('No instance limit', function() { + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + Infinity); + }); + + test('Under instance limit', function() { + this.workspace.options.maxInstances['get_var_block'] = 3; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 1, 'With maxInstances limit 3'); + this.workspace.options.maxInstances['get_var_block'] = 4; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 2, 'With maxInstances limit 4'); + }); + + test('Under instance limit with multiple block types', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.options.maxInstances['get_var_block'] = 3; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 1, 'With maxInstances limit 3'); + this.workspace.options.maxInstances['get_var_block'] = 4; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 2, 'With maxInstances limit 4'); + }); + + test('At instance limit', function() { + this.workspace.options.maxInstances['get_var_block'] = 2; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 0, 'With maxInstances limit 2'); + }); + + test('At instance limit of 0 after clear', function() { + this.workspace.clear(); + this.workspace.options.maxInstances['get_var_block'] = 0; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 0); + }); + + test('At instance limit with multiple block types', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.options.maxInstances['get_var_block'] = 2; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 0, 'With maxInstances limit 2'); + }); + + test('At instance limit of 0 with multiple block types', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.options.maxInstances['get_var_block'] = 0; + this.workspace.clear(); + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + 0); + }); + + test('Over instance limit', function() { + this.workspace.options.maxInstances['get_var_block'] = 1; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + -1,'With maxInstances limit 1'); + }); + + test('Over instance limit of 0', function() { + this.workspace.options.maxInstances['get_var_block'] = 0; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + -2,'With maxInstances limit 0'); + }); + + test('Over instance limit with multiple block types', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.options.maxInstances['get_var_block'] = 1; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + -1,'With maxInstances limit 1'); + }); + + test('Over instance limit of 0 with multiple block types', function() { + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.newBlock(''); + this.workspace.options.maxInstances['get_var_block'] = 0; + chai.assert.equal(this.workspace.remainingCapacityOfType('get_var_block'), + -2,'With maxInstances limit 0'); + }); + }); + + suite('isCapacityAvailable', function() { + setup(function() { + this.workspace.newBlock('get_var_block'); + this.workspace.newBlock('get_var_block'); + this.workspace.options.maxInstances = {}; + }); + + test('Under block limit and no instance limit', function() { + this.workspace.options.maxBlocks = 3; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isTrue(this.workspace.isCapacityAvailable(typeCountsMap)); + }); + + test('At block limit and no instance limit', function() { + this.workspace.options.maxBlocks = 2; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap)); + }); + + test('Over block limit of 0 and no instance limit', function() { + this.workspace.options.maxBlocks = 0; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap)); + }); + + test('Over block limit but under instance limit', function() { + this.workspace.options.maxBlocks = 1; + this.workspace.options.maxInstances['get_var_block'] = 3; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap), + 'With maxBlocks limit 1 and maxInstances limit 3'); + }); + + test('Over block limit of 0 but under instance limit', function() { + this.workspace.options.maxBlocks = 0; + this.workspace.options.maxInstances['get_var_block'] = 3; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap), + 'With maxBlocks limit 0 and maxInstances limit 3'); + }); + + test('Over block limit but at instance limit', function() { + this.workspace.options.maxBlocks = 1; + this.workspace.options.maxInstances['get_var_block'] = 2; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap), + 'With maxBlocks limit 1 and maxInstances limit 2'); + }); + + test('Over block limit and over instance limit', function() { + this.workspace.options.maxBlocks = 1; + this.workspace.options.maxInstances['get_var_block'] = 1; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap), + 'With maxBlocks limit 1 and maxInstances limit 1'); + }); + + test('Over block limit of 0 and over instance limit', function() { + this.workspace.options.maxBlocks = 0; + this.workspace.options.maxInstances['get_var_block'] = 1; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap), + 'With maxBlocks limit 0 and maxInstances limit 1'); + }); + + test('Over block limit and over instance limit of 0', function() { + this.workspace.options.maxBlocks = 1; + this.workspace.options.maxInstances['get_var_block'] = 0; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap), + 'With maxBlocks limit 1 and maxInstances limit 0'); + }); + + test('Over block limit of 0 and over instance limit of 0', function() { + this.workspace.options.maxBlocks = 0; + this.workspace.options.maxInstances['get_var_block'] = 0; + var typeCountsMap = {'get_var_block': 1}; + chai.assert.isFalse(this.workspace.isCapacityAvailable(typeCountsMap)); + }); + }); + + suite('getById', function() { + setup(function() { + this.workspaceB = this.workspace.rendered ? + new Blockly.WorkspaceSvg(new Blockly.Options({})) : + new Blockly.Workspace(); + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspaceB); + }); + + test('Trivial', function() { + chai.assert.equal(Blockly.Workspace.getById( + this.workspace.id), this.workspace, 'Find workspace'); + chai.assert.equal(Blockly.Workspace.getById( + this.workspaceB.id), this.workspaceB, 'Find workspaceB'); + }); + + test('Null id', function() { + chai.assert.isNull(Blockly.Workspace.getById(null)); + }); + + test('Non-existent id', function() { + chai.assert.isNull(Blockly.Workspace.getById('badId')); + }); + + test('After dispose', function() { + this.workspaceB.dispose(); + chai.assert.isNull(Blockly.Workspace.getById(this.workspaceB.id)); + }); + }); + + suite('getBlockById', function() { + setup(function() { + this.blockA = this.workspace.newBlock(''); + this.blockB = this.workspace.newBlock(''); + this.workspaceB = this.workspace.rendered ? + new Blockly.WorkspaceSvg(new Blockly.Options({})) : + new Blockly.Workspace(); + }); + + teardown(function() { + workspaceTeardown.call(this, this.workspaceB); + }); + + test('Trivial', function() { + chai.assert.equal( + this.workspace.getBlockById(this.blockA.id),this.blockA); + chai.assert.equal( + this.workspace.getBlockById(this.blockB.id), this.blockB); + }); + + test('Null id', function() { + chai.assert.isNull(this.workspace.getBlockById(null)); + }); + + test('Non-existent id', function() { + chai.assert.isNull(this.workspace.getBlockById('badId')); + }); + + test('After dispose', function() { + this.blockA.dispose(); + chai.assert.isNull(this.workspace.getBlockById(this.blockA.id)); + chai.assert.equal( + this.workspace.getBlockById(this.blockB.id), this.blockB); + }); + + test('After clear', function() { + this.workspace.clear(); + chai.assert.isNull(this.workspace.getBlockById(this.blockA.id)); + chai.assert.isNull(this.workspace.getBlockById(this.blockB.id)); + }); + }); + + suite('Undo/Redo', function() { + + /** + * Assert that two nodes are equal. + * @param {!Element} actual the actual node. + * @param {!Element} expected the expected node. + */ + function assertNodesEqual(actual, expected) { + var actualString = '\n' + Blockly.Xml.domToPrettyText(actual) + '\n'; + var expectedString = '\n' + Blockly.Xml.domToPrettyText(expected) + '\n'; + + chai.assert.equal(actual.tagName, expected.tagName); + for (var i = 0, attr; (attr = expected.attributes[i]); i++) { + chai.assert.equal(actual.getAttribute(attr.name), attr.value, + `expected attribute ${attr.name} on ${actualString} to match ` + + `${expectedString}`); + } + chai.assert.equal(actual.childElementCount, expected.childElementCount, + `expected node ${actualString} to have the same children as node ` + + `${expectedString}`); + for (var i = 0; i < expected.childElementCount; i++) { + assertNodesEqual(actual.children[i], expected.children[i]); + } + } + + suite('Undo Delete', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "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() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + }); + + function testUndoDelete(xmlText) { + var xml = Blockly.Xml.textToDom(xmlText); + Blockly.Xml.domToBlock(xml, this.workspace); + this.workspace.getTopBlocks()[0].dispose(false); + this.workspace.undo(); + var newXml = Blockly.Xml.workspaceToDom(this.workspace); + assertNodesEqual(newXml.firstChild, xml); + } + + test('Stack', function() { + testUndoDelete.call(this, ''); + }); + + test('Row', function() { + testUndoDelete.call(this, ''); + }); + + test('Statement', function() { + testUndoDelete.call(this, ''); + }); + + test('Stack w/ child', function() { + testUndoDelete.call(this, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + }); + + test('Row w/ child', function() { + testUndoDelete.call(this, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + }); + + test('Statement w/ child', function() { + testUndoDelete.call(this, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + }); + + test('Stack w/ shadow', function() { + testUndoDelete.call(this, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + }); + + test('Row w/ shadow', function() { + testUndoDelete.call(this, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + }); + + test('Statement w/ shadow', function() { + testUndoDelete.call(this, + '' + + ' ' + + ' ' + + ' ' + + '' + ); + }); + }); + + suite('Undo Connect', function() { + + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "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() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + }); + + function testUndoConnect(xmlText, parentId, childId, func) { + var xml = Blockly.Xml.textToDom(xmlText); + Blockly.Xml.domToWorkspace(xml, this.workspace); + + var parent = this.workspace.getBlockById(parentId); + var child = this.workspace.getBlockById(childId); + func.call(this, parent, child); + this.workspace.undo(); + + var newXml = Blockly.Xml.workspaceToDom(this.workspace); + assertNodesEqual(newXml, xml); + } + + test('Stack', function() { + var xml = + '' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.nextConnection.connect(child.previousConnection); + }); + }); + + test('Row', function() { + var xml = + '' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.getInput('INPUT').connection.connect(child.outputConnection); + }); + }); + + test('Statement', function() { + var xml = + '' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.getInput('STATEMENT').connection + .connect(child.previousConnection); + }); + }); + + test('Stack w/ child', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.nextConnection.connect(child.previousConnection); + }); + }); + + test('Row w/ child', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.getInput('INPUT').connection.connect(child.outputConnection); + }); + }); + + test('Statement w/ child', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.getInput('STATEMENT').connection + .connect(child.previousConnection); + }); + }); + + test('Stack w/ shadow', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.nextConnection.connect(child.previousConnection); + }); + }); + + test('Row w/ shadow', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.getInput('INPUT').connection.connect(child.outputConnection); + }); + }); + + test('Statement w/ shadow', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + testUndoConnect.call(this, xml, 1, 2, (parent, child) => { + parent.getInput('STATEMENT').connection + .connect(child.previousConnection); + }); + }); + }); + + suite('Undo Disconnect', function() { + + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "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() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + }); + + function testUndoDisconnect(xmlText, childId) { + var xml = Blockly.Xml.textToDom(xmlText); + Blockly.Xml.domToWorkspace(xml, this.workspace); + + var child = this.workspace.getBlockById(childId); + if (child.outputConnection) { + child.outputConnection.disconnect(); + } else { + child.previousConnection.disconnect(); + } + this.workspace.undo(); + + var newXml = Blockly.Xml.workspaceToDom(this.workspace); + assertNodesEqual(newXml, xml); + } + + test('Stack', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + + test('Row', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + + test('Statement', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + + test('Stack w/ child', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + + test('Row w/ child', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + + test('Statement w/ child', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + + test('Stack w/ shadow', function() { + // TODO: For some reason on next connections shadows are + // serialized second. + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + chai.assert.equal(this.workspace.getAllBlocks().length, 2, + 'expected there to only be 2 blocks on the workspace ' + + '(check for shadows)'); + }); + + test('Row w/ shadow', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + chai.assert.equal(this.workspace.getAllBlocks().length, 2, + 'expected there to only be 2 blocks on the workspace ' + + '(check for shadows)'); + }); + + test('Statement w/ shadow', function() { + var xml = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + testUndoDisconnect.call(this, xml, 2); + }); + }); + + suite('Variables', function() { + function createTwoVarsDifferentTypes(workspace) { + workspace.createVariable('name1', 'type1', 'id1'); + workspace.createVariable('name2', 'type2', 'id2'); + } + + suite('createVariable', function() { + test('Undo only', function() { + createTwoVarsDifferentTypes(this.workspace); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + chai.assert.isNull(this.workspace.getVariableById('id2')); + + this.workspace.undo(); + chai.assert.isNull(this.workspace.getVariableById('id1')); + chai.assert.isNull(this.workspace.getVariableById('id2')); + }); + + test('Undo and redo', function() { + createTwoVarsDifferentTypes(this.workspace); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + chai.assert.isNull(this.workspace.getVariableById('id2')); + + this.workspace.undo(true); + + // Expect that variable 'id2' is recreated + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(); + this.workspace.undo(); + chai.assert.isNull(this.workspace.getVariableById('id1')); + chai.assert.isNull(this.workspace.getVariableById('id2')); + this.workspace.undo(true); + + // Expect that variable 'id1' is recreated + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + chai.assert.isNull(this.workspace.getVariableById('id2')); + }); + }); + + suite('deleteVariableById', function() { + test('Undo only no usages', function() { + createTwoVarsDifferentTypes(this.workspace); + this.workspace.deleteVariableById('id1'); + this.workspace.deleteVariableById('id2'); + + this.workspace.undo(); + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Undo only with usages', function() { + createTwoVarsDifferentTypes(this.workspace); + // Create blocks to refer to both of them. + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + this.workspace.deleteVariableById('id1'); + this.workspace.deleteVariableById('id2'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name2'); + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name2'); + assertBlockVarModelName(this.workspace, 1, 'name1'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Reference exists no usages', function() { + createTwoVarsDifferentTypes(this.workspace); + this.workspace.deleteVariableById('id1'); + this.workspace.deleteVariableById('id2'); + + this.workspace.undo(); + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(true); + // Expect that both variables are deleted + chai.assert.isNull(this.workspace.getVariableById('id1')); + chai.assert.isNull(this.workspace.getVariableById('id2')); + + this.workspace.undo(); + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(true); + // Expect that variable 'id2' is recreated + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Reference exists with usages', function() { + createTwoVarsDifferentTypes(this.workspace); + // Create blocks to refer to both of them. + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + this.workspace.deleteVariableById('id1'); + this.workspace.deleteVariableById('id2'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name2'); + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(true); + // Expect that both variables are deleted + chai.assert.equal(this.workspace.topBlocks_.length, 0); + chai.assert.isNull(this.workspace.getVariableById('id1')); + chai.assert.isNull(this.workspace.getVariableById('id2')); + + this.workspace.undo(); + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name2'); + assertBlockVarModelName(this.workspace, 1, 'name1'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(true); + // Expect that variable 'id2' is recreated + assertBlockVarModelName(this.workspace,0, 'name2'); + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Delete same variable twice no usages', function() { + this.workspace.createVariable('name1', 'type1', 'id1'); + this.workspace.deleteVariableById('id1'); + var workspace = this.workspace; + var warnings = captureWarnings(function() { + workspace.deleteVariableById('id1'); + }); + chai.assert.equal(warnings.length, 1, + 'Expected 1 warning for second deleteVariableById call.'); + + // Check the undoStack only recorded one delete event. + var undoStack = this.workspace.undoStack_; + chai.assert.equal(undoStack[undoStack.length - 1].type, 'var_delete'); + chai.assert.notEqual(undoStack[undoStack.length - 2].type, 'var_delete'); + + // Undo delete + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + + // Redo delete + this.workspace.undo(true); + chai.assert.isNull(this.workspace.getVariableById('id1')); + + // Redo delete, nothing should happen + this.workspace.undo(true); + chai.assert.isNull(this.workspace.getVariableById('id1')); + }); + + test('Delete same variable twice with usages', function() { + this.workspace.createVariable('name1', 'type1', 'id1'); + createVarBlocksNoEvents(this.workspace, ['id1']); + this.workspace.deleteVariableById('id1'); + var workspace = this.workspace; + var warnings = captureWarnings(function() { + workspace.deleteVariableById('id1'); + }); + chai.assert.equal(warnings.length, 1, + 'Expected 1 warning for second deleteVariableById call.'); + + // Check the undoStack only recorded one delete event. + var undoStack = this.workspace.undoStack_; + chai.assert.equal(undoStack[undoStack.length - 1].type, 'var_delete'); + chai.assert.equal(undoStack[undoStack.length - 2].type, 'delete'); + chai.assert.notEqual(undoStack[undoStack.length - 3].type, 'var_delete'); + + // Undo delete + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + + // Redo delete + this.workspace.undo(true); + chai.assert.equal(this.workspace.topBlocks_.length, 0); + chai.assert.isNull(this.workspace.getVariableById('id1')); + + // Redo delete, nothing should happen + this.workspace.undo(true); + chai.assert.equal(this.workspace.topBlocks_.length, 0); + chai.assert.isNull(this.workspace.getVariableById('id1')); + }); + }); + + suite('renameVariableById', function() { + setup(function() { + this.workspace.createVariable('name1', 'type1', 'id1'); + }); + + test('Reference exists no usages rename to name2', function() { + this.workspace.renameVariableById('id1', 'name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + + }); + + test('Reference exists with usages rename to name2', function() { + createVarBlocksNoEvents(this.workspace, ['id1']); + this.workspace.renameVariableById('id1', 'name2'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + + this.workspace.undo(true); + assertBlockVarModelName(this.workspace, 0, 'name2'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + }); + + test('Reference exists different capitalization no usages rename to Name1', function() { + this.workspace.renameVariableById('id1', 'Name1'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'Name1', 'type1', 'id1'); + }); + + test('Reference exists different capitalization with usages rename to Name1', function() { + createVarBlocksNoEvents(this.workspace, ['id1']); + this.workspace.renameVariableById('id1', 'Name1'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + + this.workspace.undo(true); + assertBlockVarModelName(this.workspace, 0, 'Name1'); + assertVariableValues(this.workspace, 'Name1', 'type1', 'id1'); + }); + + suite('Two variables rename overlap', function() { + test('Same type no usages rename variable with id1 to name2', function() { + this.workspace.createVariable('name2', 'type1', 'id2'); + this.workspace.renameVariableById('id1', 'name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + chai.assert.isNull(this.workspace.getVariableById('id1')); + }); + + test('Same type with usages rename variable with id1 to name2', function() { + this.workspace.createVariable('name2', 'type1', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + this.workspace.renameVariableById('id1', 'name2'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + chai.assert.isNull(this.workspace.getVariableById('id1')); + }); + + test('Same type different capitalization no usages rename variable with id1 to Name2', function() { + this.workspace.createVariable('name2', 'type1', 'id2'); + this.workspace.renameVariableById('id1', 'Name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'Name2', 'type1', 'id2'); + chai.assert.isNull(this.workspace.getVariable('name1')); + }); + + test('Same type different capitalization with usages rename variable with id1 to Name2', function() { + this.workspace.createVariable('name2', 'type1', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + this.workspace.renameVariableById('id1', 'Name2'); + + this.workspace.undo(); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type1', 'id2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'Name2', 'type1', 'id2'); + chai.assert.isNull(this.workspace.getVariableById('id1')); + assertBlockVarModelName(this.workspace, 0, 'Name2'); + assertBlockVarModelName(this.workspace, 1, 'Name2'); + }); + + test('Different type no usages rename variable with id1 to name2', function() { + this.workspace.createVariable('name2', 'type2', 'id2'); + this.workspace.renameVariableById('id1', 'name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Different type with usages rename variable with id1 to name2', function() { + this.workspace.createVariable('name2', 'type2', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + this.workspace.renameVariableById('id1', 'name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'name2', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertBlockVarModelName(this.workspace, 0, 'name2'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + }); + + test('Different type different capitalization no usages rename variable with id1 to Name2', function() { + this.workspace.createVariable('name2', 'type2', 'id2'); + this.workspace.renameVariableById('id1', 'Name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'Name2', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + }); + + test('Different type different capitalization with usages rename variable with id1 to Name2', function() { + this.workspace.createVariable('name2', 'type2', 'id2'); + createVarBlocksNoEvents(this.workspace, ['id1', 'id2']); + this.workspace.renameVariableById('id1', 'Name2'); + + this.workspace.undo(); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertBlockVarModelName(this.workspace, 0, 'name1'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + + this.workspace.undo(true); + assertVariableValues(this.workspace, 'Name2', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertBlockVarModelName(this.workspace, 0, 'Name2'); + assertBlockVarModelName(this.workspace, 1, 'name2'); + }); + }); + }); + }); + }); +} diff --git a/static/js/tests/mocha/xml_test.js b/static/js/tests/mocha/xml_test.js new file mode 100644 index 0000000..1c5ba47 --- /dev/null +++ b/static/js/tests/mocha/xml_test.js @@ -0,0 +1,816 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('XML', function() { + var assertSimpleFieldDom = function(fieldDom, name, text) { + chai.assert.equal(text, fieldDom.textContent); + chai.assert.equal(name, fieldDom.getAttribute('name')); + }; + var assertNonSerializingFieldDom = function(fieldDom) { + chai.assert.isUndefined(fieldDom.childNodes[0]); + }; + var assertNonVariableField = function(fieldDom, name, text) { + assertSimpleFieldDom(fieldDom, name, text); + chai.assert.isNull(fieldDom.getAttribute('id'), 'id'); + chai.assert.isNull(fieldDom.getAttribute('variabletype'), 'variabletype'); + }; + var assertVariableDomField = function(fieldDom, name, type, id, text) { + assertSimpleFieldDom(fieldDom, name, text); + chai.assert.equal(fieldDom.getAttribute('variabletype'), type); + chai.assert.equal(fieldDom.getAttribute('id'), id); + }; + var assertVariableDom = function(fieldDom, type, id, text) { + chai.assert.equal(fieldDom.getAttribute('type'), type); + chai.assert.equal(fieldDom.getAttribute('id'), id); + chai.assert.equal(fieldDom.textContent, text); + }; + setup(function() { + sharedTestSetup.call(this); + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "", + "args0": [] + }, + ]); + this.complexXmlText = [ + '', + ' ', + ' ', + ' ', + ' 10', + ' ', + ' ', + ' ', + ' ', + ' item', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' Hello', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ''].join('\n'); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + suite('textToDom', function() { + test('Basic', function() { + var dom = Blockly.Xml.textToDom(this.complexXmlText); + chai.assert.equal(dom.nodeName, 'xml', 'XML tag'); + chai.assert.equal(dom.getElementsByTagName('block').length, 6, 'Block tags'); + }); + }); + suite('blockToDom', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + 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]; + assertNonVariableField(resultFieldDom, 'ANGLE', '90'); + }); + 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]; + assertNonVariableField(resultFieldDom, 'CHECKBOX', 'TRUE'); + }); + 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]; + assertNonVariableField(resultFieldDom, 'COLOUR', '#000099'); + }); + 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]; + assertNonVariableField(resultFieldDom, 'DROPDOWN', 'A'); + }); + 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); + assertNonSerializingFieldDom(resultFieldDom); + }); + 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); + assertNonSerializingFieldDom(resultFieldDom); + }); + 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]; + assertNonVariableField(resultFieldDom, 'LABEL', 'default'); + }); + 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]; + assertNonVariableField(resultFieldDom, 'NUMBER', '97'); + }); + 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]; + assertNonVariableField(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' + } + ] + }]); + }); + 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]; + assertVariableDomField(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]; + assertVariableDomField(resultFieldDom, 'VAR', 'string', 'id1', 'name1'); + }); + test('Variable Default Case', function() { + createGenUidStubWithReturns('1'); + 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. + assertVariableDomField(resultFieldDom, 'VAR', null, '1', 'name1'); + }); + }); + }); + 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); + }); + teardown(function() { + workspaceTeardown.call(this, 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('variablesToDom', 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' + } + ] + }]); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('One Variable', function() { + createGenUidStubWithReturns('1'); + this.workspace.createVariable('name1'); + var resultDom = + Blockly.Xml.variablesToDom(this.workspace.getAllVariables()); + chai.assert.equal(resultDom.children.length, 1); + var resultVariableDom = resultDom.children[0]; + chai.assert.equal(resultVariableDom.textContent, 'name1'); + chai.assert.isNull(resultVariableDom.getAttribute('type')); + chai.assert.equal(resultVariableDom.getAttribute('id'), '1'); + }); + test('Two Variable one block', function() { + this.workspace.createVariable('name1', '', 'id1'); + this.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(this.workspace, 'field_variable_test_block'); + block.inputList[0].fieldRow[0].setValue('id1'); + Blockly.Events.enable(); + + var resultDom = Blockly.Xml.variablesToDom(this.workspace.getAllVariables()); + chai.assert.equal(resultDom.children.length, 2); + assertVariableDom(resultDom.children[0], null, 'id1', + 'name1'); + assertVariableDom(resultDom.children[1], 'type2', 'id2', + 'name2'); + }); + test('No variables', function() { + var resultDom = + Blockly.Xml.variablesToDom(this.workspace.getAllVariables()); + chai.assert.equal(resultDom.children.length, 0); + }); + }); + suite('domToText', function() { + test('Round tripping', function() { + var dom = Blockly.Xml.textToDom(this.complexXmlText); + var text = Blockly.Xml.domToText(dom); + chai.assert.equal(text.replace(/\s+/g, ''), + this.complexXmlText.replace(/\s+/g, ''), 'Round trip'); + }); + }); + suite('domToPrettyText', function() { + test('Round tripping', function() { + var dom = Blockly.Xml.textToDom(this.complexXmlText); + var text = Blockly.Xml.domToPrettyText(dom); + chai.assert.equal(text.replace(/\s+/g, ''), + this.complexXmlText.replace(/\s+/g, ''), 'Round trip'); + }); + }); + suite('domToBlock', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + 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" + } + ] + }]); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + suite('Dynamic Category Blocks', function() { + test('Untyped Variables', function() { + this.workspace.createVariable('name1', '', 'id1'); + var blocksArray = + Blockly.Variables.flyoutCategoryBlocks(this.workspace); + for (var i = 0, xml; (xml = blocksArray[i]); i++) { + Blockly.Xml.domToBlock(xml, this.workspace); + } + }); + test('Typed Variables', function() { + 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); + for (var i = 0, xml; (xml = blocksArray[i]); i++) { + Blockly.Xml.domToBlock(xml, this.workspace); + } + }); + }); + 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() { + this.workspace = Blockly.inject('blocklyDiv', {comments: true}); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + + 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() { + test('Pinned True', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + this.clock.runAll(); + 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.runAll(); + 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.runAll(); + chai.assert.isFalse(block.commentModel.pinned); + chai.assert.isNotNull(block.getCommentIcon()); + chai.assert.isFalse(block.getCommentIcon().isVisible()); + }); + }); + }); + }); + }); + suite('domToWorkspace', 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' + } + ] + }]); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('Backwards compatibility', function() { + createGenUidStubWithReturns('1'); + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, this.workspace); + chai.assert.equal(this.workspace.getAllBlocks(false).length, 1, 'Block count'); + assertVariableValues(this.workspace, 'name1', '', '1'); + }); + test('Variables at top', function() { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' name2' + + ' name3' + + ' ' + + ' ' + + ' name3' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, this.workspace); + chai.assert.equal(this.workspace.getAllBlocks(false).length, 1, 'Block count'); + assertVariableValues(this.workspace, 'name1', 'type1', 'id1'); + assertVariableValues(this.workspace, 'name2', 'type2', 'id2'); + assertVariableValues(this.workspace, 'name3', '', 'id3'); + }); + test('Variables at top duplicated variables tag', function() { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + chai.assert.throws(function() { + Blockly.Xml.domToWorkspace(dom, this.workspace); + }); + }); + test('Variables at top missing type', function() { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ' ' + + ' name3' + + ' ' + + ''); + chai.assert.throws(function() { + Blockly.Xml.domToWorkspace(dom, this.workspace); + }); + }); + test('Variables at top mismatch block type', function() { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ' ' + + ' name1' + + ' ' + + ''); + chai.assert.throws(function() { + Blockly.Xml.domToWorkspace(dom, this.workspace); + }); + }); + }); + suite('appendDomToWorkspace', function() { + setup(function() { + addBlockTypeToCleanup(this.sharedCleanup,'test_block'); + Blockly.Blocks['test_block'] = { + init: function() { + this.jsonInit({ + message0: 'test', + }); + } + }; + this.workspace = new Blockly.Workspace(); + }); + teardown(function() { + workspaceTeardown.call(this, this.workspace); + }); + test('Headless', function() { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + Blockly.Xml.appendDomToWorkspace(dom, this.workspace); + chai.assert.equal(this.workspace.getAllBlocks(false).length, 1, 'Block count'); + var newBlockIds = Blockly.Xml.appendDomToWorkspace(dom, this.workspace); + chai.assert.equal(this.workspace.getAllBlocks(false).length, 2, 'Block count'); + chai.assert.equal(newBlockIds.length, 1, 'Number of new block ids'); + }); + }); + suite('workspaceToDom -> domToWorkspace -> workspaceToDom', function() { + setup(function() { + var options = { + comments: true + }; + this.renderedWorkspace = Blockly.inject('blocklyDiv', options); + this.headlessWorkspace = + new Blockly.Workspace(new Blockly.Options(options)); + }); + teardown(function() { + workspaceTeardown.call(this, this.renderedWorkspace); + workspaceTeardown.call(this, this.headlessWorkspace); + }); + var assertRoundTrip = function(originWs, targetWs) { + var originXml = Blockly.Xml.workspaceToDom(originWs); + Blockly.Xml.domToWorkspace(originXml, targetWs); + var targetXml = Blockly.Xml.workspaceToDom(targetWs); + + var expectedXmlText = Blockly.Xml.domToText(originXml); + var actualXmlText = Blockly.Xml.domToText(targetXml); + + chai.assert.equal(actualXmlText, expectedXmlText); + }; + suite('Rendered -> XML -> Headless -> XML', function() { + 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); + assertRoundTrip(this.renderedWorkspace, this.headlessWorkspace); + }); + }); + suite('Headless -> XML -> Rendered -> XML', function() { + 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.clock.runAll(); + + assertRoundTrip(this.headlessWorkspace, this.renderedWorkspace); + }); + }); + }); + suite('generateVariableFieldDom', function() { + test('Case Sensitive', function() { + var varId = 'testId'; + var type = 'testType'; + var name = 'testName'; + + var mockVariableModel = { + type: type, + name: name, + getId: function() { + return varId; + } + }; + + var generatedXml = Blockly.Xml.domToText( + Blockly.Variables.generateVariableFieldDom(mockVariableModel)); + var expectedXml = + '' + name + ''; + chai.assert.equal(generatedXml, expectedXml); + }); + }); +}); diff --git a/static/js/tests/mocha/zoom_controls_test.js b/static/js/tests/mocha/zoom_controls_test.js new file mode 100644 index 0000000..e8180bb --- /dev/null +++ b/static/js/tests/mocha/zoom_controls_test.js @@ -0,0 +1,58 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite("Zoom Controls", function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = Blockly.inject('blocklyDiv', + {'zoom': {'controls': true}}); + this.zoomControls = this.workspace.zoomControls_; + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite("Events", function() { + function closeToMatcher(expectedValue, delta) { + return sinon.match(function(value) { + return Math.abs(value - expectedValue) <= delta; + }); + } + test("Zoom in", function() { + simulateClick(this.zoomControls.zoomInGroup_); + + assertEventFired( + this.eventsFireStub, Blockly.Events.Click, + {targetType: 'zoom_controls'}, this.workspace.id, null); + assertEventNotFired( + this.eventsFireStub, Blockly.Events.Click, + {targetType: 'workspace'}); + chai.assert.closeTo(this.workspace.getScale(), 1.2, 0.05); + }); + test("Zoom out", function() { + simulateClick(this.zoomControls.zoomOutGroup_); + + assertEventFired( + this.eventsFireStub, Blockly.Events.Click, + {targetType: 'zoom_controls'}, this.workspace.id, null); + assertEventNotFired( + this.eventsFireStub, Blockly.Events.Click, + {targetType: 'workspace'}); + chai.assert.closeTo(this.workspace.getScale(), 0.8, 0.05); + }); + test("Reset zoom", function() { + simulateClick(this.zoomControls.zoomResetGroup_); + + assertEventFired( + this.eventsFireStub, Blockly.Events.Click, + {targetType: 'zoom_controls'}, this.workspace.id, null); + assertEventNotFired( + this.eventsFireStub, Blockly.Events.Click, + {targetType: 'workspace'}); + chai.assert.equal(this.workspace.getScale(), 1); + }); + }); +}); diff --git a/static/js/tests/msg/ar.js b/static/js/tests/msg/ar.js new file mode 100644 index 0000000..952198b --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/be-tarask.js b/static/js/tests/msg/be-tarask.js new file mode 100644 index 0000000..5c8d722 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/br.js b/static/js/tests/msg/br.js new file mode 100644 index 0000000..321e28e --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ca.js b/static/js/tests/msg/ca.js new file mode 100644 index 0000000..2b6d973 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/cs.js b/static/js/tests/msg/cs.js new file mode 100644 index 0000000..1026511 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/da.js b/static/js/tests/msg/da.js new file mode 100644 index 0000000..089450b --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/de.js b/static/js/tests/msg/de.js new file mode 100644 index 0000000..422f918 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/el.js b/static/js/tests/msg/el.js new file mode 100644 index 0000000..c63b7a6 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/en.js b/static/js/tests/msg/en.js new file mode 100644 index 0000000..d853826 --- /dev/null +++ b/static/js/tests/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 public link. We\'ll delete them if not used for a year. They are not associated with your account and handled as per Google\'s Privacy Policy. Please be sure not to include any private information.:\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/static/js/tests/msg/es.js b/static/js/tests/msg/es.js new file mode 100644 index 0000000..24358e3 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/et.js b/static/js/tests/msg/et.js new file mode 100644 index 0000000..320c391 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/fa.js b/static/js/tests/msg/fa.js new file mode 100644 index 0000000..96dd966 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/fr.js b/static/js/tests/msg/fr.js new file mode 100644 index 0000000..6018113 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/he.js b/static/js/tests/msg/he.js new file mode 100644 index 0000000..dc28266 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/hrx.js b/static/js/tests/msg/hrx.js new file mode 100644 index 0000000..ca0dea3 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/hu.js b/static/js/tests/msg/hu.js new file mode 100644 index 0000000..eee1868 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ia.js b/static/js/tests/msg/ia.js new file mode 100644 index 0000000..5938458 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/is.js b/static/js/tests/msg/is.js new file mode 100644 index 0000000..fa5c40d --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/it.js b/static/js/tests/msg/it.js new file mode 100644 index 0000000..cd69b66 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ja.js b/static/js/tests/msg/ja.js new file mode 100644 index 0000000..6d50419 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/kab.js b/static/js/tests/msg/kab.js new file mode 100644 index 0000000..648ff7f --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ko.js b/static/js/tests/msg/ko.js new file mode 100644 index 0000000..990cb6f --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/mk.js b/static/js/tests/msg/mk.js new file mode 100644 index 0000000..cc344a6 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ms.js b/static/js/tests/msg/ms.js new file mode 100644 index 0000000..87ee8de --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/nb.js b/static/js/tests/msg/nb.js new file mode 100644 index 0000000..60ac039 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/nl.js b/static/js/tests/msg/nl.js new file mode 100644 index 0000000..339a5e8 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/oc.js b/static/js/tests/msg/oc.js new file mode 100644 index 0000000..c184ac8 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/pl.js b/static/js/tests/msg/pl.js new file mode 100644 index 0000000..83bb05d --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/pms.js b/static/js/tests/msg/pms.js new file mode 100644 index 0000000..a7704f7 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/pt-br.js b/static/js/tests/msg/pt-br.js new file mode 100644 index 0000000..9b18d63 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ro.js b/static/js/tests/msg/ro.js new file mode 100644 index 0000000..cd3de11 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ru.js b/static/js/tests/msg/ru.js new file mode 100644 index 0000000..389e905 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/sc.js b/static/js/tests/msg/sc.js new file mode 100644 index 0000000..82f94d6 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/sk.js b/static/js/tests/msg/sk.js new file mode 100644 index 0000000..3917df2 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/sr.js b/static/js/tests/msg/sr.js new file mode 100644 index 0000000..f9a026c --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/sv.js b/static/js/tests/msg/sv.js new file mode 100644 index 0000000..4134a4c --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/ta.js b/static/js/tests/msg/ta.js new file mode 100644 index 0000000..ff472e2 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/th.js b/static/js/tests/msg/th.js new file mode 100644 index 0000000..1ac3624 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/tlh.js b/static/js/tests/msg/tlh.js new file mode 100644 index 0000000..8d0c056 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/tr.js b/static/js/tests/msg/tr.js new file mode 100644 index 0000000..1448300 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/uk.js b/static/js/tests/msg/uk.js new file mode 100644 index 0000000..6b34627 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/vi.js b/static/js/tests/msg/vi.js new file mode 100644 index 0000000..952d024 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/zh-hans.js b/static/js/tests/msg/zh-hans.js new file mode 100644 index 0000000..abf8a65 --- /dev/null +++ b/static/js/tests/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/static/js/tests/msg/zh-hant.js b/static/js/tests/msg/zh-hant.js new file mode 100644 index 0000000..48a8b52 --- /dev/null +++ b/static/js/tests/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/static/js/tests/multi_playground.html b/static/js/tests/multi_playground.html new file mode 100644 index 0000000..f9d2686 --- /dev/null +++ b/static/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/static/js/tests/node/.eslintrc.json b/static/js/tests/node/.eslintrc.json new file mode 100644 index 0000000..5021561 --- /dev/null +++ b/static/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/static/js/tests/node/.mocharc.js b/static/js/tests/node/.mocharc.js new file mode 100644 index 0000000..0928b25 --- /dev/null +++ b/static/js/tests/node/.mocharc.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + ui: 'tdd', + reporter: 'landing' +}; diff --git a/static/js/tests/node/run_node_test.js b/static/js/tests/node/run_node_test.js new file mode 100644 index 0000000..930d83a --- /dev/null +++ b/static/js/tests/node/run_node_test.js @@ -0,0 +1,57 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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/static/js/tests/playground.html b/static/js/tests/playground.html new file mode 100644 index 0000000..3445811 --- /dev/null +++ b/static/js/tests/playground.html @@ -0,0 +1,1172 @@ + + + + +Blockly Playground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    Blockly Playground

    + +

    Show + - Hide + - Advanced

    + +
    + + +
    +

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

    + +

    + Stress test:   + + +

    +
      +
    • + + +
    • +
    • + + +
    • +
    + + + + + + + + + + + + + + diff --git a/static/js/tests/playgrounds/advanced_playground.html b/static/js/tests/playgrounds/advanced_playground.html new file mode 100644 index 0000000..b142a6a --- /dev/null +++ b/static/js/tests/playgrounds/advanced_playground.html @@ -0,0 +1,225 @@ + + + + +Advanced Blockly Playground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/static/js/tests/playgrounds/iframe.html b/static/js/tests/playgrounds/iframe.html new file mode 100644 index 0000000..9c57fbf --- /dev/null +++ b/static/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/static/js/tests/rendering/zelos/pxtblockly.html b/static/js/tests/rendering/zelos/pxtblockly.html new file mode 100644 index 0000000..d3aa9df --- /dev/null +++ b/static/js/tests/rendering/zelos/pxtblockly.html @@ -0,0 +1,66 @@ + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/static/js/tests/rendering/zelos/pxtblockly/index.html b/static/js/tests/rendering/zelos/pxtblockly/index.html new file mode 100644 index 0000000..6a53da0 --- /dev/null +++ b/static/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/static/js/tests/rendering/zelos/pxtblockly/pxtblockly.html b/static/js/tests/rendering/zelos/pxtblockly/pxtblockly.html new file mode 100644 index 0000000..8ee2e95 --- /dev/null +++ b/static/js/tests/rendering/zelos/pxtblockly/pxtblockly.html @@ -0,0 +1,68 @@ + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/static/js/tests/rendering/zelos/pxtblockly/zelos.html b/static/js/tests/rendering/zelos/pxtblockly/zelos.html new file mode 100644 index 0000000..4568ba2 --- /dev/null +++ b/static/js/tests/rendering/zelos/pxtblockly/zelos.html @@ -0,0 +1,79 @@ + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/static/js/tests/rendering/zelos/scratchblocks/index.html b/static/js/tests/rendering/zelos/scratchblocks/index.html new file mode 100644 index 0000000..9814d5e --- /dev/null +++ b/static/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/static/js/tests/rendering/zelos/scratchblocks/scratchblocks.html b/static/js/tests/rendering/zelos/scratchblocks/scratchblocks.html new file mode 100644 index 0000000..8011230 --- /dev/null +++ b/static/js/tests/rendering/zelos/scratchblocks/scratchblocks.html @@ -0,0 +1,70 @@ + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/static/js/tests/rendering/zelos/scratchblocks/zelos.html b/static/js/tests/rendering/zelos/scratchblocks/zelos.html new file mode 100644 index 0000000..877c4f4 --- /dev/null +++ b/static/js/tests/rendering/zelos/scratchblocks/zelos.html @@ -0,0 +1,105 @@ + + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/static/js/tests/rendering/zelos/zelos.html b/static/js/tests/rendering/zelos/zelos.html new file mode 100644 index 0000000..13b6f06 --- /dev/null +++ b/static/js/tests/rendering/zelos/zelos.html @@ -0,0 +1,79 @@ + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/static/js/tests/run_all_tests.sh b/static/js/tests/run_all_tests.sh new file mode 100644 index 0000000..2ab36c2 --- /dev/null +++ b/static/js/tests/run_all_tests.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +if [ ! -z $CI ]; 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' + +gh_actions_fold () { + local startOrEnd=$1 # Either "start" or "end" + + if [ ! -z $CI ]; then + echo "::$startOrEnd::" + 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" + gh_actions_fold group + $command + local test_result=$? + gh_actions_fold endgroup + 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 the closure compiler. +run_test_command "compile" "npm run build" + +# Run the closure compiler ensuring there are no compiler warnings / errors. +run_test_command "compile:warnings" "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" + +# Run Mocha tests inside a browser. +run_test_command "mocha" "node tests/mocha/run_mocha_tests_in_browser.js" + +# Run generator tests inside a browser and check the results. +run_test_command "generators" "tests/scripts/run_generators.sh" + +# Run Node tests. +run_test_command "node" "./node_modules/.bin/mocha tests/node --config tests/node/.mocharc.js" + +# # 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/static/js/tests/scripts/check_metadata.sh b/static/js/tests/scripts/check_metadata.sh new file mode 100644 index 0000000..a74bb0a --- /dev/null +++ b/static/js/tests/scripts/check_metadata.sh @@ -0,0 +1,85 @@ +#!/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 +# Q2 2019 2.20190722.0 812688 +# Q3 2019 3.20191014.0 538781 +# Q4 2019 3.20200123.0 609855 +# Q1 2020 3.20200402.0 619341 +# Q2 2020 3.20200625.0 621811 +# Q3 2020 3.20200924.0 641216 +blockly_size_expected=641216 + +# Size of blocks_compressed.js +# Q2 2019 2.20190722.0 75618 +# Q3 2019 3.20191014.0 76455 +# Q4 2019 3.20200123.0 75629 +# Q1 2020 3.20200402.0 75805 +# Q2 2020 3.20200625.0 76360 +# Q3 2020 3.20200924.0 76429 +blocks_size_expected=76429 + +# Size of blockly_compressed.js.gz +# Q2 2019 2.20190722.0 180925 +# Q3 2019 3.20191014.0 119064 +# Q4 2019 3.20200123.0 131897 +# Q1 2020 3.20200402.0 134133 +# Q2 2020 3.20200625.0 135181 +# Q3 2020 3.20200924.0 138003 +blockly_gz_size_expected=138003 + +# Size of blocks_compressed.js.gz +# Q2 2019 2.20190722.0 14552 +# Q3 2019 3.20191014.0 15064 +# Q4 2019 3.20200123.0 14897 +# Q1 2020 3.20200402.0 14966 +# Q2 2020 3.20200625.0 15195 +# Q3 2020 3.20200924.0 15231 +blocks_gz_size_expected=15231 + +# 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 buildCompressed +gulp buildBlocks + +# 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/static/js/tests/scripts/compile_typings.sh b/static/js/tests/scripts/compile_typings.sh new file mode 100644 index 0000000..ee16beb --- /dev/null +++ b/static/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/static/js/tests/scripts/run_generators.sh b/static/js/tests/scripts/run_generators.sh new file mode 100644 index 0000000..9d556ac --- /dev/null +++ b/static/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/static/js/tests/scripts/selenium-config.js b/static/js/tests/scripts/selenium-config.js new file mode 100644 index 0000000..cf6adc1 --- /dev/null +++ b/static/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: '87.0.4280.20', + 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/static/js/tests/scripts/setup_linux_env.sh b/static/js/tests/scripts/setup_linux_env.sh new file mode 100644 index 0000000..3a24ac7 --- /dev/null +++ b/static/js/tests/scripts/setup_linux_env.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +if [ "${RUNNER_OS}" == "Linux" ] + then + Xvfb :99 & + export DISPLAY=:99 & + npm run test:prepare > /dev/null & +fi diff --git a/static/js/tests/scripts/setup_osx_env.sh b/static/js/tests/scripts/setup_osx_env.sh new file mode 100644 index 0000000..5a70922 --- /dev/null +++ b/static/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/static/js/tests/themes/test_themes.js b/static/js/tests/themes/test_themes.js new file mode 100644 index 0000000..30792ae --- /dev/null +++ b/static/js/tests/themes/test_themes.js @@ -0,0 +1,64 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +goog.provide('Blockly.TestThemes'); + + +/** + * A theme with classic colours but enables start hats. + */ +Blockly.Themes.TestHats = Blockly.Theme.defineTheme('testhats', { + 'base': Blockly.Themes.Classic +}); +Blockly.Themes.TestHats.setStartHats(true); + +/** + * A theme with classic colours but a different font. + */ +Blockly.Themes.TestFont = Blockly.Theme.defineTheme('testfont', { + 'base': Blockly.Themes.Classic +}); +Blockly.Themes.TestFont.setFontStyle({ + 'family': '"Times New Roman", Times, serif', + 'weight': null, // Use default font-weight + 'size': 16 +}); + +/** + * Holds the test theme name to Theme instance mapping. + * @type {!Object} + * @private + */ +Blockly.Themes.testThemes_ = { + 'Test Hats': Blockly.Themes.TestHats, + 'Test Font': Blockly.Themes.TestFont +}; + +/** + * Get a test theme by name. + * @param {string} value The theme name. + * @return {Blockly.Theme} A theme object or undefined if one doesn't exist. + * @package + */ +function getTestTheme(value) { + return Blockly.Themes.testThemes_[value]; +} + +/** + * Populate the theme changer dropdown to list the set of test themes. + * @package + */ +function populateTestThemes() { + var themeChanger = document.getElementById('themeChanger'); + var keys = Object.keys(Blockly.Themes.testThemes_); + for (var i = 0, key; (key = keys[i]); i++) { + var option = document.createElement('option'); + option.setAttribute('value', key); + option.textContent = key; + themeChanger.appendChild(option); + } +} diff --git a/static/js/tests/xml/README.txt b/static/js/tests/xml/README.txt new file mode 100644 index 0000000..8fe34d8 --- /dev/null +++ b/static/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/static/js/tests/xml/blockly.xsd b/static/js/tests/xml/blockly.xsd new file mode 100644 index 0000000..67562c4 --- /dev/null +++ b/static/js/tests/xml/blockly.xsd @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/js/tests/xml/invalid.xml b/static/js/tests/xml/invalid.xml new file mode 100644 index 0000000..5debaaf --- /dev/null +++ b/static/js/tests/xml/invalid.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/js/tests/xml/toolbox.xml b/static/js/tests/xml/toolbox.xml new file mode 100644 index 0000000..6bd524a --- /dev/null +++ b/static/js/tests/xml/toolbox.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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/static/js/typings/README.md b/static/js/typings/README.md new file mode 100644 index 0000000..df9268c --- /dev/null +++ b/static/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/static/js/typings/blockly.d.ts b/static/js/typings/blockly.d.ts new file mode 100644 index 0000000..d6da61d --- /dev/null +++ b/static/js/typings/blockly.d.ts @@ -0,0 +1,21951 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @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; + maxInstances?: {[type: string]: number;}; + 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; + pinch?: boolean; + }; + renderer?: string; + parentWorkspace?: Blockly.WorkspaceSvg; + } + + interface BlocklyThemeOptions { + base?: string; + blockStyles?: {[blocks: string]: Blockly.Theme.BlockStyle;}; + categoryStyles?: {[category: string]: Blockly.Theme.CategoryStyle;}; + componentStyles?: {[component: string]: any;}; + fontStyle?: Blockly.Theme.FontStyle; + startHats?: boolean; + } + + /** + * 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.utils { + interface Metrics { + viewHeight: number; + viewWidth: number; + contentHeight: number; + contentWidth: number; + viewTop: number; + viewLeft: number; + contentTop: number; + contentLeft: number; + absoluteTop: number; + absoluteLeft: number; + svgHeight?: number; + svgWidth?: number; + toolboxWidth?: number; + toolboxHeight?: number; + flyoutWidth?: number; + flyoutHeight?: number; + toolboxPosition?: number; + } +} + + +declare module Blockly { + + class Block extends Block__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Block__Class implements Blockly.IASTNodeLocation { + + /** + * 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 + * @implements {Blockly.IASTNodeLocation} + * @throws When the prototypeName is not valid or 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 {!Blockly.Tooltip.TipInfo} */ + tooltip: Blockly.Tooltip.TipInfo; + + /** @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 {?boolean} */ + rendered: boolean; + + /** + * A count of statement inputs on the block. + * @type {number} + * @package + */ + statementInputCount: number; + + /** @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. The parent + * block is either the block connected to the previous connection (for a statement + * block) or the block connected to the output connection (for a value block). + * @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; + + /** + * Returns the block connected to the previous connection. + * @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. + */ + 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; + + /** + * Sets the tooltip for this block. + * @param {!Blockly.Tooltip.TipInfo} newTip The text for the tooltip, a function + * that returns the text for the tooltip, or a parent object whose tooltip + * will be used. To not display a tooltip pass the empty string. + */ + setTooltip(newTip: Blockly.Tooltip.TipInfo): void; + + /** + * Returns the tooltip text for this block. + * @returns {!string} The tooltip text for this block. + */ + getTooltip(): string; + + /** + * 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 and not 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. + */ + 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 of the given field. + * @param {string} name The name of the field. + * @return {*} Value of the field or null if field does not exist. + */ + getFieldValue(name: string): any; + + /** + * Sets the value of the given field for this block. + * @param {*} newValue The value to set. + * @param {!string} name The name of the field to set the value of. + */ + setFieldValue(newValue: any, 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; + + /** + * 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 an error if input is not present. + * @return {boolean} True if operation succeeds, false if input is not present and opt_quiet is true + * @throws {Error} if the input is not present and opt_quiet is not true. + */ + removeInput(name: string, opt_quiet?: boolean): boolean; + + /** + * 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 + } + + /** + * The language-neutral id given to the collapsed input. + * @const {string} + */ + var COLLAPSED_INPUT_NAME: any /*missing*/; + + /** + * The language-neutral id given to the collapsed field. + * @const {string} + */ + var COLLAPSED_FIELD_NAME: any /*missing*/; +} + + +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 { + + class BlockSvg extends BlockSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockSvg__Class extends Blockly.Block__Class implements Blockly.IASTNodeLocationSvg, Blockly.IBoundedElement, Blockly.ICopyable { + + /** + * 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} + * @implements {Blockly.IASTNodeLocationSvg} + * @implements {Blockly.IBoundedElement} + * @implements {Blockly.ICopyable} + * @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; + + /** + * Get the secondary colour of a block. + * @return {?string} #RRGGBB string. + */ + getColourSecondary(): string; + + /** + * Get the tertiary colour of a block. + * @return {?string} #RRGGBB string. + */ + getColourTertiary(): string; + + /** + * Get the shadow colour of a block. + * @return {?string} #RRGGBB string. + * @deprecated Use style.colourSecondary. (2020 January 21) + */ + getColourShadow(): string; + + /** + * Get the border colour(s) of a block. + * @return {{colourDark, colourLight, colourBorder}} An object containing + * colour values for the border(s) of the block. If the block is using a + * style the colourBorder will be defined and equal to the tertiary colour + * of the style (#RRGGBB string). Otherwise the colourDark and colourLight + * attributes will be defined (#RRGGBB strings). + * @deprecated Use style.colourTertiary. (2020 January 21) + */ + getColourBorder(): { colourDark: any /*missing*/; colourLight: any /*missing*/; colourBorder: any /*missing*/ }; + + /** + * 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-rendered. + */ + 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 {!SVGGElement} The root SVG node (probably a group). + */ + getSvgRoot(): SVGGElement; + + /** + * 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; + + /** + * Encode a block for copying. + * @return {?Blockly.ICopyable.CopyData} Copy metadata, or null if the block is + * an insertion marker. + * @package + */ + toCopyData(): Blockly.ICopyable.CopyData; + + /** + * 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 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. + * @return {boolean} True if operation succeeds, false if input is not present and opt_quiet is true + * @throws {Error} if the input is not present and + * opt_quiet is not true. + */ + removeInput(name: string, opt_quiet?: boolean): boolean; + + /** + * 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; + + /** + * 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; + + /** + * Redraw any attached marker or cursor svgs if needed. + * @protected + */ + updateMarkers_(): 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 + */ + fadeForReplacement(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.ICopyable} + */ + var selected: Blockly.ICopyable; + + /** + * All of the connections on blocks that are currently being dragged. + * @type {!Array.} + * @package + */ + var draggingConnections: Blockly.Connection[]; + + /** + * Container element to render the WidgetDiv, DropDownDiv and Tooltip. + * @type {?Element} + * @package + */ + var parentContainer: Element; + + /** + * 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 {!Blockly.utils.Size} Contains width and height properties. + */ + function svgSize(svg: SVGElement): Blockly.utils.Size; + + /** + * 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 {!KeyboardEvent} e Key down event. + * @package + */ + function onKeyDown(e: KeyboardEvent): void; + + /** + * Delete the given block. + * @param {!Blockly.BlockSvg} selected The block to delete. + * @package + */ + function deleteBlock(selected: Blockly.BlockSvg): void; + + /** + * Copy a block or workspace comment onto the local clipboard. + * @param {!Blockly.ICopyable} toCopy Block or Workspace Comment to be copied. + * @package + */ + function copy(toCopy: Blockly.ICopyable): void; + + /** + * Paste a block or workspace comment on to the main workspace. + * @return {boolean} True if the paste was successful, false otherwise. + * @package + */ + function paste(): boolean; + + /** + * Duplicate this block and its children, or a workspace comment. + * @param {!Blockly.ICopyable} toDuplicate Block or Workspace Comment to be + * copied. + * @package + */ + function duplicate(toDuplicate: Blockly.ICopyable): 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; + + /** + * Set the parent container. This is the container element that the WidgetDiv, + * DropDownDiv, and Tooltip are rendered into the first time `Blockly.inject` + * is called. + * This method is a NOP if called after the first ``Blockly.inject``. + * @param {!Element} container The container element. + */ + function setParentContainer(container: Element): 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 implements Blockly.IBubble { + + /** + * 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. + * @implements {Blockly.IBubble} + * @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; + + /** + * Update the style of this bubble when it is dragged over a delete area. + * @param {boolean} _enable True if the bubble is about to be deleted, false + * otherwise. + */ + setDeleteStyle(_enable: boolean): void; + + /** + * 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*/; + + /** + * Create the text for a non editable bubble. + * @param {string} text The text to display. + * @return {!SVGTextElement} The top-level node of the text. + * @package + */ + function textToDom(text: string): SVGTextElement; + + /** + * Creates a bubble that can not be edited. + * @param {!SVGTextElement} paragraphElement The text element for the non editable bubble. + * @param {!Blockly.BlockSvg} block The block that the bubble is attached to. + * @param {!Blockly.utils.Coordinate} iconXY The coordinate of the icon. + * @return {!Blockly.Bubble} The non editable bubble. + * @package + */ + function createNonEditableBubble(paragraphElement: SVGTextElement, block: Blockly.BlockSvg, iconXY: Blockly.utils.Coordinate): Blockly.Bubble; +} + + +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.IBubble} bubble The item on the bubble canvas to drag. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. + * @constructor + */ + constructor(bubble: Blockly.IBubble, 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); + + /** + * Draw the comment icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * 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; + + /** + * 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 implements Blockly.IASTNodeLocationWithBlock { + + /** + * Class for a connection between blocks. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @constructor + * @implements {Blockly.IASTNodeLocationWithBlock} + */ + 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + 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 + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + checkConnection(target: Blockly.Connection): void; + + /** + * Get the workspace's connection type checker object. + * @return {!Blockly.IConnectionChecker} The connection type checker for the + * source block's workspace. + * @package + */ + getConnectionChecker(): Blockly.IConnectionChecker; + + /** + * 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + 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. + * @deprecated July 2020. Will be deleted July 2021. Use the workspace's + * connectionChecker instead. + */ + 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[]; + + /** + * Changes the connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + */ + setShadowDom(shadow: Element): void; + + /** + * Returns the xml representation of the 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 ConnectionChecker extends ConnectionChecker__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ConnectionChecker__Class implements Blockly.IConnectionChecker { + + /** + * Class for connection type checking logic. + * @implements {Blockly.IConnectionChecker} + * @constructor + */ + constructor(); + + /** + * Check whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {boolean} Whether the connection is legal. + * @public + */ + canConnect(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): boolean; + + /** + * Checks whether the current connection can connect with the target + * connection, and return an error code if there are problems. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @public + */ + canConnectWithReason(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): number; + + /** + * Helper method that translates a connection error code into a string. + * @param {number} errorCode The error code. + * @param {Blockly.Connection} a One of the two connections being checked. + * @param {Blockly.Connection} b The second of the two connections being + * checked. + * @return {string} A developer-readable error string. + * @public + */ + getErrorMessage(errorCode: number, a: Blockly.Connection, b: Blockly.Connection): string; + + /** + * Check that connecting the given connections is safe, meaning that it would + * not break any of Blockly's basic assumptions (e.g. no self connections). + * @param {Blockly.Connection} a The first of the connections to check. + * @param {Blockly.Connection} b The second of the connections to check. + * @return {number} An enum with the reason this connection is safe or unsafe. + * @public + */ + doSafetyChecks(a: Blockly.Connection, b: Blockly.Connection): number; + + /** + * Check whether this connection is compatible with another connection with + * respect to the value type system. E.g. square_root("Hello") is not + * compatible. + * @param {!Blockly.Connection} a Connection to compare. + * @param {!Blockly.Connection} b Connection to compare against. + * @return {boolean} True if the connections share a type. + * @public + */ + doTypeChecks(a: Blockly.Connection, b: Blockly.Connection): boolean; + + /** + * Check whether this connection can be made by dragging. + * @param {!Blockly.RenderedConnection} a Connection to compare. + * @param {!Blockly.RenderedConnection} b Connection to compare against. + * @param {number} distance The maximum allowable distance between connections. + * @return {boolean} True if the connection is allowed during a drag. + * @public + */ + doDragChecks(a: Blockly.RenderedConnection, b: Blockly.RenderedConnection, distance: number): boolean; + + /** + * Helper function for drag checking. + * @param {!Blockly.Connection} a The connection to check, which must be a + * statement input or next connection. + * @param {!Blockly.Connection} b A nearby connection to check, which + * must be a previous connection. + * @return {boolean} True if the connection is allowed, false otherwise. + * @protected + */ + canConnectToPrevious_(a: Blockly.Connection, b: Blockly.Connection): boolean; + } + +} + + +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. + * @param {!Blockly.IConnectionChecker} checker The workspace's + * connection type checker, used to decide if connections are valid during a + * drag. + * @constructor + */ + constructor(checker: Blockly.IConnectionChecker); + + /** + * 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. + * @param {!Blockly.IConnectionChecker} checker The workspace's + * connection checker, used to decide if connections are valid during a drag. + * @return {!Array.} Array of databases. + */ + function init(checker: Blockly.IConnectionChecker): 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*/; + + /** + * 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; + + /** + * Dispose of the menu. + */ + function dispose(): 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 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.ContextMenuItems { + + /** Option to undo previous action. */ + function registerUndo(): void; + + /** Option to redo previous action. */ + function registerRedo(): void; + + /** Option to clean up blocks. */ + function registerCleanup(): void; + + /** Option to collapse all blocks. */ + function registerCollapse(): void; + + /** Option to expand all blocks. */ + function registerExpand(): void; + + /** Option to delete all blocks. */ + function registerDeleteAll(): void; + + /** Option to duplicate a block. */ + function registerDuplicate(): void; + + /** Option to add or remove block-level comment. */ + function registerComment(): void; + + /** Option to inline variables. */ + function registerInline(): void; + + /** Option to collapse or expand a block. */ + function registerCollapseExpandBlock(): void; + + /** Option to disable or enable a block. */ + function registerDisable(): void; + + /** Option to delete a block. */ + function registerDelete(): void; + + /** Option to open help for a block. */ + function registerHelp(): void; + + /** + * Registers all default context menu items. This should be called once per instance of + * ContextMenuRegistry. + * @package + */ + function registerDefaultOptions(): void; +} + + +declare module Blockly { + + class ContextMenuRegistry extends ContextMenuRegistry__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ContextMenuRegistry__Class { + + /** + * Class for the registry of context menu items. This is intended to be a singleton. You should + * not create a new instance, and only access this class from Blockly.ContextMenuRegistry.registry. + * @constructor + */ + constructor(); + + /** + * Registers a RegistryItem. + * @param {!Blockly.ContextMenuRegistry.RegistryItem} item Context menu item to register. + * @throws {Error} if an item with the given id already exists. + */ + register(item: Blockly.ContextMenuRegistry.RegistryItem): void; + + /** + * Unregisters a RegistryItem with the given id. + * @param {string} id The id of the RegistryItem to remove. + * @throws {Error} if an item with the given id does not exist. + */ + unregister(id: string): void; + + /** + * @param {string} id The id of the RegistryItem to get. + * @returns {?Blockly.ContextMenuRegistry.RegistryItem} RegistryItem or null if not found + */ + getItem(id: string): Blockly.ContextMenuRegistry.RegistryItem; + + /** + * Gets the valid context menu options for the given scope type (e.g. block or workspace) and scope. + * Blocks are only shown if the preconditionFn shows they should not be hidden. + * @param {!Blockly.ContextMenuRegistry.ScopeType} scopeType Type of scope where menu should be + * shown (e.g. on a block or on a workspace) + * @param {!Blockly.ContextMenuRegistry.Scope} scope Current scope of context menu + * (i.e., the exact workspace or block being clicked on) + * @returns {!Array.} the list of ContextMenuOptions + */ + getContextMenuOptions(scopeType: Blockly.ContextMenuRegistry.ScopeType, scope: Blockly.ContextMenuRegistry.Scope): Blockly.ContextMenuRegistry.ContextMenuOption[]; + } + +} + +declare module Blockly.ContextMenuRegistry { + + /** + * Where this menu item should be rendered. If the menu item should be rendered in multiple + * scopes, e.g. on both a block and a workspace, it should be registered for each scope. + * @enum {string} + */ + enum ScopeType { BLOCK, WORKSPACE } + + /** + * The actual workspace/block where the menu is being rendered. This is passed to callback and + * displayText functions that depend on this information. + * @typedef {{ + * block: (Blockly.BlockSvg|undefined), + * workspace: (Blockly.WorkspaceSvg|undefined) + * }} + */ + interface Scope { + block: Blockly.BlockSvg|any /*undefined*/; + workspace: Blockly.WorkspaceSvg|any /*undefined*/ + } + + /** + * A menu item as entered in the registry. + * @typedef {{ + * callback: function(!Blockly.ContextMenuRegistry.Scope), + * scopeType: !Blockly.ContextMenuRegistry.ScopeType, + * displayText: ((function(!Blockly.ContextMenuRegistry.Scope):string)|string), + * preconditionFn: function(!Blockly.ContextMenuRegistry.Scope):string, + * weight: number, + * id: string + * }} + */ + interface RegistryItem { + callback: { (_0: Blockly.ContextMenuRegistry.Scope): any /*missing*/ }; + scopeType: Blockly.ContextMenuRegistry.ScopeType; + displayText: { (_0: Blockly.ContextMenuRegistry.Scope): string }|string; + preconditionFn: { (_0: Blockly.ContextMenuRegistry.Scope): string }; + weight: number; + id: string + } + + /** + * A menu item as presented to contextmenu.js. + * @typedef {{ + * text: string, + * enabled: boolean, + * callback: function(!Blockly.ContextMenuRegistry.Scope), + * scope: !Blockly.ContextMenuRegistry.Scope, + * weight: number + * }} + */ + interface ContextMenuOption { + text: string; + enabled: boolean; + callback: { (_0: Blockly.ContextMenuRegistry.Scope): any /*missing*/ }; + scope: Blockly.ContextMenuRegistry.Scope; + weight: number + } + + /** + * Singleton instance of this class. All interactions with this class should be done on this object. + * @type {?Blockly.ContextMenuRegistry} + */ + var registry: Blockly.ContextMenuRegistry; +} + + +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; + + /** + * 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; + + /** + * Dropdown bounds info object used to encapsulate sizing information about a + * bounding element (bounding box and width/height). + * @typedef {{ + * top:number, + * left:number, + * bottom:number, + * right:number, + * width:number, + * height:number + * }} + */ + interface BoundsInfo { + top: number; + left: number; + bottom: number; + right: number; + width: number; + height: number + } + + /** + * Dropdown position metrics. + * @typedef {{ + * initialX:number, + * initialY:number, + * finalX:number, + * finalY:number, + * arrowX:?number, + * arrowY:?number, + * arrowAtTop:?boolean, + * arrowVisible:boolean + * }} + */ + interface PositionMetrics { + initialX: number; + initialY: number; + finalX: number; + finalY: number; + arrowX: number; + arrowY: number; + arrowAtTop: boolean; + arrowVisible: boolean + } + + /** + * 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.BlockSvg} 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.BlockSvg, 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.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 implements Blockly.IASTNodeLocationSvg, Blockly.IASTNodeLocationWithBlock, Blockly.IBlocklyActionable, Blockly.IRegistrable { + + /** + * 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 + * @implements {Blockly.IASTNodeLocationSvg} + * @implements {Blockly.IASTNodeLocationWithBlock} + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IRegistrable} + */ + 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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 programmatically. + * @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 renderer constant provider. + * @return {?Blockly.blockRendering.ConstantProvider} The renderer constant + * provider. + */ + getConstants(): Blockly.blockRendering.ConstantProvider; + + /** + * 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; + + /** + * 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 programmatically. + * @package + */ + showEditor(opt_e?: Event): void; + + /** + * Updates the size of the field based on the text. + * @param {number=} opt_margin margin to use when positioning the text element. + * @protected + */ + updateSize_(opt_margin?: number): void; + + /** + * Position a field's text element after a size change. This handles both LTR + * and RTL positioning. + * @param {number} xOffset x offset to use when positioning the text element. + * @param {number} contentWidth The content width. + * @protected + */ + positionTextElement_(xOffset: number, contentWidth: number): void; + + /** + * Position a field's border rect after a size change. + * @protected + */ + positionBorderRect_(): 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 {!Blockly.utils.Rect} An object with top, bottom, left, and right in + * pixels relative to the top left corner of the page (window coordinates). + * @package + */ + getScaledBBox(): Blockly.utils.Rect; + + /** + * 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; + + /** + * 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 + */ + 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 overridden 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; + + /** + * Sets the tooltip for this field. + * @param {?Blockly.Tooltip.TipInfo} newTip The + * text for the tooltip, a function that returns the text for the tooltip, a + * parent object whose tooltip will be used, or null to display the tooltip + * of the parent block. To not display a tooltip pass the empty string. + */ + setTooltip(newTip: Blockly.Tooltip.TipInfo): void; + + /** + * Returns the tooltip text for this field. + * @returns {string} The tooltip text for this field. + */ + getTooltip(): string; + + /** + * 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.ShortcutRegistry.KeyboardShortcut} _action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(_action: Blockly.ShortcutRegistry.KeyboardShortcut): 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; + + /** + * Redraw any attached marker or cursor svgs if needed. + * @protected + */ + updateMarkers_(): 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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; + + /** + * Create and show the angle field's editor. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @protected + */ + showEditor_(opt_e?: Event): 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); + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: 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 editability. + */ + CURSOR: any /*missing*/; + + /** + * 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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; + + /** + * Create and show the colour field's editor. + * @protected + */ + showEditor_(): void; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): 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 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[][] }; + + /** + * The prefix field label, of common words set after options are trimmed. + * @type {?string} + * @package + */ + prefixField: string; + + /** + * The suffix field label, of common words set after options are trimmed. + * @type {?string} + * @package + */ + suffixField: string; + + /** + * The dropdown menu. + * @type {Blockly.Menu} + * @protected + */ + menu_: Blockly.Menu; + + /** + * 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; + + /** + * Create a dropdown menu under the text. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @protected + */ + showEditor_(opt_e?: Event): 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; + + /** + * Draws the border with the correct width. + * @protected + */ + render_(): void; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): 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. + * @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); + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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); + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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/multiline-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; + + /** + * 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; + + /** + * 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; + + /** + * 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; + + /** + * 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 { + + /** + * 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; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: any; + + /** + * 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 {!Blockly.IRegistrableField} 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: Blockly.IRegistrableField): 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; + + /** + * The workspace that this field belongs to. + * @type {?Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * The default value for this field. + * @type {*} + * @protected + */ + DEFAULT_VALUE: 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*/; + + /** + * 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 programmatically. + * @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; + + /** + * Closes the editor, saves the results, and disposes of any events or + * dom-references belonging to the editor. + * @protected + */ + widgetDispose_(): void; + + /** + * 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; + + /** + * Unbind handlers for user input and workspace size changes. + * @protected + */ + unbindInputEvents_(): void; + + /** + * Handle key down to the editor. + * @param {!Event} e Keyboard event. + * @protected + */ + onHtmlInputKeyDown_(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*/; +} + + +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 implements Blockly.IBlocklyActionable, Blockly.IDeleteArea, Blockly.IFlyout { + + /** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @constructor + * @abstract + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IDeleteArea} + * @implements {Blockly.IFlyout} + */ + constructor(workspaceOptions: Blockly.Options); + + /** + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * Whether the flyout should be laid out horizontally or not. + * @type {boolean} + * @package + */ + horizontalLayout: 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; + + /** + * The target workspace + * @type {?Blockly.WorkspaceSvg} + * @package + */ + targetWorkspace: Blockly.WorkspaceSvg; + + /** + * 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName The type of tag to + * put the flyout in. This should be or . + * @return {!SVGElement} The flyout's SVG group. + */ + createDom(tagName: string|Blockly.utils.Svg|Blockly.utils.Svg): SVGElement; + + /** + * Initializes the flyout. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The workspace in which to + * create new blocks. + */ + init(targetWorkspace: Blockly.WorkspaceSvg): void; + + /** + * @type {!Blockly.Scrollbar} + * @package + */ + scrollbar: Blockly.Scrollbar; + + /** + * 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 {!Blockly.utils.toolbox.FlyoutDefinition|string} flyoutDef Contents to display + * in the flyout. This is either an array of Nodes, a NodeList, a + * toolbox definition, or a string with the name of the dynamic category. + */ + show(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition|string): void; + + /** + * Create a block from the xml and permanently disable any blocks that were + * defined as disabled. + * @param {!Element} blockXml The xml of the block. + * @return {!Blockly.BlockSvg} The block created from the blockXml. + * @protected + */ + createBlock_(blockXml: Element): Blockly.BlockSvg; + + /** + * Delete blocks, mats and buttons from a previous showing of the flyout. + * @protected + */ + clearOldBlocks_(): 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.BlockSvg} 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.BlockSvg, 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. + * @throws {Error} 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.BlockSvg} 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.BlockSvg, 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.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the flyout handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): boolean; + + /** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + + /** + * Position the flyout. + * @return {void} + */ + position(): 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 an object with all the metrics required to size scrollbars for the + * flyout. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ + getMetrics_(): Blockly.utils.Metrics; + + /** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ + setMetrics_(xyRatio: { x: number; y: number }): void; + + /** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ + layout_(contents: Object[], gaps: number[]): void; + + /** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ + wheel_(e: Event): void; + + /** + * Compute height of flyout. Position mat under each block. + * For RTL: Lay out the blocks right-aligned. + * @return {void} + * @protected + */ + reflowInternal_(): void; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + } + +} + + +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 {!Blockly.utils.toolbox.ButtonOrLabelInfo} json + * The JSON specifying the label/button. + * @param {boolean} isLabel Whether this button should be styled as a label. + * @constructor + * @package + */ + constructor(workspace: Blockly.WorkspaceSvg, targetWorkspace: Blockly.WorkspaceSvg, json: Blockly.utils.toolbox.ButtonOrLabelInfo, isLabel: boolean); + + /** + * The JSON specifying the label / button. + * @type {!Blockly.utils.toolbox.ButtonOrLabelInfo} + */ + info: Blockly.utils.toolbox.ButtonOrLabelInfo; + + /** + * 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; + + /** + * @return {boolean} Whether or not the button is a label. + */ + isLabel(): boolean; + + /** + * Location of the button. + * @return {!Blockly.utils.Coordinate} x, y coordinates. + * @package + */ + getPosition(): Blockly.utils.Coordinate; + + /** + * @return {string} Text of the button. + */ + getButtonText(): string; + + /** + * 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 horizontal margin around the text in the button. + */ + var MARGIN_X: any /*missing*/; + + /** + * The vertical margin around the text in the button. + */ + var MARGIN_Y: 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.IFlyout} flyout The flyout to drag. + * @extends {Blockly.WorkspaceDragger} + * @constructor + */ + constructor(flyout: Blockly.IFlyout); + + /** + * 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); + + /** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ + getMetrics_(): Blockly.utils.Metrics; + + /** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ + setMetrics_(xyRatio: { x: number; y: number }): void; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + + /** + * Move the flyout to the edge of the workspace. + */ + position(): void; + + /** + * Scroll the flyout to the top. + */ + scrollToStart(): void; + + /** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ + wheel_(e: Event): void; + + /** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ + layout_(contents: Object[], gaps: number[]): 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; + + /** + * Compute height of flyout. Position mat under each block. + * For RTL: Lay out the blocks right-aligned. + * @protected + */ + reflowInternal_(): void; + } + +} + + +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); + + /** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Blockly.utils.Metrics} Contains size and position metrics of the + * flyout. + * @protected + */ + getMetrics_(): Blockly.utils.Metrics; + + /** + * Sets the translation of the flyout to match the scrollbars. + * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @protected + */ + setMetrics_(xyRatio: { x: number; y: number }): void; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + + /** + * Move the flyout to the edge of the workspace. + */ + position(): void; + + /** + * Scroll the flyout to the top. + */ + scrollToStart(): void; + + /** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @protected + */ + wheel_(e: Event): void; + + /** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @protected + */ + layout_(contents: Object[], gaps: number[]): 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; + + /** + * Compute width of flyout. Position mat under each block. + * For RTL: Lay out the blocks and buttons to be right-aligned. + * @protected + */ + reflowInternal_(): void; + } + +} + +declare module Blockly.VerticalFlyout { + + /** + * The name of the vertical flyout in the registry. + * @type {string} + */ + var registryName: string; +} + + +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[][]; + + /** + * Whether the init method has been called. + * Generators that set this flag to false after creation and true in init + * will cause blockToCode to emit a warning if the generator has not been + * initialized. If this flag is untouched, it will have no effect. + * @type {?boolean} + */ + isInitialized: boolean; + + /** + * 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). + * The generator must be initialized before calling this function. + * @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.IFlyout} flyout The flyout the event hit. + * @package + */ + handleFlyoutStart(e: Event, flyout: Blockly.IFlyout): 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.IBubble} bubble The bubble the event hit. + * @package + */ + handleBubbleStart(e: Event, bubble: Blockly.IBubble): 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.IBubble} bubble The bubble the gesture started on. + * @package + */ + setStartBubble(bubble: Blockly.IBubble): 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 of the 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 + * @abstract + */ + constructor(block: Blockly.BlockSvg); + + /** + * The block this icon is attached to. + * @type {Blockly.BlockSvg} + * @protected + */ + block_: Blockly.BlockSvg; + + /** + * The icon SVG group. + * @type {?SVGGElement} + */ + iconGroup_: SVGGElement; + + /** + * 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; + + /** + * Draw the icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * Show or hide the icon. + * @param {boolean} visible True if the icon should be visible. + */ + setVisible(visible: boolean): void; + } + +} + + +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. + * @param {boolean=} opt_quiet True to prevent an error if field is not present. + * @return {boolean} True if operation succeeds, false if field is not present + * and opt_quiet is true. + * @throws {Error} if the field is not present and opt_quiet is false. + */ + removeField(name: string, opt_quiet?: boolean): boolean; + + /** + * 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.BlockSvg[]; + + /** + * 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; + + /** + * Changes the connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + * @return {Blockly.Input} The input being modified (to allow chaining). + */ + setShadowDom(shadow: Element): Blockly.Input; + + /** + * Returns the xml representation of the connection's shadow block. + * @return {Element} Shadow DOM representation of a block or null. + */ + getShadowDom(): Element; + + /** + * 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; + + /** + * Update the available connections for the top block. These connections can + * change if a block is unplugged and the stack is healed. + * @package + */ + updateAvailableConnections(): 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 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.InsertionMarkerManager { + + /** + * An enum describing different kinds of previews the InsertionMarkerManager + * could display. + * @enum {number} + */ + enum PREVIEW_TYPE { INSERTION_MARKER, INPUT_OUTLINE, REPLACEMENT_FADE } +} + + +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; + + /** + * Redraw the attached cursor svg if needed. + * @package + */ + updateMarkers(): 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 Menu extends Menu__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Menu__Class { + + /** + * A basic menu class. + * @constructor + */ + 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; + + /** + * Add a new menu item to the bottom of this menu. + * @param {!Blockly.MenuItem} menuItem Menu item to append. + */ + addChild(menuItem: Blockly.MenuItem): void; + + /** + * Creates the menu DOM. + * @param {!Element} container Element upon which to append this menu. + */ + render(container: Element): void; + + /** + * Gets the menu's element. + * @return {Element} The DOM element. + * @package + */ + getElement(): Element; + + /** + * Focus the menu element. + * @package + */ + focus(): void; + + /** + * Set the menu accessibility role. + * @param {!Blockly.utils.aria.Role} roleName role name. + * @package + */ + setRole(roleName: Blockly.utils.aria.Role): void; + + /** + * Dispose of this menu. + */ + dispose(): void; + + /** + * Highlights the given menu item, or clears highlighting if null. + * @param {Blockly.MenuItem} item Item to highlight, or null. + * @package + */ + 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; + + /** + * Get the size of a rendered menu. + * @return {!Blockly.utils.Size} Object with width and height properties. + * @package + */ + getSize(): Blockly.utils.Size; + } + +} + + +declare module Blockly { + + class MenuItem extends MenuItem__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MenuItem__Class { + + /** + * Class representing an item in a menu. + * + * @param {string|!HTMLElement} content Text caption to display as the content + * of the item, or a HTML element to display. + * @param {string=} opt_value Data/model associated with the menu item. + * @constructor + */ + constructor(content: string|HTMLElement, opt_value?: string); + + /** + * Creates the menuitem's DOM. + * @return {!Element} Completed DOM. + */ + createDom(): Element; + + /** + * Dispose of this menu item. + */ + dispose(): void; + + /** + * Gets the menu item's element. + * @return {Element} The DOM element. + * @package + */ + getElement(): Element; + + /** + * Gets the unique ID for this menu item. + * @return {string} Unique component ID. + * @package + */ + getId(): string; + + /** + * Gets the value associated with the menu item. + * @return {*} value Value associated with the menu item. + * @package + */ + getValue(): any; + + /** + * Set menu item's rendering direction. + * @param {boolean} rtl True if RTL, false if LTR. + * @package + */ + setRightToLeft(rtl: boolean): void; + + /** + * Set the menu item's 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; + + /** + * Performs the appropriate action when the menu item is activated + * by the user. + * @package + */ + performAction(): void; + + /** + * Set the handler that's called when the menu item is activated by the user. + * `obj` will be used as the 'this' object in the function when called. + * @param {function(!Blockly.MenuItem)} fn The handler. + * @param {!Object} obj Used as the 'this' object in fn when called. + * @package + */ + onAction(fn: { (_0: Blockly.MenuItem): any /*missing*/ }, obj: Object): 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; + + /** + * Draw the mutator icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * 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); + + /** @type {boolean} */ + RTL: boolean; + + /** @type {boolean} */ + oneBasedIndex: boolean; + + /** @type {boolean} */ + collapse: boolean; + + /** @type {boolean} */ + comments: boolean; + + /** @type {boolean} */ + disable: boolean; + + /** @type {boolean} */ + readOnly: boolean; + + /** @type {number} */ + maxBlocks: number; + + /** @type {?Object.} */ + maxInstances: { [key: string]: number }; + + /** @type {string} */ + pathToMedia: string; + + /** @type {boolean} */ + hasCategories: boolean; + + /** @type {!Blockly.Options.MoveOptions} */ + moveOptions: Blockly.Options.MoveOptions; + + /** @deprecated January 2019 */ + hasScrollbars: any /*missing*/; + + /** @type {boolean} */ + hasTrashcan: boolean; + + /** @type {number} */ + maxTrashcanContents: number; + + /** @type {boolean} */ + hasSounds: boolean; + + /** @type {boolean} */ + hasCss: boolean; + + /** @type {boolean} */ + horizontalLayout: boolean; + + /** @type {?Blockly.utils.toolbox.ToolboxInfo} */ + languageTree: Blockly.utils.toolbox.ToolboxInfo; + + /** @type {!Blockly.Options.GridOptions} */ + gridOptions: Blockly.Options.GridOptions; + + /** @type {!Blockly.Options.ZoomOptions} */ + zoomOptions: Blockly.Options.ZoomOptions; + + /** @type {!Blockly.utils.toolbox.Position} */ + toolboxPosition: Blockly.utils.toolbox.Position; + + /** @type {!Blockly.Theme} */ + theme: Blockly.Theme; + + /** @type {string} */ + renderer: string; + + /** @type {?Object} */ + rendererOverrides: Object; + + /** + * 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. We can assert that this is of type WorkspaceSvg as opposed to + * Workspace as this is only used in a rendered workspace. + * @type {Blockly.WorkspaceSvg} + */ + parentWorkspace: Blockly.WorkspaceSvg; + + /** + * Map of plugin type to name of registered plugin or plugin class. + * @type {!Object.} + */ + plugins: any /*missing*/; + + /** + * If set, sets the translation of the workspace to match the scrollbars. + * @param {!{x:number,y:number}} 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: { x: number; y: number }): void; + + /** + * Return an object with the metrics required to size the workspace. + * @return {!Blockly.utils.Metrics} Contains size and position metrics. + */ + getMetrics(): Blockly.utils.Metrics; + } + + + interface BlocklyOptions { + } +} + +declare module Blockly.Options { + + /** + * Grid Options. + * @typedef {{ + * colour: string, + * length: number, + * snap: boolean, + * spacing: number + * }} + */ + interface GridOptions { + colour: string; + length: number; + snap: boolean; + spacing: number + } + + /** + * Move Options. + * @typedef {{ + * drag: boolean, + * scrollbars: boolean, + * wheel: boolean + * }} + */ + interface MoveOptions { + drag: boolean; + scrollbars: boolean; + wheel: boolean + } + + /** + * Zoom Options. + * @typedef {{ + * controls: boolean, + * maxScale: number, + * minScale: number, + * pinch: boolean, + * scaleSpeed: number, + * startScale: number, + * wheel: boolean + * }} + */ + interface ZoomOptions { + controls: boolean; + maxScale: number; + minScale: number; + pinch: boolean; + scaleSpeed: number; + startScale: number; + wheel: boolean + } + + /** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {?Node|?string} toolboxDef DOM tree of blocks, or text representation + * of same. + * @return {?Node} DOM tree of blocks, or null. + * @deprecated Use Blockly.utils.toolbox.parseToolboxTree. (2020 September 28) + */ + function parseToolboxTree(toolboxDef: 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.registry { + + class Type extends Type__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Type__Class { + + /** + * A name with the type of the element stored in the generic. + * @param {string} name The name of the registry type. + * @constructor + * @template T + */ + constructor(name: string); + } + + + /** + * A map of maps. With the keys being the type and name of the class we are + * registering and the value being the constructor function. + * e.g. {'field': {'field_angle': Blockly.FieldAngle}} + * + * @type {Object>} + */ + var typeMap_: any /*missing*/; + + /** + * The string used to register the default class for a type of plugin. + * @type {string} + */ + var DEFAULT: string; + + /** + * Registers a class based on a type and name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @param {?function(new:T, ...?)|Object} registryItem The class or object to + * register. + * @param {boolean=} opt_allowOverrides True to prevent an error when overriding an + * already registered item. + * @throws {Error} if the type or name is empty, a name with the given type has + * already been registered, or if the given class or object is not valid for it's type. + * @template T + */ + function register(type: string|Blockly.registry.Type, name: string, registryItem: { (_0: any[]): any /*missing*/ }|Object, opt_allowOverrides?: boolean): void; + + /** + * Unregisters the registry item with the given type and name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @template T + */ + function unregister(type: string|Blockly.registry.Type, name: string): void; + + /** + * Gets the registry item for the given name and type. This can be either a + * class or an object. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {?function(new:T, ...?)|Object} The class or object with the given + * name and type or null if none exists. + * @template T + */ + function getItem_(type: string|Blockly.registry.Type, name: string): { (_0: any[]): any /*missing*/ }|Object; + + /** + * Returns whether or not the registry contains an item with the given type and + * name. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {boolean} True if the registry has an item with the given type and + * name, false otherwise. + * @template T + */ + function hasItem(type: string|Blockly.registry.Type, name: string): boolean; + + /** + * Gets the class for the given name and type. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Field, Renderer) + * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @return {?function(new:T, ...?)} The class with the given name and type or + * null if none exists. + * @template T + */ + function getClass(type: string|Blockly.registry.Type, name: string): { (_0: any[]): any /*missing*/ }; + + /** + * Gets the object for the given name and type. + * @param {string|!Blockly.registry.Type} type The type of the plugin. + * (e.g. Category) + * @param {string} name The plugin's name. (Ex. logic_category) + * @returns {T} The object with the given name and type or null if none exists. + * @template T + */ + function getObject(type: string|Blockly.registry.Type, name: string): T; + + /** + * Gets the class from Blockly options for the given type. + * This is used for plugins that override a built in feature. (e.g. Toolbox) + * @param {!Blockly.registry.Type} type The type of the plugin. + * @param {!Blockly.Options} options The option object to check for the given + * plugin. + * @return {?function(new:T, ...?)} The class for the plugin. + * @template T + */ + function getClassFromOptions(type: Blockly.registry.Type, options: Blockly.Options): { (_0: any[]): any /*missing*/ }; +} + +declare module Blockly.registry.Type { + + /** @type {!Blockly.registry.Type} */ + var CONNECTION_CHECKER: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var EVENT: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var FIELD: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var RENDERER: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var TOOLBOX: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var THEME: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var TOOLBOX_ITEM: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var FLYOUTS_VERTICAL_TOOLBOX: Blockly.registry.Type; + + /** @type {!Blockly.registry.Type} */ + var FLYOUTS_HORIZONTAL_TOOLBOX: Blockly.registry.Type; +} + + +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); + + /** + * Connection this connection connects to. Null if not connected. + * @type {Blockly.RenderedConnection} + */ + targetConnection: Blockly.RenderedConnection; + + /** + * 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. + * @deprecated July 2020 + */ + 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.WorkspaceSvg} workspace Workspace to bind the scrollbars to. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * 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.WorkspaceSvg} 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.WorkspaceSvg, horizontal: boolean, opt_pair?: boolean, opt_class?: string); + + /** + * @type {?number} + * @package + */ + ratio: number; + + /** + * The upper left corner of the scrollbar's SVG group in CSS pixels relative + * to the scrollbar's origin. This is usually relative to the injection div + * origin. + * @type {Blockly.utils.Coordinate} + * @package + */ + position: Blockly.utils.Coordinate; + + /** + * 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; + + /** + * Set the position of the scrollbar's SVG group in CSS pixels relative to the + * scrollbar's origin. This sets the scrollbar's location within the workspace. + * @param {number} x The new x coordinate. + * @param {number} y The new y coordinate. + * @package + */ + setPosition(x: number, y: number): void; + + /** + * Recalculate the scrollbar's location and its length. + * @param {Blockly.utils.Metrics=} 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?: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeViewHorizontal(hostMetrics: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeContentHorizontal(hostMetrics: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeViewVertical(hostMetrics: Blockly.utils.Metrics): 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 {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ + resizeContentVertical(hostMetrics: Blockly.utils.Metrics): 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.ShortcutItems { + + /** + * Object holding the names of the default shortcut items. + * @enum {string} + */ + enum names { ESCAPE, DELETE, COPY, CUT, PASTE, UNDO, REDO } + + /** Keyboard shortcut to hide chaff on escape. */ + function registerEscape(): void; + + /** Keyboard shortcut to delete a block on delete or backspace */ + function registerDelete(): void; + + /** Keyboard shortcut to copy a block on ctrl+c, cmd+c, or alt+c. */ + function registerCopy(): void; + + /** Keyboard shortcut to copy and delete a block on ctrl+x, cmd+x, or alt+x. */ + function registerCut(): void; + + /** Keyboard shortcut to paste a block on ctrl+v, cmd+v, or alt+v. */ + function registerPaste(): void; + + /** Keyboard shortcut to undo the previous action on ctrl+z, cmd+z, or alt+z. */ + function registerUndo(): void; + + /** Keyboard shortcut to redo the previous action on ctrl+shift+z, cmd+shift+z, or alt+shift+z. */ + function registerRedo(): void; + + /** + * Registers all default keyboard shortcut item. This should be called once per instance of + * KeyboardShortcutRegistry. + * @package + */ + function registerDefaultShortcuts(): void; +} + + +declare module Blockly { + + class ShortcutRegistry extends ShortcutRegistry__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ShortcutRegistry__Class { + + /** + * Class for the registry of keyboard shortcuts. This is intended to be a + * singleton. You should not create a new instance, and only access this class + * from Blockly.ShortcutRegistry.registry. + * @constructor + */ + constructor(); + + /** + * Registers a keyboard shortcut. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} shortcut The + * shortcut for this key code. + * @param {boolean=} opt_allowOverrides True to prevent a warning when + * overriding an already registered item. + * @throws {Error} if a shortcut with the same name already exists. + * @public + */ + register(shortcut: Blockly.ShortcutRegistry.KeyboardShortcut, opt_allowOverrides?: boolean): void; + + /** + * Unregisters a keyboard shortcut registered with the given key code. This will + * also remove any key mappings that reference this shortcut. + * @param {string} shortcutName The name of the shortcut to unregister. + * @return {boolean} True if an item was unregistered, false otherwise. + * @public + */ + unregister(shortcutName: string): boolean; + + /** + * Adds a mapping between a keycode and a keyboard shortcut. + * @param {string} keyCode The key code for the keyboard shortcut. If + * registering a key code with a modifier (ex: ctrl+c) use + * Blockly.ShortcutRegistry.registry.createSerializedKey; + * @param {string} shortcutName The name of the shortcut to execute when the + * given keycode is pressed. + * @param {boolean=} opt_allowCollision True to prevent an error when adding a + * shortcut to a key that is already mapped to a shortcut. + * @throws {Error} if the given key code is already mapped to a shortcut. + * @public + */ + addKeyMapping(keyCode: string, shortcutName: string, opt_allowCollision?: boolean): void; + + /** + * Removes a mapping between a keycode and a keyboard shortcut. + * @param {string} keyCode The key code for the keyboard shortcut. If + * registering a key code with a modifier (ex: ctrl+c) use + * Blockly.ShortcutRegistry.registry.createSerializedKey; + * @param {string} shortcutName The name of the shortcut to execute when the + * given keycode is pressed. + * @param {boolean=} opt_quiet True to not console warn when there is no + * shortcut to remove. + * @return {boolean} True if a key mapping was removed, false otherwise. + * @public + */ + removeKeyMapping(keyCode: string, shortcutName: string, opt_quiet?: boolean): boolean; + + /** + * Removes all the key mappings for a shortcut with the given name. + * Useful when changing the default key mappings and the key codes registered to the shortcut are + * unknown. + * @param {string} shortcutName The name of the shortcut to remove from the key map. + * @public + */ + removeAllKeyMappings(shortcutName: string): void; + + /** + * Sets the key map. Setting the key map will override any default key mappings. + * @param {!Object>} keyMap The object with key code to + * shortcut names. + * @public + */ + setKeyMap(keyMap: { [key: string]: string[] }): void; + + /** + * Gets the current key map. + * @return {!Object>} + * The object holding key codes to Blockly.ShortcutRegistry.KeyboardShortcut. + * @public + */ + getKeyMap(): { [key: string]: Blockly.ShortcutRegistry.KeyboardShortcut[] }; + + /** + * Gets the registry of keyboard shortcuts. + * @return {!Object} + * The registry of keyboard shortcuts. + * @public + */ + getRegistry(): { [key: string]: Blockly.ShortcutRegistry.KeyboardShortcut }; + + /** + * Handles key down events. + * @param {!Blockly.Workspace} workspace The main workspace where the event was + * captured. + * @param {!Event} e The key down event. + * @return {boolean} True if the event was handled, false otherwise. + * @public + */ + onKeyDown(workspace: Blockly.Workspace, e: Event): boolean; + + /** + * Gets the shortcuts registered to the given key code. + * @param {string} keyCode The serialized key code. + * @return {!Array|undefined} The list of shortcuts to call when the + * given keyCode is used. Undefined if no shortcuts exist. + * @public + */ + getShortcutNamesByKeyCode(keyCode: string): string[]|any /*undefined*/; + + /** + * Gets the serialized key codes that the shortcut with the given name is + * registered under. + * @param {string} shortcutName The name of the shortcut. + * @return {!Array} An array with all the key codes the shortcut is + * registered under. + * @public + */ + getKeyCodesByShortcutName(shortcutName: string): string[]; + + /** + * Creates 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 modifier key codes to be used with + * the key. All valid modifiers can be found in the + * Blockly.ShortcutRegistry.modifierKeys. + * @return {string} The serialized key code for the given modifiers and key. + * @public + */ + createSerializedKey(keyCode: number, modifiers: string[]): string; + } + +} + +declare module Blockly.ShortcutRegistry { + + /** + * Enum of valid modifiers. + * @enum {!Blockly.utils.KeyCodes} + */ + enum modifierKeys { Shift, Control, Alt, Meta } + + /** + * A keyboard shortcut. + * @typedef {{ + * callback: ((function(!Blockly.Workspace, Event, + * !Blockly.ShortcutRegistry.KeyboardShortcut):boolean)|undefined), + * name: string, + * preconditionFn: ((function(!Blockly.Workspace):boolean)|undefined), + * metadata: (Object|undefined) + * }} + */ + interface KeyboardShortcut { + callback: { (_0: Blockly.Workspace, _1: Event, _2: Blockly.ShortcutRegistry.KeyboardShortcut): boolean }|any /*undefined*/; + name: string; + preconditionFn: { (_0: Blockly.Workspace): boolean }|any /*undefined*/; + metadata: Object|any /*undefined*/ + } +} + + +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.=} opt_blockStyles A map + * from style names (strings) to objects with style attributes for blocks. + * @param {!Object.=} opt_categoryStyles A + * map from style names (strings) to objects with style attributes for + * categories. + * @param {!Blockly.Theme.ComponentStyle=} opt_componentStyles A map of Blockly + * component names to style value. + * @constructor + */ + constructor(name: string, opt_blockStyles?: { [key: string]: Blockly.Theme.BlockStyle }, opt_categoryStyles?: { [key: string]: Blockly.Theme.CategoryStyle }, opt_componentStyles?: Blockly.Theme.ComponentStyle); + + /** + * The theme name. This can be used to reference a specific theme in CSS. + * @type {string} + */ + 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 }; + + /** + * The UI components styles map. + * @type {!Blockly.Theme.ComponentStyle} + * @package + */ + componentStyles: Blockly.Theme.ComponentStyle; + + /** + * The font style. + * @type {!Blockly.Theme.FontStyle} + * @package + */ + fontStyle: Blockly.Theme.FontStyle; + + /** + * Whether or not to add a 'hat' on top of all blocks with no previous or + * output connections. + * @type {?boolean} + * @package + */ + startHats: boolean; + + /** + * Gets the class name that identifies this theme. + * @return {string} The CSS class name. + * @package + */ + getClassName(): string; + + /** + * Overrides or adds a style to the blockStyles map. + * @param {string} blockStyleName The name of the block style. + * @param {Blockly.Theme.BlockStyle} blockStyle The block style. + */ + setBlockStyle(blockStyleName: string, blockStyle: Blockly.Theme.BlockStyle): void; + + /** + * Overrides or adds a style to the categoryStyles map. + * @param {string} categoryStyleName The name of the category style. + * @param {Blockly.Theme.CategoryStyle} categoryStyle The category style. + */ + setCategoryStyle(categoryStyleName: string, categoryStyle: Blockly.Theme.CategoryStyle): void; + + /** + * 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; + + /** + * Configure a theme's font style. + * @param {Blockly.Theme.FontStyle} fontStyle The font style. + */ + setFontStyle(fontStyle: Blockly.Theme.FontStyle): void; + + /** + * Configure a theme's start hats. + * @param {boolean} startHats True if the theme enables start hats, false + * otherwise. + */ + setStartHats(startHats: boolean): 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 + } + + /** + * A component style. + * @typedef {{ + * workspaceBackgroundColour:?string, + * toolboxBackgroundColour:?string, + * toolboxForegroundColour:?string, + * flyoutBackgroundColour:?string, + * flyoutForegroundColour:?string, + * flyoutOpacity:?number, + * scrollbarColour:?string, + * scrollbarOpacity:?number, + * insertionMarkerColour:?string, + * insertionMarkerOpacity:?number, + * markerColour:?string, + * cursorColour:?string, + * selectedGlowColour:?string, + * selectedGlowOpacity:?number, + * replacementGlowColour:?string, + * replacementGlowOpacity:?number + * }} + */ + interface ComponentStyle { + workspaceBackgroundColour: string; + toolboxBackgroundColour: string; + toolboxForegroundColour: string; + flyoutBackgroundColour: string; + flyoutForegroundColour: string; + flyoutOpacity: number; + scrollbarColour: string; + scrollbarOpacity: number; + insertionMarkerColour: string; + insertionMarkerOpacity: number; + markerColour: string; + cursorColour: string; + selectedGlowColour: string; + selectedGlowOpacity: number; + replacementGlowColour: string; + replacementGlowOpacity: number + } + + /** + * A font style. + * @typedef {{ + * family:?string, + * weight:?string, + * size:?number + * }} + */ + interface FontStyle { + family: string; + weight: string; + size: number + } + + /** + * Define a new Blockly theme. + * @param {string} name The name of the theme. + * @param {!Object} themeObj An object containing theme properties. + * @return {!Blockly.Theme} A new Blockly theme. + */ + function defineTheme(name: string, themeObj: Object): Blockly.Theme; +} + + +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.Tooltip { + + /** + * A type which can define a tooltip. + * Either a string, an object containing a tooltip property, or a function which + * returns either a string, or another arbitrarily nested function which + * eventually unwinds to a string. + * @typedef {string|{tooltip}|function(): (string|!Function)} + */ + type TipInfo = string|{ tooltip: any /*missing*/ }|{ (): string|Function }; + + /** + * 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; + + /** + * Returns the tooltip text for the given element. + * @param {?Object} object The object to get the tooltip text of. + * @returns {string} The tooltip text of the element. + */ + function getTooltipOfObject(object: Object): string; + + /** + * 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; + + /** + * Unbinds tooltip mouse events from the SVG element. + * @param {!Element} element SVG element onto which tooltip is bound. + */ + function unbindMouseEvents(element: Element): void; + + /** + * Dispose of the tooltip. + * @package + */ + function dispose(): 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 implements Blockly.IDeleteArea { + + /** + * Class for a trash can. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to sit in. + * @constructor + * @implements {Blockly.IDeleteArea} + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * The trashcan flyout. + * @type {Blockly.IFlyout} + * @package + */ + flyout: Blockly.IFlyout; + + /** + * Current open/close state of the lid. + * @type {boolean} + */ + isLidOpen: 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; + + /** + * Returns true if the trashcan contents-flyout is currently open. + * @return {boolean} True if the trashcan contents-flyout is currently open. + */ + contentsIsOpen(): boolean; + + /** + * Opens the trashcan flyout. + */ + openFlyout(): void; + + /** + * Closes the trashcan flyout. + */ + closeFlyout(): void; + + /** + * Empties the trashcan's contents. If the contents-flyout is currently open + * it will be closed. + */ + emptyContents(): 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 + */ + setLidOpen(state: boolean): void; + + /** + * Flip the lid shut. + * Called externally after a drag. + */ + closeLid(): void; + + /** + * Inspect the contents of the trash. + */ + click(): 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 {!Blockly.utils.Rect} An object containing window width, height, and + * scroll position in window coordinates. + * @package + */ + function getViewportBBox(): Blockly.utils.Rect; + + /** + * 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 coordinates + * @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 { + + 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 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; + + /** + * Opens a prompt that allows the user to enter a new name for a variable. + * Triggers a rename if the new name is valid. Or re-prompts if there is a + * collision. + * @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; + + /** + * Check whether there exists a variable with the given name of any type. + * @param {string} name The name to search for. + * @param {!Blockly.Workspace} workspace The workspace to search for the + * variable. + * @return {Blockly.VariableModel} The variable with the given name, + * or null if none was found. + */ + function nameUsedWithAnyType(name: string, workspace: Blockly.Workspace): Blockly.VariableModel; + + /** + * 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*/; + + /** + * Draw the warning icon. + * @param {!Element} group The icon group. + * @protected + */ + drawIcon_(group: Element): void; + + /** + * Show or hide the warning bubble. + * @param {boolean} visible True if the bubble should be visible. + */ + setVisible(visible: boolean): 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 {!Blockly.utils.Rect} viewportBBox The bounding rectangle of the + * current viewport, in window coordinates. + * @param {!Blockly.utils.Rect} 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: Blockly.utils.Rect, anchorBBox: Blockly.utils.Rect, 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 implements Blockly.IASTNodeLocation { + + /** + * 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 + * @implements {Blockly.IASTNodeLocation} + */ + 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; + + /** + * An object that encapsulates logic for safety, type, and dragging checks. + * @type {!Blockly.IConnectionChecker} + */ + connectionChecker: Blockly.IConnectionChecker; + + /** + * @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; + + /** + * Adds a block to the list of top blocks. + * @param {!Blockly.Block} block Block to add. + */ + addTopBlock(block: Blockly.Block): void; + + /** + * Removes 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[]; + + /** + * Adds a comment to the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to add. + * @package + */ + addTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Removes 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; + + /** + * 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; + + /** + * Gets the undo stack for workplace. + * @return {!Array.} undo stack + * @package + */ + getUndoStack(): Blockly.Events.Abstract[]; + + /** + * Gets the redo stack for workplace. + * @return {!Array.} redo stack + * @package + */ + getRedoStack(): Blockly.Events.Abstract[]; + + /** + * 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 implements Blockly.IBoundedElement, Blockly.IBubble, Blockly.ICopyable { + + /** + * 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} + * @implements {Blockly.IBoundedElement} + * @implements {Blockly.IBubble} + * @implements {Blockly.ICopyable} + * @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. + * + * @param {boolean=} opt_noSelect Text inside text area will be selected if false + * + * @package + */ + initSvg(opt_noSelect?: boolean): 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; + + /** + * 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; + + /** + * 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 for copying. + * @return {!Blockly.ICopyable.CopyData} Copy metadata. + * @package + */ + toCopyData(): Blockly.ICopyable.CopyData; + } + +} + +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 { + + class WorkspaceSvg extends WorkspaceSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceSvg__Class extends Blockly.Workspace__Class implements Blockly.IASTNodeLocationSvg { + + /** + * 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} + * @implements {Blockly.IASTNodeLocationSvg} + * @constructor + */ + constructor(options: Blockly.Options, opt_blockDragSurface?: Blockly.BlockDragSurfaceSvg, opt_wsDragSurface?: Blockly.WorkspaceDragSurfaceSvg); + + /** @type {function():!Blockly.utils.Metrics} */ + getMetrics: { (): Blockly.utils.Metrics }; + + /** @type {function(!{x:number, y:number}):void} */ + setMetrics: { (_0: { x: number; y: number }): 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} + */ + 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. + * @param {!Event} e The right-click event that triggered the context menu. + */ + configureContextMenu(options: Object[], e: Event): 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName What type of tag the + * flyout belongs in. + * @return {!Element} The element containing the flyout DOM. + * @package + */ + addFlyout(tagName: string|Blockly.utils.Svg|Blockly.utils.Svg): 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.IFlyout} The flyout on this workspace. + * @package + */ + getFlyout(opt_own?: boolean): Blockly.IFlyout; + + /** + * Getter for the toolbox associated with this workspace, if one exists. + * @return {Blockly.IToolbox} The toolbox on this workspace. + * @package + */ + getToolbox(): Blockly.IToolbox; + + /** + * 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; + + /** + * Fires a viewport event if events are enabled and there is a change in + * viewport values. + * @package + */ + maybeFireViewportChangeEvent(): void; + + /** + * 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; + + /** + * 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|!DocumentFragment} xmlBlock XML block element or an empty + * DocumentFragment if the block was an insertion marker. + */ + paste(xmlBlock: Element|DocumentFragment): 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 {?Blockly.utils.toolbox.ToolboxDefinition} toolboxDef + * DOM tree of toolbox contents, string of toolbox contents, or JSON + * representing toolbox definition. + */ + updateToolbox(toolboxDef: Blockly.utils.toolbox.ToolboxDefinition): 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; + + /** + * Get the workspace's zoom factor. If the workspace has a parent, we call into + * the parent to get the workspace scale. + * @return {number} The workspace zoom factor. Units: (pixels / workspaceUnit). + */ + getScale(): number; + + /** + * 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; + + /** + * Adds a block to the list of top blocks. + * @param {!Blockly.Block} block Block to add. + */ + addTopBlock(block: Blockly.Block): void; + + /** + * Removes a block from the list of top blocks. + * @param {!Blockly.Block} block Block to remove. + */ + removeTopBlock(block: Blockly.Block): void; + + /** + * Adds a comment to the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to add. + */ + addTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Removes a comment from the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to remove. + */ + removeTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Adds a bounded element to the list of top bounded elements. + * @param {!Blockly.IBoundedElement} element Bounded element to add. + */ + addTopBoundedElement(element: Blockly.IBoundedElement): void; + + /** + * Removes a bounded element from the list of top bounded elements. + * @param {!Blockly.IBoundedElement} element Bounded element to remove. + */ + removeTopBoundedElement(element: Blockly.IBoundedElement): void; + + /** + * Finds the top-level bounded elements and returns them. + * @return {!Array.} The top-level bounded elements. + */ + getTopBoundedElements(): Blockly.IBoundedElement[]; + + /** + * 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.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|!DocumentFragment} Tree of XML elements or an empty document + * fragment if the block was an insertion marker. + */ + function blockToDomWithXY(block: Blockly.Block, opt_noId?: boolean): Element|DocumentFragment; + + /** + * 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|!DocumentFragment} Tree of XML elements or an empty document + * fragment if the block was an insertion marker. + */ + function blockToDom(block: Blockly.Block, opt_noId?: boolean): Element|DocumentFragment; + + /** + * 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|!DocumentFragment} xmlBlock XML block element or an empty + * DocumentFragment if the block was an insertion marker. + */ + function deleteNext(xmlBlock: Element|DocumentFragment): 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.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=} opt_block The block this event corresponds to. + * Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_block?: Blockly.Block); + + /** + * The block id for the block this event pertains to + * @type {string} + */ + blockId: string; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: 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=} opt_block The changed block. Undefined for a blank + * event. + * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc. + * @param {?string=} opt_name Name of input or field affected, or null. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_element?: string, opt_name?: string, opt_oldValue?: any, opt_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=} opt_block The changed block. Undefined for a blank + * event. + * @param {string=} opt_element One of 'field', 'comment', 'disabled', etc. + * @param {?string=} opt_name Name of input or field affected, or null. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_element?: string, opt_name?: string, opt_oldValue?: any, opt_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=} opt_block The created block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_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. Undefined 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=} opt_block The deleted block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_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=} opt_block The moved block. Undefined for a blank + * event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(opt_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.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 generic event that records a UI change. + * @const + */ + var UI: any /*missing*/; + + /** + * Name of event that record a block drags a block. + * @const + */ + var BLOCK_DRAG: any /*missing*/; + + /** + * Name of event that records a change in selected element. + * @const + */ + var SELECTED: any /*missing*/; + + /** + * Name of event that records a click. + * @const + */ + var CLICK: any /*missing*/; + + /** + * Name of event that records a marker move. + * @const + */ + var MARKER_MOVE: any /*missing*/; + + /** + * Name of event that records a bubble open. + * @const + */ + var BUBBLE_OPEN: any /*missing*/; + + /** + * Name of event that records a trashcan open. + * @const + */ + var TRASHCAN_OPEN: any /*missing*/; + + /** + * Name of event that records a toolbox item select. + * @const + */ + var TOOLBOX_ITEM_SELECT: any /*missing*/; + + /** + * Name of event that records a theme change. + * @const + */ + var THEME_CHANGE: any /*missing*/; + + /** + * Name of event that records a viewport change. + * @const + */ + var VIEWPORT_CHANGE: 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. + * @throws {Error} if an event type is not found in the registry. + */ + 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(); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {?boolean} + */ + isBlank: boolean; + + /** + * 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; + + /** + * Whether or not the event is a ui event. + * @type {boolean} + */ + isUiEvent: 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.Events { + + class BlockDrag extends BlockDrag__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockDrag__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a block drag event. + * @param {!Blockly.Block=} opt_block The top block in the stack that is being + * dragged. Undefined for a blank event. + * @param {boolean=} opt_isStart Whether this is the start of a block drag. + * Undefined for a blank event. + * @param {!Array.=} opt_blocks The blocks affected by this + * drag. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_isStart?: boolean, opt_blocks?: Blockly.Block[]); + + /** + * Whether this is the start of a block drag. + * @type {boolean|undefined} + */ + isStart: boolean|any /*undefined*/; + + /** + * The blocks affected by this drag event. + * @type {!Array.|undefined} + */ + blocks: Blockly.Block[]|any /*undefined*/; + + /** + * 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.Events { + + class BubbleOpen extends BubbleOpen__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BubbleOpen__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a bubble open event. + * @param {Blockly.BlockSvg} opt_block The associated block. Undefined for a + * blank event. + * @param {boolean=} opt_isOpen Whether the bubble is opening (false if + * closing). Undefined for a blank event. + * @param {string=} opt_bubbleType The type of bubble. One of 'mutator', 'comment' + * or 'warning'. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block: Blockly.BlockSvg, opt_isOpen?: boolean, opt_bubbleType?: string); + + /** + * Whether the bubble is opening (false if closing). + * @type {boolean|undefined} + */ + isOpen: boolean|any /*undefined*/; + + /** + * The type of bubble. One of 'mutator', 'comment', or 'warning'. + * @type {string|undefined} + */ + bubbleType: string|any /*undefined*/; + + /** + * 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.Events { + + class Click extends Click__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Click__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a click event. + * @param {?Blockly.Block=} opt_block The affected block. Null for click events + * that do not have an associated block (i.e. workspace click). Undefined + * for a blank event. + * @param {?string=} opt_workspaceId The workspace identifier for this event. + * Not used if block is passed. Undefined for a blank event. + * @param {string=} opt_targetType The type of element targeted by this click + * event. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_workspaceId?: string, opt_targetType?: string); + + /** + * The type of element targeted by this click event. + * @type {string|undefined} + */ + targetType: string|any /*undefined*/; + + /** + * 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.Events { + + class MarkerMove extends MarkerMove__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MarkerMove__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a marker move event. + * @param {?Blockly.Block=} opt_block The affected block. Null if current node + * is of type workspace. Undefined for a blank event. + * @param {boolean=} isCursor Whether this is a cursor event. Undefined for a + * blank event. + * @param {?Blockly.ASTNode=} opt_oldNode The old node the marker used to be on. + * Undefined for a blank event. + * @param {!Blockly.ASTNode=} opt_newNode The new node the marker is now on. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_block?: Blockly.Block, isCursor?: boolean, opt_oldNode?: Blockly.ASTNode, opt_newNode?: Blockly.ASTNode); + + /** + * The workspace identifier for this event. + * @type {?string} + */ + blockId: string; + + /** + * The old node the marker used to be on. + * @type {?Blockly.ASTNode|undefined} + */ + oldNode: Blockly.ASTNode|any /*undefined*/; + + /** + * The new node the marker is now on. + * @type {Blockly.ASTNode|undefined} + */ + newNode: Blockly.ASTNode|any /*undefined*/; + + /** + * Whether this is a cursor event. + * @type {boolean|undefined} + */ + isCursor: boolean|any /*undefined*/; + + /** + * 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.Events { + + class Selected extends Selected__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Selected__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a selected event. + * @param {?string=} opt_oldElementId The id of the previously selected + * element. Null if no element last selected. Undefined for a blank event. + * @param {?string=} opt_newElementId The id of the selected element. Null if no + * element currently selected (deselect). Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Null if no element previously selected. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_oldElementId?: string, opt_newElementId?: string, opt_workspaceId?: string); + + /** + * The id of the last selected element. + * @type {?string|undefined} + */ + oldElementId: string|any /*undefined*/; + + /** + * The id of the selected element. + * @type {?string|undefined} + */ + newElementId: string|any /*undefined*/; + + /** + * 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.Events { + + class ThemeChange extends ThemeChange__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ThemeChange__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a theme change event. + * @param {string=} opt_themeName The theme name. Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * event. Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_themeName?: string, opt_workspaceId?: string); + + /** + * The theme name. + * @type {string|undefined} + */ + themeName: string|any /*undefined*/; + + /** + * 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.Events { + + class ToolboxItemSelect extends ToolboxItemSelect__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxItemSelect__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a toolbox item select event. + * @param {?string=} opt_oldItem The previously selected toolbox item. Undefined + * for a blank event. + * @param {?string=} opt_newItem The newly selected toolbox item. Undefined for + * a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_oldItem?: string, opt_newItem?: string, opt_workspaceId?: string); + + /** + * The previously selected toolbox item. + * @type {?string|undefined} + */ + oldItem: string|any /*undefined*/; + + /** + * The newly selected toolbox item. + * @type {?string|undefined} + */ + newItem: string|any /*undefined*/; + + /** + * 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.Events { + + class TrashcanOpen extends TrashcanOpen__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TrashcanOpen__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a trashcan open event. + * @param {boolean=} opt_isOpen Whether the trashcan flyout is opening (false if + * opening). Undefined for a blank event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_isOpen?: boolean, opt_workspaceId?: string); + + /** + * Whether the trashcan flyout is opening (false if closing). + * @type {boolean|undefined} + */ + isOpen: boolean|any /*undefined*/; + + /** + * 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.Events { + + class ViewportChange extends ViewportChange__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ViewportChange__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a viewport change event. + * @param {number=} opt_top Top-edge of the visible portion of the workspace, + * relative to the workspace origin. Undefined for a blank event. + * @param {number=} opt_left Left-edge of the visible portion of the workspace, + * relative to the workspace origin. Undefined for a blank event. + * @param {number=} opt_scale The scale of the workspace. Undefined for a blank + * event. + * @param {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.UiBase} + * @constructor + */ + constructor(opt_top?: number, opt_left?: number, opt_scale?: number, opt_workspaceId?: string); + + /** + * Top-edge of the visible portion of the workspace, relative to the workspace + * origin. + * @type {number|undefined} + */ + viewTop: number|any /*undefined*/; + + /** + * Left-edge of the visible portion of the workspace, relative to the + * workspace origin. + * @type {number|undefined} + */ + viewLeft: number|any /*undefined*/; + + /** + * The scale of the workspace. + * @type {number|undefined} + */ + scale: number|any /*undefined*/; + + /** + * 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.Events { + + class UiBase extends UiBase__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class UiBase__Class extends Blockly.Events.Abstract__Class { + + /** + * Base 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 {string=} opt_workspaceId The workspace identifier for this event. + * Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_workspaceId?: string); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {boolean} + */ + isBlank: boolean; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: string; + + /** + * Whether or not the event is a UI event. + * @type {boolean} + */ + isUiEvent: boolean; + } + + + class Ui extends Ui__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Ui__Class extends Blockly.Events.UiBase__Class { + + /** + * Class for a UI event. + * @param {?Blockly.Block=} opt_block The affected block. Null for UI events + * that do not have an associated block. Undefined for a blank event. + * @param {string=} opt_element One of 'selected', 'comment', 'mutatorOpen', + * etc. + * @param {*=} opt_oldValue Previous value of element. + * @param {*=} opt_newValue New value of element. + * @extends {Blockly.Events.UiBase} + * @deprecated December 2020. Instead use a more specific UI event. + * @constructor + */ + constructor(opt_block?: Blockly.Block, opt_element?: string, opt_oldValue?: any, opt_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.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=} opt_variable The variable this event + * corresponds to. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_variable?: Blockly.VariableModel); + + /** + * The variable id for the variable this event pertains to. + * @type {string} + */ + varId: string; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: 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=} opt_variable The created variable. Undefined + * for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(opt_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=} opt_variable The deleted variable. Undefined + * for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(opt_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=} opt_variable The renamed variable. Undefined + * for a blank event. + * @param {string=} newName The new name the variable will be changed to. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(opt_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.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=} opt_workspace The workspace that has finished + * loading. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_workspace?: Blockly.Workspace); + + /** + * Whether or not the event is blank (to be populated by fromJson). + * @type {boolean} + */ + isBlank: boolean; + + /** + * 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.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=} opt_comment The comment this event + * corresponds to. Undefined for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(opt_comment?: Blockly.WorkspaceComment); + + /** + * Whether or not an event is blank. + * @type {boolean} + */ + isBlank: boolean; + + /** + * 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=} opt_comment The comment that is being + * changed. Undefined for a blank event. + * @param {string=} opt_oldContents Previous contents of the comment. + * @param {string=} opt_newContents New contents of the comment. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_comment?: Blockly.WorkspaceComment, opt_oldContents?: string, opt_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=} opt_comment The created comment. + * Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_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=} opt_comment The deleted comment. + * Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_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=} opt_comment The comment that is being + * moved. Undefined for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(opt_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 { + + interface IASTNodeLocation { + } + + interface IASTNodeLocationSvg extends Blockly.IASTNodeLocation { + + /** + * Add the marker svg to this node's svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * svg group. + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * Add the cursor svg to this node's svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * svg group. + */ + setCursorSvg(cursorSvg: SVGElement): void; + } + + interface IASTNodeLocationWithBlock extends Blockly.IASTNodeLocation { + + /** + * Get the source block associated with this node. + * @return {Blockly.Block} The source block. + */ + getSourceBlock(): Blockly.Block; + } + + interface IBlocklyActionable { + + /** + * Handles the given action. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): boolean; + } +} + + +declare module Blockly { + + interface IBoundedElement { + + /** + * Returns the coordinates of a bounded element describing the dimensions of the + * element. + * Coordinate system: workspace coordinates. + * @return {!Blockly.utils.Rect} Object with coordinates of the bounded element. + */ + getBoundingRectangle(): Blockly.utils.Rect; + } +} + + +declare module Blockly { + + interface IBubble extends Blockly.IDeletable, Blockly.IContextMenu { + + /** + * 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; + + /** + * Return the root node of the bubble's SVG group. + * @return {!SVGElement} The root SVG node of the bubble's group. + */ + getSvgRoot(): SVGElement; + + /** + * 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. + */ + setAutoLayout(enable: boolean): void; + + /** + * Triggers a move callback if one exists at the end of a drag. + * @param {boolean} adding True if adding, false if removing. + */ + setDragging(adding: boolean): 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. + */ + moveDuringDrag(dragSurface: Blockly.BlockDragSurfaceSvg, newLoc: Blockly.utils.Coordinate): void; + + /** + * Move the bubble 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. + */ + moveTo(x: number, y: number): void; + + /** + * Update the style of this bubble when it is dragged over a delete area. + * @param {boolean} enable True if the bubble is about to be deleted, false + * otherwise. + */ + setDeleteStyle(enable: boolean): void; + + /** + * Dispose of this bubble. + */ + dispose: any /*missing*/; + } +} + + +declare module Blockly { + + interface IConnectionChecker { + + /** + * Check whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {boolean} Whether the connection is legal. + * @public + */ + canConnect(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): boolean; + + /** + * Checks whether the current connection can connect with the target + * connection, and return an error code if there are problems. + * @param {Blockly.Connection} a Connection to check compatibility with. + * @param {Blockly.Connection} b Connection to check compatibility with. + * @param {boolean} isDragging True if the connection is being made by dragging + * a block. + * @param {number=} opt_distance The max allowable distance between the + * connections for drag checks. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @public + */ + canConnectWithReason(a: Blockly.Connection, b: Blockly.Connection, isDragging: boolean, opt_distance?: number): number; + + /** + * Helper method that translates a connection error code into a string. + * @param {number} errorCode The error code. + * @param {Blockly.Connection} a One of the two connections being checked. + * @param {Blockly.Connection} b The second of the two connections being + * checked. + * @return {string} A developer-readable error string. + * @public + */ + getErrorMessage(errorCode: number, a: Blockly.Connection, b: Blockly.Connection): string; + + /** + * Check that connecting the given connections is safe, meaning that it would + * not break any of Blockly's basic assumptions (e.g. no self connections). + * @param {Blockly.Connection} a The first of the connections to check. + * @param {Blockly.Connection} b The second of the connections to check. + * @return {number} An enum with the reason this connection is safe or unsafe. + * @public + */ + doSafetyChecks(a: Blockly.Connection, b: Blockly.Connection): number; + + /** + * Check whether this connection is compatible with another connection with + * respect to the value type system. E.g. square_root("Hello") is not + * compatible. + * @param {!Blockly.Connection} a Connection to compare. + * @param {!Blockly.Connection} b Connection to compare against. + * @return {boolean} True if the connections share a type. + * @public + */ + doTypeChecks(a: Blockly.Connection, b: Blockly.Connection): boolean; + + /** + * Check whether this connection can be made by dragging. + * @param {!Blockly.RenderedConnection} a Connection to compare. + * @param {!Blockly.RenderedConnection} b Connection to compare against. + * @param {number} distance The maximum allowable distance between connections. + * @return {boolean} True if the connection is allowed during a drag. + * @public + */ + doDragChecks(a: Blockly.RenderedConnection, b: Blockly.RenderedConnection, distance: number): boolean; + } +} + + +declare module Blockly { + + interface IContextMenu { + + /** + * Show the context menu for this object. + * @param {!Event} e Mouse event. + */ + showContextMenu(e: Event): void; + } +} + + +declare module Blockly { + + interface ICopyable extends Blockly.ISelectable { + + /** + * Encode for copying. + * @return {?Blockly.ICopyable.CopyData} Copy metadata. + */ + toCopyData(): Blockly.ICopyable.CopyData; + } +} + +declare module Blockly.ICopyable { + + /** + * Copy Metadata. + * @typedef {{ + * xml:!Element, + * source:Blockly.WorkspaceSvg, + * typeCounts:?Object + * }} + */ + interface CopyData { + xml: Element; + source: Blockly.WorkspaceSvg; + typeCounts: Object + } +} + + +declare module Blockly { + + interface IDeletable { + + /** + * Get whether this object is deletable or not. + * @return {boolean} True if deletable. + */ + isDeletable(): boolean; + } +} + + +declare module Blockly { + + interface IDeleteArea { + + /** + * Return the deletion rectangle. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + } +} + + +declare module Blockly { + + interface IFlyout extends Blockly.IRegistrable { + + /** + * Whether the flyout is laid out horizontally or not. + * @type {boolean} + */ + horizontalLayout: boolean; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * The target workspace + * @type {?Blockly.WorkspaceSvg} + */ + targetWorkspace: Blockly.WorkspaceSvg; + + /** + * Margin around the edges of the blocks in the flyout. + * @type {number} + * @const + */ + MARGIN: 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; + + /** + * 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| + * !Blockly.utils.Svg| + * !Blockly.utils.Svg} tagName The type of tag to + * put the flyout in. This should be or . + * @return {!SVGElement} The flyout's SVG group. + */ + createDom(tagName: string|Blockly.utils.Svg|Blockly.utils.Svg): 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. + */ + dispose: any /*missing*/; + + /** + * 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. + */ + 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; + + /** + * Hide and empty the flyout. + */ + hide: any /*missing*/; + + /** + * Show and populate the flyout. + * @param {!Blockly.utils.toolbox.FlyoutDefinition|string} flyoutDef Contents to + * display in the flyout. This is either an array of Nodes, a NodeList, a + * toolbox definition, or a string with the name of the dynamic category. + */ + show(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition|string): void; + + /** + * 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. + * @throws {Error} if something went wrong with deserialization. + */ + createBlock(originalBlock: Blockly.BlockSvg): Blockly.BlockSvg; + + /** + * Reflow blocks and their mats. + */ + reflow: any /*missing*/; + + /** + * @return {boolean} True if this flyout may be scrolled with a scrollbar or by + * dragging. + */ + isScrollable(): boolean; + + /** + * Calculates the x coordinate for the flyout position. + * @return {number} X coordinate. + */ + getX(): number; + + /** + * Calculates the y coordinate for the flyout position. + * @return {number} Y coordinate. + */ + getY(): number; + + /** + * Position the flyout. + * @return {void} + */ + position(): 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. + */ + isDragTowardWorkspace(currentDragDeltaXY: Blockly.utils.Coordinate): boolean; + } +} + + +declare module Blockly { + + interface IMovable { + + /** + * Get whether this is movable or not. + * @return {boolean} True if movable. + */ + isMovable(): boolean; + } +} + + +declare module Blockly { + + interface IRegistrable { + } +} + + +declare module Blockly { + + /** + * A registrable field. + * Note: We are not using an interface here as we are interested in defining the + * static methods of a field rather than the instance methods. + * @typedef {{ + * fromJson:Blockly.IRegistrableField.fromJson + * }} + */ + interface IRegistrableField { + fromJson: Blockly.IRegistrableField.fromJson + } +} + +declare module Blockly.IRegistrableField { + + /** + * @typedef {function(!Object): Blockly.Field} + */ + interface fromJson { + (_0: Object): Blockly.Field + } +} + + +declare module Blockly { + + interface ISelectable extends Blockly.IDeletable, Blockly.IMovable { + + /** + * @type {string} + */ + id: string; + + /** + * Select this. Highlight it visually. + * @return {void} + */ + select(): void; + + /** + * Unselect this. Unhighlight it visually. + * @return {void} + */ + unselect(): void; + } +} + + +declare module Blockly { + + interface IStyleable { + + /** + * Adds a style on the toolbox. Usually used to change the cursor. + * @param {string} style The name of the class to add. + */ + 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. + */ + removeStyle(style: string): void; + } +} + + +declare module Blockly { + + interface IToolbox extends Blockly.IRegistrable { + + /** + * Initializes the toolbox. + * @return {void} + */ + init(): void; + + /** + * Fills the toolbox with new toolbox items and removes any old contents. + * @param {!Blockly.utils.toolbox.ToolboxInfo} toolboxDef Object holding information + * for creating a toolbox. + */ + render(toolboxDef: Blockly.utils.toolbox.ToolboxInfo): void; + + /** + * Gets the width of the toolbox. + * @return {number} The width of the toolbox. + */ + getWidth(): number; + + /** + * Gets the height of the toolbox. + * @return {number} The width of the toolbox. + */ + getHeight(): number; + + /** + * Gets the toolbox flyout. + * @return {?Blockly.IFlyout} The toolbox flyout. + */ + getFlyout(): Blockly.IFlyout; + + /** + * Gets the workspace for the toolbox. + * @return {!Blockly.WorkspaceSvg} The parent workspace for the toolbox. + */ + getWorkspace(): Blockly.WorkspaceSvg; + + /** + * Gets whether or not the toolbox is horizontal. + * @return {boolean} True if the toolbox is horizontal, false if the toolbox is + * vertical. + */ + isHorizontal(): boolean; + + /** + * Positions the toolbox based on whether it is a horizontal toolbox and whether + * the workspace is in rtl. + * @return {void} + */ + position(): void; + + /** + * Handles resizing the toolbox when a toolbox item resizes. + * @return {void} + */ + handleToolboxItemResize(): void; + + /** + * Unhighlights any previously selected item. + * @return {void} + */ + clearSelection(): void; + + /** + * Updates the category colours and background colour of selected categories. + * @return {void} + */ + refreshTheme(): void; + + /** + * Updates the flyout's content without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + * @return {void} + */ + refreshSelection(): void; + + /** + * Sets the visibility of the toolbox. + * @param {boolean} isVisible True if toolbox should be visible. + */ + setVisible(isVisible: boolean): void; + + /** + * Selects the toolbox item by it's position in the list of toolbox items. + * @param {number} position The position of the item to select. + * @return {void} + */ + selectItemByPosition(position: number): void; + + /** + * Gets the selected item. + * @return {?Blockly.IToolboxItem} The selected item, or null if no item is + * currently selected. + */ + getSelectedItem(): Blockly.IToolboxItem; + + /** + * Disposes of this toolbox. + * @return {void} + */ + dispose(): void; + } +} + + +declare module Blockly { + + interface IToolboxItem { + + /** + * Initializes the toolbox item. + * This includes creating the dom and updating the state of any items based + * on the info object. + * @return {void} + * @public + */ + init(): void; + + /** + * Gets the div for the toolbox item. + * @return {?Element} The div for the toolbox item. + * @public + */ + getDiv(): Element; + + /** + * Gets a unique identifier for this toolbox item. + * @return {string} The id for the toolbox item. + * @public + */ + getId(): string; + + /** + * Gets the parent if the toolbox item is nested. + * @return {?Blockly.IToolboxItem} The parent toolbox item, or null if + * this toolbox item is not nested. + * @public + */ + getParent(): Blockly.IToolboxItem; + + /** + * Gets the nested level of the category. + * @return {number} The nested level of the category. + * @package + */ + getLevel(): number; + + /** + * Whether the toolbox item is selectable. + * @return {boolean} True if the toolbox item can be selected. + * @public + */ + isSelectable(): boolean; + + /** + * Whether the toolbox item is collapsible. + * @return {boolean} True if the toolbox item is collapsible. + * @public + */ + isCollapsible(): boolean; + + /** + * Dispose of this toolbox item. No-op by default. + * @public + */ + dispose: any /*missing*/; + } + + interface ISelectableToolboxItem extends Blockly.IToolboxItem { + + /** + * Gets the name of the toolbox item. Used for emitting events. + * @return {string} The name of the toolbox item. + * @public + */ + getName(): string; + + /** + * Gets the contents of the toolbox item. These are items that are meant to be + * displayed in the flyout. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray|string} The definition + * of items to be displayed in the flyout. + * @public + */ + getContents(): Blockly.utils.toolbox.FlyoutItemInfoArray|string; + + /** + * Sets the current toolbox item as selected. + * @param {boolean} _isSelected True if this category is selected, false + * otherwise. + * @public + */ + setSelected(_isSelected: boolean): void; + + /** + * Gets the html element that is clickable. + * The parent toolbox element receives clicks. The parent toolbox will add an id to this element so + * it can pass the onClick event to the correct toolboxItem. + * @return {!Element} The html element that receives clicks. + * @public + */ + getClickTarget(): Element; + + /** + * Handles when the toolbox item is clicked. + * @param {!Event} _e Click event to handle. + * @public + */ + onClick(_e: Event): void; + } + + interface ICollapsibleToolboxItem extends Blockly.ISelectableToolboxItem { + + /** + * Gets any children toolbox items. (ex. Gets the subcategories) + * @return {!Array} The child toolbox items. + */ + getChildToolboxItems(): Blockly.IToolboxItem[]; + + /** + * Whether the toolbox item is expanded to show its child subcategories. + * @return {boolean} True if the toolbox item shows its children, false if it + * is collapsed. + * @public + */ + isExpanded(): boolean; + + /** + * Toggles whether or not the toolbox item is expanded. + * @public + */ + toggleExpanded: any /*missing*/; + } +} + + +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 Blockly.ASTNode.types. + * @param {!Blockly.IASTNodeLocation} location The position in the AST. + * @param {!Blockly.ASTNode.Params=} opt_params Optional dictionary of options. + * @constructor + */ + constructor(type: string, location: Blockly.IASTNodeLocation, opt_params?: Blockly.ASTNode.Params); + + /** + * 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.IASTNodeLocation} The current field, connection, workspace, or + * block the cursor is on. + */ + getLocation(): Blockly.IASTNodeLocation; + + /** + * 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 { + + /** + * @typedef {{ + * wsCoordinate: Blockly.utils.Coordinate + * }} + */ + interface Params { + wsCoordinate: Blockly.utils.Coordinate + } + + /** + * 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; + + /** + * Creates an AST node for the top position on a block. + * This is either an output connection, previous connection, or 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 position on the + * block. + */ + function createTopNode(block: Blockly.Block): 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 implements Blockly.IBlocklyActionable { + + /** + * Class for a cursor. + * A cursor controls how a user navigates the Blockly AST. + * @constructor + * @extends {Blockly.Marker} + * @implements {Blockly.IBlocklyActionable} + */ + 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.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): 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 { + + 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; + + /** + * Get the workspace that is being navigated. + * @return {!Blockly.WorkspaceSvg} The workspace being navigated. + * TODO: Remove this in favor or using passed in workspaces. + */ + function getNavigationWorkspace(): Blockly.WorkspaceSvg; + + /** + * 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. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + */ + function insertFromFlyout(workspace: Blockly.WorkspaceSvg): 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.BlockSvg} block The block to move. + * @param {!Blockly.RenderedConnection} destConnection The connection to connect + * to. + * @return {boolean} Whether the connection was successful. + */ + function insertBlock(block: Blockly.BlockSvg, destConnection: Blockly.RenderedConnection): boolean; + + /** + * Set the current navigation state. + * @param {number} newState The new navigation state. + * @package + */ + function setState(newState: number): void; + + /** + * Before a block is deleted move the cursor to the appropriate position. + * @param {!Blockly.BlockSvg} deletedBlock The block that is being deleted. + */ + function moveCursorOnBlockDelete(deletedBlock: Blockly.BlockSvg): void; + + /** + * When a block that the cursor is on is mutated move the cursor to the block + * level. + * @param {!Blockly.BlockSvg} mutatedBlock The block that is being mutated. + * @package + */ + function moveCursorOnBlockMutation(mutatedBlock: Blockly.BlockSvg): void; + + /** + * Enable accessibility mode. + */ + function enableKeyboardAccessibility(): void; + + /** + * Disable accessibility mode. + */ + function disableKeyboardAccessibility(): void; + + /** + * Keyboard shortcut to go to the previous location when in keyboard navigation + * mode. + */ + function registerPrevious(): void; + + /** + * Keyboard shortcut to go to the out location when in keyboard navigation + * mode. + */ + function registerOut(): void; + + /** + * Keyboard shortcut to go to the next location when in keyboard navigation + * mode. + */ + function registerNext(): void; + + /** + * Keyboard shortcut to go to the in location when in keyboard navigation mode. + */ + function registerIn(): void; + + /** + * Keyboard shortcut to connect a block to a marked location when in keyboard + * navigation mode. + */ + function registerInsert(): void; + + /** Keyboard shortcut to mark a location when in keyboard navigation mode. */ + function registerMark(): void; + + /** + * Keyboard shortcut to disconnect two blocks when in keyboard navigation mode. + */ + function registerDisconnect(): void; + + /** + * Keyboard shortcut to focus on the toolbox when in keyboard navigation mode. + */ + function registerToolboxFocus(): void; + + /** + * Keyboard shortcut to exit the current location and focus on the workspace + * when in keyboard navigation mode. + */ + function registerExit(): void; + + /** Keyboard shortcut to turn keyboard navigation on or off. */ + function registerToggleKeyboardNav(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace to the left when in + * keyboard navigation mode. + */ + function registerWorkspaceMoveLeft(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace to the right when in + * keyboard navigation mode. + */ + function registerWorkspaceMoveRight(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace up when in keyboard + * navigation mode. + */ + function registerWorkspaceMoveUp(): void; + + /** + * Keyboard shortcut to move the cursor on the workspace down when in keyboard + * navigation mode. + */ + function registerWorkspaceMoveDown(): void; + + /** + * Registers all default keyboard shortcut items for keyboard navigation. This + * should be called once per instance of KeyboardShortcutRegistry. + * @package + */ + function registerNavigationShortcuts(): void; +} + + +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 { + + class ToolboxCategory extends ToolboxCategory__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxCategory__Class extends Blockly.ToolboxItem__Class implements Blockly.ISelectableToolboxItem { + + /** + * Class for a category in a toolbox. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The information needed + * to create a category in the toolbox. + * @param {!Blockly.IToolbox} toolbox The parent toolbox for the category. + * @param {Blockly.ICollapsibleToolboxItem=} opt_parent The parent category or null if + * the category does not have a parent. + * @constructor + * @extends {Blockly.ToolboxItem} + * @implements {Blockly.ISelectableToolboxItem} + */ + constructor(categoryDef: Blockly.utils.toolbox.CategoryInfo, toolbox: Blockly.IToolbox, opt_parent?: Blockly.ICollapsibleToolboxItem); + + /** + * The name that will be displayed on the category. + * @type {string} + * @protected + */ + name_: string; + + /** + * The colour of the category. + * @type {string} + * @protected + */ + colour_: string; + + /** + * The html container for the category. + * @type {?Element} + * @protected + */ + htmlDiv_: Element; + + /** + * The html element for the category row. + * @type {?Element} + * @protected + */ + rowDiv_: Element; + + /** + * The html element that holds children elements of the category row. + * @type {?Element} + * @protected + */ + rowContents_: Element; + + /** + * The html element for the toolbox icon. + * @type {?Element} + * @protected + */ + iconDom_: Element; + + /** + * The html element for the toolbox label. + * @type {?Element} + * @protected + */ + labelDom_: Element; + + /** + * All the css class names that are used to create a category. + * @type {!Blockly.ToolboxCategory.CssConfig} + * @protected + */ + cssConfig_: Blockly.ToolboxCategory.CssConfig; + + /** + * True if the category is meant to be hidden, false otherwise. + * @type {boolean} + * @protected + */ + isHidden_: boolean; + + /** + * True if this category is disabled, false otherwise. + * @type {boolean} + * @protected + */ + isDisabled_: boolean; + + /** + * The flyout items for this category. + * @type {string|!Blockly.utils.toolbox.FlyoutItemInfoArray} + * @protected + */ + flyoutItems_: string|Blockly.utils.toolbox.FlyoutItemInfoArray; + + /** + * Creates an object holding the default classes for a category. + * @return {!Blockly.ToolboxCategory.CssConfig} The configuration object holding + * all the CSS classes for a category. + * @protected + */ + makeDefaultCssConfig_(): Blockly.ToolboxCategory.CssConfig; + + /** + * Parses the contents array depending on if the category is a dynamic category, + * or if its contents are meant to be shown in the flyout. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The information needed + * to create a category. + * @protected + */ + parseContents_(categoryDef: Blockly.utils.toolbox.CategoryInfo): void; + + /** + * Creates the dom for the category. + * @return {!Element} The parent element for the category. + * @protected + */ + createDom_(): Element; + + /** + * Creates the container that holds the row and any subcategories. + * @return {!Element} The div that holds the icon and the label. + * @protected + */ + createContainer_(): Element; + + /** + * Creates the parent of the contents container. All clicks will happen on this + * div. + * @return {!Element} The div that holds the contents container. + * @protected + */ + createRowContainer_(): Element; + + /** + * Creates the container for the label and icon. + * This is necessary so we can set all subcategory pointer events to none. + * @return {!Element} The div that holds the icon and the label. + * @protected + */ + createRowContentsContainer_(): Element; + + /** + * Creates the span that holds the category icon. + * @return {!Element} The span that holds the category icon. + * @protected + */ + createIconDom_(): Element; + + /** + * Creates the span that holds the category label. + * This should have an id for accessibility purposes. + * @param {string} name The name of the category. + * @return {!Element} The span that holds the category label. + * @protected + */ + createLabelDom_(name: string): Element; + + /** + * Updates the colour for this category. + * @public + */ + refreshTheme(): void; + + /** + * Add the strip of colour to the toolbox category. + * @param {string} colour The category colour. + * @protected + */ + addColourBorder_(colour: string): void; + + /** + * Gets either the colour or the style for a category. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The object holding + * information on the category. + * @return {string} The hex colour for the category. + * @protected + */ + getColour_(categoryDef: Blockly.utils.toolbox.CategoryInfo): string; + + /** + * Gets the html element that is clickable. + * The parent toolbox element receives clicks. The parent toolbox will add an id to this element so + * it can pass the onClick event to the correct toolboxItem. + * @return {!Element} The html element that receives clicks. + * @public + */ + getClickTarget(): Element; + + /** + * Adds appropriate classes to display an open icon. + * @param {?Element} iconDiv The div that holds the icon. + * @protected + */ + openIcon_(iconDiv: Element): void; + + /** + * Adds appropriate classes to display a closed icon. + * @param {?Element} iconDiv The div that holds the icon. + * @protected + */ + closeIcon_(iconDiv: Element): void; + + /** + * Sets whether the category is visible or not. + * For a category to be visible its parent category must also be expanded. + * @param {boolean} isVisible True if category should be visible. + * @protected + */ + setVisible_(isVisible: boolean): void; + + /** + * Hide the category. + */ + hide(): void; + + /** + * Show the category. Category will only appear if its parent category is also + * expanded. + */ + show(): void; + + /** + * Whether the category is visible. + * A category is only visible if all of its ancestors are expanded and isHidden_ is false. + * @return {boolean} True if the category is visible, false otherwise. + * @public + */ + isVisible(): boolean; + + /** + * Whether all ancestors of a category (parent and parent's parent, etc.) are expanded. + * @return {boolean} True only if every ancestor is expanded + * @protected + */ + allAncestorsExpanded_(): boolean; + + /** + * Handles when the toolbox item is clicked. + * @param {!Event} _e Click event to handle. + * @public + */ + onClick(_e: Event): void; + + /** + * Sets the current category as selected. + * @param {boolean} isSelected True if this category is selected, false + * otherwise. + * @public + */ + setSelected(isSelected: boolean): void; + + /** + * Sets whether the category is disabled. + * @param {boolean} isDisabled True to disable the category, false otherwise. + */ + setDisabled(isDisabled: boolean): void; + + /** + * Gets the name of the category. Used for emitting events. + * @return {string} The name of the toolbox item. + * @public + */ + getName(): string; + + /** + * Gets the contents of the category. These are items that are meant to be + * displayed in the flyout. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray|string} The definition + * of items to be displayed in the flyout. + * @public + */ + getContents(): Blockly.utils.toolbox.FlyoutItemInfoArray|string; + + /** + * Updates the contents to be displayed in the flyout. + * If the flyout is open when the contents are updated, refreshSelection on the + * toolbox must also be called. + * @param {!Blockly.utils.toolbox.FlyoutDefinition|string} contents The contents + * to be displayed in the flyout. A string can be supplied to create a + * dynamic category. + * @public + */ + updateFlyoutContents(contents: Blockly.utils.toolbox.FlyoutDefinition|string): void; + } + +} + +declare module Blockly.ToolboxCategory { + + /** + * All the css class names that are used to create a category. + * @typedef {{ + * container:(string|undefined), + * row:(string|undefined), + * rowcontentcontainer:(string|undefined), + * icon:(string|undefined), + * label:(string|undefined), + * selected:(string|undefined), + * openicon:(string|undefined), + * closedicon:(string|undefined) + * }} + */ + interface CssConfig { + container: string|any /*undefined*/; + row: string|any /*undefined*/; + rowcontentcontainer: string|any /*undefined*/; + icon: string|any /*undefined*/; + label: string|any /*undefined*/; + selected: string|any /*undefined*/; + openicon: string|any /*undefined*/; + closedicon: string|any /*undefined*/ + } + + /** + * Name used for registering a toolbox category. + * @const {string} + */ + var registrationName: any /*missing*/; + + /** + * The number of pixels to move the category over at each nested level. + * @type {number} + */ + var nestedPadding: number; + + /** + * The width in pixels of the strip of colour next to each category. + * @type {number} + */ + var borderWidth: number; + + /** + * The default colour of the category. This is used as the background colour of + * the category when it is selected. + * @type {string} + */ + var defaultBackgroundColour: string; +} + + +declare module Blockly { + + class CollapsibleToolboxCategory extends CollapsibleToolboxCategory__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CollapsibleToolboxCategory__Class extends Blockly.ToolboxCategory__Class implements Blockly.ICollapsibleToolboxItem { + + /** + * Class for a category in a toolbox that can be collapsed. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryDef The information needed + * to create a category in the toolbox. + * @param {!Blockly.IToolbox} toolbox The parent toolbox for the category. + * @param {Blockly.ICollapsibleToolboxItem=} opt_parent The parent category or null if + * the category does not have a parent. + * @constructor + * @extends {Blockly.ToolboxCategory} + * @implements {Blockly.ICollapsibleToolboxItem} + */ + constructor(categoryDef: Blockly.utils.toolbox.CategoryInfo, toolbox: Blockly.IToolbox, opt_parent?: Blockly.ICollapsibleToolboxItem); + + /** + * Container for any child categories. + * @type {?Element} + * @protected + */ + subcategoriesDiv_: Element; + + /** + * Whether or not the category should display its subcategories. + * @type {boolean} + * @protected + */ + expanded_: boolean; + + /** + * The child toolbox items for this category. + * @type {!Array} + * @protected + */ + toolboxItems_: Blockly.ToolboxItem[]; + + /** + * Create the dom for all subcategories. + * @param {!Array} subcategories The subcategories. + * @return {!Element} The div holding all the subcategories. + * @protected + */ + createSubCategoriesDom_(subcategories: Blockly.ToolboxItem[]): Element; + + /** + * Opens or closes the current category. + * @param {boolean} isExpanded True to expand the category, false to close. + * @public + */ + setExpanded(isExpanded: boolean): void; + + /** + * Whether the category is expanded to show its child subcategories. + * @return {boolean} True if the toolbox item shows its children, false if it + * is collapsed. + * @public + */ + isExpanded(): boolean; + + /** + * Toggles whether or not the category is expanded. + * @public + */ + toggleExpanded(): void; + + /** + * Gets any children toolbox items. (ex. Gets the subcategories) + * @return {!Array} The child toolbox items. + */ + getChildToolboxItems(): Blockly.IToolboxItem[]; + } + +} + +declare module Blockly.CollapsibleToolboxCategory { + + /** + * All the css class names that are used to create a collapsible + * category. This is all the properties from the regular category plus contents. + * @typedef {{ + * container:?string, + * row:?string, + * rowcontentcontainer:?string, + * icon:?string, + * label:?string, + * selected:?string, + * openicon:?string, + * closedicon:?string, + * contents:?string + * }} + */ + interface CssConfig { + container: string; + row: string; + rowcontentcontainer: string; + icon: string; + label: string; + selected: string; + openicon: string; + closedicon: string; + contents: string + } + + /** + * Name used for registering a collapsible toolbox category. + * @const {string} + */ + var registrationName: any /*missing*/; +} + + +declare module Blockly { + + class ToolboxSeparator extends ToolboxSeparator__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxSeparator__Class extends Blockly.ToolboxItem__Class implements Blockly.IToolboxItem { + + /** + * Class for a toolbox separator. This is the thin visual line that appears on + * the toolbox. This item is not interactable. + * @param {!Blockly.utils.toolbox.SeparatorInfo} separatorDef The information + * needed to create a separator. + * @param {!Blockly.IToolbox} toolbox The parent toolbox for the separator. + * @constructor + * @extends {Blockly.ToolboxItem} + * @implements {Blockly.IToolboxItem} + */ + constructor(separatorDef: Blockly.utils.toolbox.SeparatorInfo, toolbox: Blockly.IToolbox); + + /** + * All the css class names that are used to create a separator. + * @type {!Blockly.ToolboxSeparator.CssConfig} + * @protected + */ + cssConfig_: Blockly.ToolboxSeparator.CssConfig; + + /** + * Creates the dom for a separator. + * @return {!Element} The parent element for the separator. + * @protected + */ + createDom_(): Element; + } + +} + +declare module Blockly.ToolboxSeparator { + + /** + * All the css class names that are used to create a separator. + * @typedef {{ + * container:(string|undefined) + * }} + */ + interface CssConfig { + container: string|any /*undefined*/ + } + + /** + * Name used for registering a toolbox separator. + * @const {string} + */ + var registrationName: any /*missing*/; +} + + +declare module Blockly { + + class Toolbox extends Toolbox__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Toolbox__Class implements Blockly.IBlocklyActionable, Blockly.IDeleteArea, Blockly.IStyleable, Blockly.IToolbox { + + /** + * Class for a Toolbox. + * Creates the toolbox's DOM. + * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to create new + * blocks. + * @constructor + * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IDeleteArea} + * @implements {Blockly.IStyleable} + * @implements {Blockly.IToolbox} + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * The workspace this toolbox is on. + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * The JSON describing the contents of this toolbox. + * @type {!Blockly.utils.toolbox.ToolboxInfo} + * @protected + */ + toolboxDef_: Blockly.utils.toolbox.ToolboxInfo; + + /** + * The html container for the toolbox. + * @type {?Element} + */ + HtmlDiv: Element; + + /** + * The html container for the contents of a toolbox. + * @type {?Element} + * @protected + */ + contentsDiv_: Element; + + /** + * The list of items in the toolbox. + * @type {!Array} + * @protected + */ + contents_: Blockly.IToolboxItem[]; + + /** + * The width of the toolbox. + * @type {number} + * @protected + */ + width_: number; + + /** + * The height of the toolbox. + * @type {number} + * @protected + */ + height_: number; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * A map from toolbox item IDs to toolbox items. + * @type {!Object} + * @protected + */ + contentMap_: { [key: string]: Blockly.IToolboxItem }; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {!Blockly.utils.toolbox.Position} + */ + toolboxPosition: Blockly.utils.toolbox.Position; + + /** + * The currently selected item. + * @type {?Blockly.ISelectableToolboxItem} + * @protected + */ + selectedItem_: Blockly.ISelectableToolboxItem; + + /** + * The previously selected item. + * @type {?Blockly.ISelectableToolboxItem} + * @protected + */ + previouslySelectedItem_: Blockly.ISelectableToolboxItem; + + /** + * Array holding info needed to unbind event handlers. + * Used for disposing. + * Ex: [[node, name, func], [node, name, func]]. + * @type {!Array} + * @protected + */ + boundEvents_: Blockly.EventData[]; + + /** + * Initializes the toolbox + * @public + */ + init(): void; + + /** + * Creates the dom for the toolbox. + * @param {!Blockly.WorkspaceSvg} workspace The workspace this toolbox is on. + * @return {!Element} The html container for the toolbox. + * @protected + */ + createDom_(workspace: Blockly.WorkspaceSvg): Element; + + /** + * Creates the container div for the toolbox. + * @return {!Element} The html container for the toolbox. + * @protected + */ + createContainer_(): Element; + + /** + * Creates the container for all the contents in the toolbox. + * @return {!Element} The html container for the toolbox contents. + * @protected + */ + createContentsContainer_(): Element; + + /** + * Adds event listeners to the toolbox container div. + * @param {!Element} container The html container for the toolbox. + * @param {!Element} contentsContainer The html container for the contents + * of the toolbox. + * @protected + */ + attachEvents_(container: Element, contentsContainer: Element): void; + + /** + * Handles on click events for when the toolbox or toolbox items are clicked. + * @param {!Event} e Click event to handle. + * @protected + */ + onClick_(e: Event): void; + + /** + * Handles key down events for the toolbox. + * @param {!KeyboardEvent} e The key down event. + * @protected + */ + onKeyDown_(e: KeyboardEvent): void; + + /** + * Creates the flyout based on the toolbox layout. + * @return {!Blockly.IFlyout} The flyout for the toolbox. + * @throws {Error} If missing a require for `Blockly.HorizontalFlyout`, + * `Blockly.VerticalFlyout`, and no flyout plugin is specified. + * @protected + */ + createFlyout_(): Blockly.IFlyout; + + /** + * Fills the toolbox with new toolbox items and removes any old contents. + * @param {!Blockly.utils.toolbox.ToolboxInfo} toolboxDef Object holding information + * for creating a toolbox. + * @package + */ + render(toolboxDef: Blockly.utils.toolbox.ToolboxInfo): void; + + /** + * Adds all the toolbox items to the toolbox. + * @param {!Array} toolboxDef Array + * holding objects containing information on the contents of the toolbox. + * @protected + */ + renderContents_(toolboxDef: Blockly.utils.toolbox.ToolboxItemInfo[]): void; + + /** + * Adds an item to the toolbox. + * @param {!Blockly.IToolboxItem} toolboxItem The item in the toolbox. + * @protected + */ + addToolboxItem_(toolboxItem: Blockly.IToolboxItem): void; + + /** + * Gets the items in the toolbox. + * @return {!Array} The list of items in the toolbox. + * @public + */ + getToolboxItems(): Blockly.IToolboxItem[]; + + /** + * 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. + * @public + */ + getClientRect(): Blockly.utils.Rect; + + /** + * Gets the toolbox item with the given id. + * @param {string} id The id of the toolbox item. + * @return {?Blockly.IToolboxItem} The toolbox item with the given id, or null if + * no item exists. + * @public + */ + getToolboxItemById(id: string): Blockly.IToolboxItem; + + /** + * Gets the width of the toolbox. + * @return {number} The width of the toolbox. + * @public + */ + getWidth(): number; + + /** + * Gets the height of the toolbox. + * @return {number} The width of the toolbox. + * @public + */ + getHeight(): number; + + /** + * Gets the toolbox flyout. + * @return {?Blockly.IFlyout} The toolbox flyout. + * @public + */ + getFlyout(): Blockly.IFlyout; + + /** + * Gets the workspace for the toolbox. + * @return {!Blockly.WorkspaceSvg} The parent workspace for the toolbox. + * @public + */ + getWorkspace(): Blockly.WorkspaceSvg; + + /** + * Gets the selected item. + * @return {?Blockly.ISelectableToolboxItem} The selected item, or null if no item is + * currently selected. + * @public + */ + getSelectedItem(): Blockly.ISelectableToolboxItem; + + /** + * Gets the previously selected item. + * @return {?Blockly.ISelectableToolboxItem} The previously selected item, or null if no + * item was previously selected. + * @public + */ + getPreviouslySelectedItem(): Blockly.ISelectableToolboxItem; + + /** + * Gets whether or not the toolbox is horizontal. + * @return {boolean} True if the toolbox is horizontal, false if the toolbox is + * vertical. + * @public + */ + isHorizontal(): boolean; + + /** + * Positions the toolbox based on whether it is a horizontal toolbox and whether + * the workspace is in rtl. + * @public + */ + position(): void; + + /** + * Handles resizing the toolbox when a toolbox item resizes. + * @package + */ + handleToolboxItemResize(): void; + + /** + * Unhighlights any previously selected item. + * @public + */ + clearSelection(): void; + + /** + * Updates the category colours and background colour of selected categories. + * @package + */ + refreshTheme(): void; + + /** + * Updates the flyout's content without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + * @public + */ + refreshSelection(): void; + + /** + * Shows or hides the toolbox. + * @param {boolean} isVisible True if toolbox should be visible. + * @public + */ + setVisible(isVisible: boolean): void; + + /** + * Sets the given item as selected. + * No-op if the item is not selectable. + * @param {?Blockly.IToolboxItem} newItem The toolbox item to select. + * @public + */ + setSelectedItem(newItem: Blockly.IToolboxItem): void; + + /** + * Decides whether the old item should be deselected. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected + * toolbox item. + * @param {?Blockly.ISelectableToolboxItem} newItem The newly selected toolbox + * item. + * @return {boolean} True if the old item should be deselected, false otherwise. + * @protected + */ + shouldDeselectItem_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): boolean; + + /** + * Decides whether the new item should be selected. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected + * toolbox item. + * @param {?Blockly.ISelectableToolboxItem} newItem The newly selected toolbox + * item. + * @return {boolean} True if the new item should be selected, false otherwise. + * @protected + */ + shouldSelectItem_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): boolean; + + /** + * Deselects the given item, marks it as unselected, and updates aria state. + * @param {!Blockly.ISelectableToolboxItem} item The previously selected + * toolbox item which should be deselected. + * @protected + */ + deselectItem_(item: Blockly.ISelectableToolboxItem): void; + + /** + * Selects the given item, marks it selected, and updates aria state. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected + * toolbox item. + * @param {!Blockly.ISelectableToolboxItem} newItem The newly selected toolbox + * item. + * @protected + */ + selectItem_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): void; + + /** + * Selects the toolbox item by its position in the list of toolbox items. + * @param {number} position The position of the item to select. + * @public + */ + selectItemByPosition(position: number): void; + + /** + * Decides whether to hide or show the flyout depending on the selected item. + * @param {?Blockly.ISelectableToolboxItem} oldItem The previously selected toolbox item. + * @param {?Blockly.ISelectableToolboxItem} newItem The newly selected toolbox item. + * @protected + */ + updateFlyout_(oldItem: Blockly.ISelectableToolboxItem, newItem: Blockly.ISelectableToolboxItem): void; + + /** + * Handles the given Blockly action on a toolbox. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.ShortcutRegistry.KeyboardShortcut): boolean; + + /** + * Disposes of this toolbox. + * @public + */ + dispose(): void; + } + +} + + +declare module Blockly { + + class ToolboxItem extends ToolboxItem__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ToolboxItem__Class implements Blockly.IToolboxItem { + + /** + * Class for an item in the toolbox. + * @param {!Blockly.utils.toolbox.ToolboxItemInfo} toolboxItemDef The JSON defining the + * toolbox item. + * @param {!Blockly.IToolbox} toolbox The toolbox that holds the toolbox item. + * @param {Blockly.ICollapsibleToolboxItem=} opt_parent The parent toolbox item + * or null if the category does not have a parent. + * @constructor + * @implements {Blockly.IToolboxItem} + */ + constructor(toolboxItemDef: Blockly.utils.toolbox.ToolboxItemInfo, toolbox: Blockly.IToolbox, opt_parent?: Blockly.ICollapsibleToolboxItem); + + /** + * The id for the category. + * @type {string} + * @protected + */ + id_: string; + + /** + * The parent of the category. + * @type {?Blockly.ICollapsibleToolboxItem} + * @protected + */ + parent_: Blockly.ICollapsibleToolboxItem; + + /** + * The level that the category is nested at. + * @type {number} + * @protected + */ + level_: number; + + /** + * The JSON definition of the toolbox item. + * @type {!Blockly.utils.toolbox.ToolboxItemInfo} + * @protected + */ + toolboxItemDef_: Blockly.utils.toolbox.ToolboxItemInfo; + + /** + * The toolbox this category belongs to. + * @type {!Blockly.IToolbox} + * @protected + */ + parentToolbox_: Blockly.IToolbox; + + /** + * The workspace of the parent toolbox. + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * Initializes the toolbox item. + * This includes creating the dom and updating the state of any items based + * on the info object. + * @public + */ + init(): void; + + /** + * Gets the div for the toolbox item. + * @return {?Element} The div for the toolbox item. + * @public + */ + getDiv(): Element; + + /** + * Gets a unique identifier for this toolbox item. + * @return {string} The id for the toolbox item. + * @public + */ + getId(): string; + + /** + * Gets the parent if the toolbox item is nested. + * @return {?Blockly.IToolboxItem} The parent toolbox item, or null if + * this toolbox item is not nested. + * @public + */ + getParent(): Blockly.IToolboxItem; + + /** + * Gets the nested level of the category. + * @return {number} The nested level of the category. + * @package + */ + getLevel(): number; + + /** + * Whether the toolbox item is selectable. + * @return {boolean} True if the toolbox item can be selected. + * @public + */ + isSelectable(): boolean; + + /** + * Whether the toolbox item is collapsible. + * @return {boolean} True if the toolbox item is collapsible. + * @public + */ + isCollapsible(): boolean; + + /** + * Dispose of this toolbox item. No-op by default. + * @public + */ + dispose(): void; + } + +} + + +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, DISABLED, 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.deprecation { + + /** + * Warn developers that a function is deprecated. + * @param {string} functionName The name of the function. + * @param {string} deprecationDate The date when the function was deprecated. + * Prefer 'month yyyy' or 'quarter yyyy' format. + * @param {string} deletionDate The date when the function will be deleted, in + * the same format as the deprecation date. + * @param {string=} opt_use The name of a function to use instead, if any. + * @package + */ + function warn(functionName: string, deprecationDate: string, deletionDate: string, opt_use?: string): void; +} + + +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 NodeType { ELEMENT_NODE, TEXT_NODE, COMMENT_NODE, DOCUMENT_POSITION_CONTAINED_BY } + + /** + * Helper method for creating SVG elements. + * @param {string|Blockly.utils.Svg} name Element's tag name. + * @param {!Object} attrs Dictionary of attribute names and values. + * @param {Element=} opt_parent Optional parent on which to append the element. + * @return {T} Newly created SVG element. The return type is {!SVGElement} if + * name is a string or a more specific type if it a member of + * Blockly.utils.Svg + * @template T + */ + function createSvgElement(name: string|Blockly.utils.Svg, attrs: Object, opt_parent?: Element): T; + + /** + * 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; + + /** + * Removes multiple calsses from an element. + * @param {!Element} element DOM element to remove classes from. + * @param {string} classNames A string of one or multiple class names for an + * element. + */ + function removeClasses(element: Element, classNames: string): void; + + /** + * 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; + + /** + * 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. + * This method is similar to ``getFastTextWidth`` but expects the font size + * parameter to be a string. + * @param {!Element} textElement An SVG 'text' element. + * @param {string} 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 getFastTextWidthWithSizeString(textElement: Element, fontSize: string, fontWeight: string, fontFamily: string): number; + + /** + * Measure a font's metrics. The height and baseline values. + * @param {string} text Text to measure the font dimensions of. + * @param {string} fontSize The font size to use. + * @param {string} fontWeight The font weight to use. + * @param {string} fontFamily The font family to use. + * @return {{height: number, baseline: number}} Font measurements. + */ + function measureFontMetrics(text: string, fontSize: string, fontWeight: string, fontFamily: string): { height: number; baseline: 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 { + + /** + * @record + */ + function Metrics(): void; +} + + +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; + + /** + * Complete a deep merge of all members of a source object with a target object. + * @param {!Object} target Target. + * @param {!Object} source Source. + * @return {!Object} The resulting object. + */ + function deepMerge(target: Object, source: Object): Object; + + /** + * 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 { + + class Svg extends Svg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Svg__Class { + + /** + * A name with the type of the SVG element stored in the generic. + * @param {string} tagName The SVG element tag name. + * @constructor + * @template T + * @private + */ + constructor(tagName: string); + } + +} + +declare module Blockly.utils.Svg { + + /** @type {!Blockly.utils.Svg} + * @package + */ + var ANIMATE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var CIRCLE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var CLIPPATH: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var DEFS: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FECOMPOSITE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FECOMPONENTTRANSFER: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEFLOOD: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEFUNCA: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEGAUSSIANBLUR: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FEPOINTLIGHT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FESPECULARLIGHTING: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FILTER: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var FOREIGNOBJECT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var G: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var IMAGE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var LINE: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var PATH: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var PATTERN: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var POLYGON: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var RECT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var SVG: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var TEXT: Blockly.utils.Svg; + + /** @type {!Blockly.utils.Svg} + * @package + */ + var TSPAN: Blockly.utils.Svg; +} + + +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 cubic 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.toolbox { + + /** + * The information needed to create a block in the toolbox. + * @typedef {{ + * kind:string, + * blockxml:(string|!Node|undefined), + * type:(string|undefined), + * gap:(string|number|undefined), + * disabled: (string|boolean|undefined) + * }} + */ + interface BlockInfo { + kind: string; + blockxml: string|Node|any /*undefined*/; + type: string|any /*undefined*/; + gap: string|number|any /*undefined*/; + disabled: string|boolean|any /*undefined*/ + } + + /** + * The information needed to create a separator in the toolbox. + * @typedef {{ + * kind:string, + * id:(string|undefined), + * gap:(number|undefined), + * cssconfig:(!Blockly.ToolboxSeparator.CssConfig|undefined) + * }} + */ + interface SeparatorInfo { + kind: string; + id: string|any /*undefined*/; + gap: number|any /*undefined*/; + cssconfig: Blockly.ToolboxSeparator.CssConfig|any /*undefined*/ + } + + /** + * The information needed to create a button in the toolbox. + * @typedef {{ + * kind:string, + * text:string, + * callbackkey:string + * }} + */ + interface ButtonInfo { + kind: string; + text: string; + callbackkey: string + } + + /** + * The information needed to create a label in the toolbox. + * @typedef {{ + * kind:string, + * text:string, + * id:(string|undefined) + * }} + */ + interface LabelInfo { + kind: string; + text: string; + id: string|any /*undefined*/ + } + + /** + * The information needed to create either a button or a label in the flyout. + * @typedef {Blockly.utils.toolbox.ButtonInfo| + * Blockly.utils.toolbox.LabelInfo} + */ + type ButtonOrLabelInfo = Blockly.utils.toolbox.ButtonInfo|Blockly.utils.toolbox.LabelInfo; + + /** + * The information needed to create a category in the toolbox. + * @typedef {{ + * kind:string, + * name:string, + * contents:!Array, + * id:(string|undefined), + * categorystyle:(string|undefined), + * colour:(string|undefined), + * cssconfig:(!Blockly.ToolboxCategory.CssConfig|undefined), + * hidden:(string|undefined) + * }} + */ + interface StaticCategoryInfo { + kind: string; + name: string; + contents: Blockly.utils.toolbox.ToolboxItemInfo[]; + id: string|any /*undefined*/; + categorystyle: string|any /*undefined*/; + colour: string|any /*undefined*/; + cssconfig: Blockly.ToolboxCategory.CssConfig|any /*undefined*/; + hidden: string|any /*undefined*/ + } + + /** + * The information needed to create a custom category. + * @typedef {{ + * kind:string, + * custom:string, + * id:(string|undefined), + * categorystyle:(string|undefined), + * colour:(string|undefined), + * cssconfig:(!Blockly.ToolboxCategory.CssConfig|undefined), + * hidden:(string|undefined) + * }} + */ + interface DynamicCategoryInfo { + kind: string; + custom: string; + id: string|any /*undefined*/; + categorystyle: string|any /*undefined*/; + colour: string|any /*undefined*/; + cssconfig: Blockly.ToolboxCategory.CssConfig|any /*undefined*/; + hidden: string|any /*undefined*/ + } + + /** + * The information needed to create either a dynamic or static category. + * @typedef {Blockly.utils.toolbox.StaticCategoryInfo| + * Blockly.utils.toolbox.DynamicCategoryInfo} + */ + type CategoryInfo = Blockly.utils.toolbox.StaticCategoryInfo|Blockly.utils.toolbox.DynamicCategoryInfo; + + /** + * Any information that can be used to create an item in the toolbox. + * @typedef {Blockly.utils.toolbox.FlyoutItemInfo| + * Blockly.utils.toolbox.StaticCategoryInfo} + */ + type ToolboxItemInfo = Blockly.utils.toolbox.FlyoutItemInfo|Blockly.utils.toolbox.StaticCategoryInfo; + + /** + * All the different types that can be displayed in a flyout. + * @typedef {Blockly.utils.toolbox.BlockInfo| + * Blockly.utils.toolbox.SeparatorInfo| + * Blockly.utils.toolbox.ButtonInfo| + * Blockly.utils.toolbox.LabelInfo| + * Blockly.utils.toolbox.DynamicCategoryInfo} + */ + type FlyoutItemInfo = Blockly.utils.toolbox.BlockInfo|Blockly.utils.toolbox.SeparatorInfo|Blockly.utils.toolbox.ButtonInfo|Blockly.utils.toolbox.LabelInfo|Blockly.utils.toolbox.DynamicCategoryInfo; + + /** + * The JSON definition of a toolbox. + * @typedef {{ + * kind:(string|undefined), + * contents:!Array + * }} + */ + interface ToolboxInfo { + kind: string|any /*undefined*/; + contents: Blockly.utils.toolbox.ToolboxItemInfo[] + } + + /** + * An array holding flyout items. + * @typedef { + * Array + * } + */ + interface FlyoutItemInfoArray extends Array { } + + /** + * All of the different types that can create a toolbox. + * @typedef {Node| + * Blockly.utils.toolbox.ToolboxInfo| + * string} + */ + type ToolboxDefinition = Node|Blockly.utils.toolbox.ToolboxInfo|string; + + /** + * All of the different types that can be used to show items in a flyout. + * @typedef {Blockly.utils.toolbox.FlyoutItemInfoArray| + * NodeList| + * Blockly.utils.toolbox.ToolboxInfo| + * Array} + */ + type FlyoutDefinition = Blockly.utils.toolbox.FlyoutItemInfoArray|NodeList|Blockly.utils.toolbox.ToolboxInfo|Node[]; + + /** + * The name used to identify a toolbox that has category like items. + * This only needs to be used if a toolbox wants to be treated like a category + * toolbox but does not actually contain any toolbox items with the kind + * 'category'. + * @const {string} + */ + var CATEGORY_TOOLBOX_KIND: any /*missing*/; + + /** + * The name used to identify a toolbox that has no categories and is displayed + * as a simple flyout displaying blocks, buttons, or labels. + * @const {string} + */ + var FLYOUT_TOOLBOX_KIND: any /*missing*/; + + /** + * Position of the the toolbox relative to the flyout. + * @enum {number} + */ + enum Position { TOP, BOTTOM, LEFT, RIGHT } + + /** + * Converts the toolbox definition into toolbox JSON. + * @param {?Blockly.utils.toolbox.ToolboxDefinition} toolboxDef The definition + * of the toolbox in one of its many forms. + * @return {?Blockly.utils.toolbox.ToolboxInfo} Object holding information + * for creating a toolbox. + * @package + */ + function convertToolboxDefToJson(toolboxDef: Blockly.utils.toolbox.ToolboxDefinition): Blockly.utils.toolbox.ToolboxInfo; + + /** + * Converts the flyout definition into a list of flyout items. + * @param {?Blockly.utils.toolbox.FlyoutDefinition} flyoutDef The definition of + * the flyout in one of its many forms. + * @return {!Blockly.utils.toolbox.FlyoutItemInfoArray} A list of flyout items. + * @package + */ + function convertFlyoutDefToJsonArray(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition): Blockly.utils.toolbox.FlyoutItemInfoArray; + + /** + * Whether or not the toolbox definition has categories. + * @param {?Blockly.utils.toolbox.ToolboxInfo} toolboxJson Object holding + * information for creating a toolbox. + * @return {boolean} True if the toolbox has categories. + * @package + */ + function hasCategories(toolboxJson: Blockly.utils.toolbox.ToolboxInfo): boolean; + + /** + * Whether or not the category is collapsible. + * @param {!Blockly.utils.toolbox.CategoryInfo} categoryInfo Object holing + * information for creating a category. + * @return {boolean} True if the category has subcategories. + * @package + */ + function isCategoryCollapsible(categoryInfo: Blockly.utils.toolbox.CategoryInfo): boolean; + + /** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {?Node|?string} toolboxDef DOM tree of blocks, or text representation + * of same. + * @return {?Node} DOM tree of blocks, or null. + */ + function parseToolboxTree(toolboxDef: Node|string): Node; +} + + +declare module Blockly.utils.userAgent { + + /** @const {boolean} */ + var IE: any /*missing*/; + + /** @const {boolean} */ + var EDGE: any /*missing*/; + + /** @const {boolean} */ + var JAVA_FX: any /*missing*/; + + /** @const {boolean} */ + var CHROME: any /*missing*/; + + /** @const {boolean} */ + var WEBKIT: any /*missing*/; + + /** @const {boolean} */ + var GECKO: any /*missing*/; + + /** @const {boolean} */ + var ANDROID: any /*missing*/; + + /** @const {boolean} */ + var IPAD: any /*missing*/; + + /** @const {boolean} */ + var IPOD: any /*missing*/; + + /** @const {boolean} */ + var IPHONE: any /*missing*/; + + /** @const {boolean} */ + var MAC: any /*missing*/; + + /** @const {boolean} */ + var TABLET: any /*missing*/; + + /** @const {boolean} */ + var MOBILE: any /*missing*/; +} + + +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.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 associated 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.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. + * @param {!Blockly.Theme} theme The workspace theme object. + * @param {Object=} opt_rendererOverrides Rendering constant overrides. + * @return {!Blockly.blockRendering.Renderer} The new instance of a renderer. + * Already initialized. + * @package + */ + function init(name: string, theme: Blockly.Theme, opt_rendererOverrides?: Object): 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; + + /** + * Text font weight. + * @type {string} + */ + FIELD_TEXT_FONTWEIGHT: string; + + /** + * Text font family. + * @type {string} + */ + FIELD_TEXT_FONTFAMILY: string; + + /** + * Height of text. This constant is dynamically set in ``setFontConstants_`` + * to be the height of the text based on the font used. + * @type {number} + */ + FIELD_TEXT_HEIGHT: number; + + /** + * Text baseline. This constant is dynamically set in ``setFontConstants_`` + * to be the baseline of the text based on the font used. + * @type {number} + */ + FIELD_TEXT_BASELINE: number; + + /** + * 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; + + /** + * 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 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} + * @package + */ + 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; + + /** + * The ID of the debug filter, or the empty string if no pattern is set. + * @type {string} + * @package + */ + debugFilterId: 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; + + /** + * The main colour of insertion markers, in hex. The block is rendered a + * transparent grey by changing the fill opacity in CSS. + * @type {string} + * @package + */ + INSERTION_MARKER_COLOUR: string; + + /** + * The insertion marker opacity. + * @type {number} + * @package + */ + INSERTION_MARKER_OPACITY: number; + + /** + * 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 + */ + setTheme(theme: Blockly.Theme): void; + + /** + * The block styles map. + * @type {Object.} + * @package + */ + blockStyles: { [key: string]: Blockly.Theme.BlockStyle }; + + /** + * Sets dynamic properties that depend on other values or theme properties. + * @param {!Blockly.Theme} theme The current workspace theme. + * @protected + */ + setDynamicProperties_(theme: Blockly.Theme): void; + + /** + * Set constants related to fonts. + * @param {!Blockly.Theme} theme The current workspace theme. + * @protected + */ + setFontConstants_(theme: Blockly.Theme): void; + + /** + * Set constants from a theme's component styles. + * @param {!Blockly.Theme} theme The current workspace theme. + * @protected + */ + setComponentConstants_(theme: Blockly.Theme): void; + + /** + * 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. + * @param {string} tagName The name to use for the CSS style tag. + * @param {string} selector The CSS selector to use. + * @suppress {strictModuleDepCheck} Debug renderer only included in playground. + * @package + */ + createDom(svg: SVGElement, tagName: string, selector: string): void; + + /** + * Inject renderer specific CSS into the page. + * @param {string} tagName The name of the style tag to use. + * @param {string} selector The CSS selector to use. + * @protected + */ + injectCSS_(tagName: string, selector: string): void; + + /** + * Get any renderer specific CSS to inject when the renderer is initialized. + * @param {string} selector CSS selector to use. + * @return {!Array.} Array of CSS strings. + * @protected + */ + getCSS_(selector: 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. + * @param {!Blockly.blockRendering.ConstantProvider} constants The renderer's + * constants. + * @package + * @constructor + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * 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; + + /** + * Show a debug filter to highlight that a block has been rendered. + * @param {!SVGElement} svgPath The block's svg path. + * @package + */ + drawRender(svgPath: SVGElement): 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 { + + /** + * The primary path of the block. + * @type {!SVGElement} + */ + svgPath: SVGElement; + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + */ + constants: Blockly.blockRendering.ConstantProvider; + + /** + * The primary path of the block. + * @type {!Blockly.Theme.BlockStyle} + */ + style: Blockly.Theme.BlockStyle; + + /** + * Holds the cursors svg element when the cursor is attached to the block. + * This is null if there is no cursor on the block. + * @type {SVGElement} + */ + cursorSvg: SVGElement; + + /** + * Holds the markers svg element when the marker is attached to the block. + * This is null if there is no marker on the block. + * @type {SVGElement} + */ + markerSvg: SVGElement; + + /** + * 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 + */ + updateReplacementFade(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[]; + + /** + * An array of input rows on the block. + * @type {!Array.} + */ + inputRows: Blockly.blockRendering.InputRow[]; + + /** + * 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; + + /** + * Get the marker. + * @return {!Blockly.Marker} The marker to draw for. + */ + getMarker(): Blockly.Marker; + + /** + * 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.IASTNodeLocationSvg} newParent The workspace, field, or + * block that the marker SVG element should be attached to. + * @protected + */ + setParent_(newParent: Blockly.IASTNodeLocationSvg): 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. + */ + 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; + + /** + * Position and display the marker for a block. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithBlock_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a previous connection. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithPrevious_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for an output connection. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithOutput_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a workspace coordinate. + * This is a horizontal line. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithCoordinates_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a field. + * This is a box around the field. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithField_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for an input. + * This is a puzzle piece. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithInput_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a next connection. + * This is a horizontal line. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithNext_(curNode: Blockly.ASTNode): void; + + /** + * Position and display the marker for a stack. + * This is a box with extra padding around the entire stack of blocks. + * @param {!Blockly.ASTNode} curNode The node to draw the marker for. + * @protected + */ + showWithStack_(curNode: Blockly.ASTNode): void; + + /** + * Show the current marker. + * @protected + */ + showCurrent_(): void; + + /** + * Position the marker for a block. + * Displays an outline of the top half of a rectangle around a block. + * @param {number} width The width of the block. + * @param {number} markerOffset The extra padding for around the block. + * @param {number} markerHeight The height of the marker. + * @protected + */ + positionBlock_(width: number, markerOffset: number, markerHeight: number): void; + + /** + * Position the marker for an input connection. + * Displays a filled in puzzle piece. + * @param {!Blockly.RenderedConnection} connection The connection to position + * marker around. + * @protected + */ + positionInput_(connection: Blockly.RenderedConnection): 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; + + /** + * Position the marker for an output connection. + * Displays a puzzle outline and the top and bottom path. + * @param {number} width The width of the block. + * @param {number} height The height of the block. + * @param {!Object} connectionShape The shape object for the connection. + * @protected + */ + positionOutput_(width: number, height: number, connectionShape: Object): void; + + /** + * Position the marker for a previous connection. + * Displays a half rectangle with a notch in the top to represent the previous + * connection. + * @param {number} width The width of the block. + * @param {number} markerOffset The offset of the marker from around the block. + * @param {number} markerHeight The height of the marker. + * @param {!Object} connectionShape The shape object for the connection. + * @protected + */ + positionPrevious_(width: number, markerOffset: number, markerHeight: number, connectionShape: Object): 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. + */ + hide(): 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; + + /** + * Apply the marker's colour. + * @param {!Blockly.ASTNode} _curNode The node that we want to draw the marker + * for. + * @protected + */ + applyColour_(_curNode: Blockly.ASTNode): void; + + /** + * Dispose of this marker. + */ + 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. + * @const {number} + */ + var HEIGHT_MULTIPLIER: any /*missing*/; +} + + +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} + * @package + */ + 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; + + /** + * Holds the cursors svg element when the cursor is attached to the block. + * This is null if there is no cursor on the block. + * @type {SVGElement} + * @package + */ + cursorSvg: SVGElement; + + /** + * Holds the markers svg element when the marker is attached to the block. + * This is null if there is no marker on the block. + * @type {SVGElement} + * @package + */ + markerSvg: SVGElement; + + /** + * 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 + */ + updateReplacementFade(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 implements Blockly.IRegistrable { + + /** + * The base class for a block renderer. + * @param {string} name The renderer name. + * @package + * @constructor + * @implements {Blockly.IRegistrable} + */ + constructor(name: string); + + /** + * The renderer name. + * @type {string} + * @package + */ + name: string; + + /** + * Rendering constant overrides, passed in through options. + * @type {?Object} + * @package + */ + overrides: Object; + + /** + * Gets the class name that identifies this renderer. + * @return {string} The CSS class name. + * @package + */ + getClassName(): string; + + /** + * Initialize the renderer. + * @param {!Blockly.Theme} theme The workspace theme object. + * @param {Object=} opt_rendererOverrides Rendering constant overrides. + * @package + */ + init(theme: Blockly.Theme, opt_rendererOverrides?: Object): void; + + /** + * Create any DOM elements that this renderer needs. + * @param {!SVGElement} svg The root of the workspace's SVG. + * @param {!Blockly.Theme} theme The workspace theme object. + * @package + */ + createDom(svg: SVGElement, theme: Blockly.Theme): void; + + /** + * Refresh the renderer after a theme change. + * @param {!SVGElement} svg The root of the workspace's SVG. + * @param {!Blockly.Theme} theme The workspace theme object. + * @package + */ + refreshDom(svg: SVGElement, theme: Blockly.Theme): void; + + /** + * Dispose of this renderer. + * Delete all DOM elements that this renderer and its constants created. + * @package + */ + dispose(): 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; + + /** + * Checks if an orphaned block can connect to the "end" of the topBlock's + * block-clump. If the clump is a row the end is the last input. If the clump + * is a stack, the end is the last next connection. If the clump is neither, + * then this returns false. + * @param {!Blockly.BlockSvg} topBlock The top block of the block clump we want to try and + * connect to. + * @param {!Blockly.BlockSvg} orphanBlock The orphan block that wants to find + * a home. + * @param {number} localType The type of the connection being dragged. + * @return {boolean} Whether there is a home for the orphan or not. + * @package + */ + orphanCanConnectAtEnd(topBlock: Blockly.BlockSvg, orphanBlock: Blockly.BlockSvg, localType: number): boolean; + + /** + * Chooses a connection preview method based on the available connection, the + * current dragged connection, and the block being dragged. + * @param {!Blockly.RenderedConnection} closest The available connection. + * @param {!Blockly.RenderedConnection} local The connection currently being + * dragged. + * @param {!Blockly.BlockSvg} topBlock The block currently being dragged. + * @return {!Blockly.InsertionMarkerManager.PREVIEW_TYPE} The preview type + * to display. + * @package + */ + getConnectionPreviewMethod(closest: Blockly.RenderedConnection, local: Blockly.RenderedConnection, topBlock: Blockly.BlockSvg): Blockly.InsertionMarkerManager.PREVIEW_TYPE; + + /** + * Render the block. + * @param {!Blockly.BlockSvg} block The block to render. + * @package + */ + render(block: Blockly.BlockSvg): void; + } + +} + + +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/static/js/typings/blocks.d.ts b/static/js/typings/blocks.d.ts new file mode 100644 index 0000000..851c08d --- /dev/null +++ b/static/js/typings/blocks.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly Blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Blocks; diff --git a/static/js/typings/core.d.ts b/static/js/typings/core.d.ts new file mode 100644 index 0000000..5453fd2 --- /dev/null +++ b/static/js/typings/core.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly core. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './blockly'; +export = Blockly; diff --git a/static/js/typings/dart.d.ts b/static/js/typings/dart.d.ts new file mode 100644 index 0000000..c04eda2 --- /dev/null +++ b/static/js/typings/dart.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Dart generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/typings/index.d.ts b/static/js/typings/index.d.ts new file mode 100644 index 0000000..10324ba --- /dev/null +++ b/static/js/typings/index.d.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// +/// +/// +/// + +import * as Blockly from './core'; +import './blocks'; +import './javascript'; +import './msg/en'; + +export = Blockly; diff --git a/static/js/typings/javascript.d.ts b/static/js/typings/javascript.d.ts new file mode 100644 index 0000000..f1a14ba --- /dev/null +++ b/static/js/typings/javascript.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the JavaScript generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/typings/lua.d.ts b/static/js/typings/lua.d.ts new file mode 100644 index 0000000..a5170bc --- /dev/null +++ b/static/js/typings/lua.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Lua generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/typings/msg/ab.d.ts b/static/js/typings/msg/ab.d.ts new file mode 100644 index 0000000..eb87b9b --- /dev/null +++ b/static/js/typings/msg/ab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ar.d.ts b/static/js/typings/msg/ar.d.ts new file mode 100644 index 0000000..e2435d7 --- /dev/null +++ b/static/js/typings/msg/ar.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ar locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/az.d.ts b/static/js/typings/msg/az.d.ts new file mode 100644 index 0000000..a877781 --- /dev/null +++ b/static/js/typings/msg/az.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly az locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ba.d.ts b/static/js/typings/msg/ba.d.ts new file mode 100644 index 0000000..21cc21c --- /dev/null +++ b/static/js/typings/msg/ba.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ba locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/bcc.d.ts b/static/js/typings/msg/bcc.d.ts new file mode 100644 index 0000000..e60e54d --- /dev/null +++ b/static/js/typings/msg/bcc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly bcc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/be-tarask.d.ts b/static/js/typings/msg/be-tarask.d.ts new file mode 100644 index 0000000..91640bb --- /dev/null +++ b/static/js/typings/msg/be-tarask.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly be-tarask locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/be.d.ts b/static/js/typings/msg/be.d.ts new file mode 100644 index 0000000..0857b63 --- /dev/null +++ b/static/js/typings/msg/be.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly be locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/bg.d.ts b/static/js/typings/msg/bg.d.ts new file mode 100644 index 0000000..8190515 --- /dev/null +++ b/static/js/typings/msg/bg.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly bg locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/bn.d.ts b/static/js/typings/msg/bn.d.ts new file mode 100644 index 0000000..8207499 --- /dev/null +++ b/static/js/typings/msg/bn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly bn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/br.d.ts b/static/js/typings/msg/br.d.ts new file mode 100644 index 0000000..319e7ad --- /dev/null +++ b/static/js/typings/msg/br.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly br locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ca.d.ts b/static/js/typings/msg/ca.d.ts new file mode 100644 index 0000000..a89b937 --- /dev/null +++ b/static/js/typings/msg/ca.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ca locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/constants.d.ts b/static/js/typings/msg/constants.d.ts new file mode 100644 index 0000000..41cb98e --- /dev/null +++ b/static/js/typings/msg/constants.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly constants locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/cs.d.ts b/static/js/typings/msg/cs.d.ts new file mode 100644 index 0000000..fd8998d --- /dev/null +++ b/static/js/typings/msg/cs.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly cs locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/da.d.ts b/static/js/typings/msg/da.d.ts new file mode 100644 index 0000000..9ae9615 --- /dev/null +++ b/static/js/typings/msg/da.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly da locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/de.d.ts b/static/js/typings/msg/de.d.ts new file mode 100644 index 0000000..84004ff --- /dev/null +++ b/static/js/typings/msg/de.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly de locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/diq.d.ts b/static/js/typings/msg/diq.d.ts new file mode 100644 index 0000000..2dadf5b --- /dev/null +++ b/static/js/typings/msg/diq.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly diq locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/dty.d.ts b/static/js/typings/msg/dty.d.ts new file mode 100644 index 0000000..995d93a --- /dev/null +++ b/static/js/typings/msg/dty.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly dty locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ee.d.ts b/static/js/typings/msg/ee.d.ts new file mode 100644 index 0000000..436e5b9 --- /dev/null +++ b/static/js/typings/msg/ee.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ee locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/el.d.ts b/static/js/typings/msg/el.d.ts new file mode 100644 index 0000000..981a987 --- /dev/null +++ b/static/js/typings/msg/el.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly el locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/en-gb.d.ts b/static/js/typings/msg/en-gb.d.ts new file mode 100644 index 0000000..59032a4 --- /dev/null +++ b/static/js/typings/msg/en-gb.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly en-gb locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/en.d.ts b/static/js/typings/msg/en.d.ts new file mode 100644 index 0000000..256aa7d --- /dev/null +++ b/static/js/typings/msg/en.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly en locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/eo.d.ts b/static/js/typings/msg/eo.d.ts new file mode 100644 index 0000000..a9b4004 --- /dev/null +++ b/static/js/typings/msg/eo.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly eo locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/es.d.ts b/static/js/typings/msg/es.d.ts new file mode 100644 index 0000000..4dd0c58 --- /dev/null +++ b/static/js/typings/msg/es.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly es locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/et.d.ts b/static/js/typings/msg/et.d.ts new file mode 100644 index 0000000..01541ff --- /dev/null +++ b/static/js/typings/msg/et.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly et locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/eu.d.ts b/static/js/typings/msg/eu.d.ts new file mode 100644 index 0000000..1d0e852 --- /dev/null +++ b/static/js/typings/msg/eu.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly eu locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/fa.d.ts b/static/js/typings/msg/fa.d.ts new file mode 100644 index 0000000..0e92979 --- /dev/null +++ b/static/js/typings/msg/fa.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly fa locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/fi.d.ts b/static/js/typings/msg/fi.d.ts new file mode 100644 index 0000000..dad65e9 --- /dev/null +++ b/static/js/typings/msg/fi.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly fi locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/fr.d.ts b/static/js/typings/msg/fr.d.ts new file mode 100644 index 0000000..6014c3b --- /dev/null +++ b/static/js/typings/msg/fr.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly fr locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/gl.d.ts b/static/js/typings/msg/gl.d.ts new file mode 100644 index 0000000..874c328 --- /dev/null +++ b/static/js/typings/msg/gl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly gl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/gor.d.ts b/static/js/typings/msg/gor.d.ts new file mode 100644 index 0000000..69c2999 --- /dev/null +++ b/static/js/typings/msg/gor.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly gor locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ha.d.ts b/static/js/typings/msg/ha.d.ts new file mode 100644 index 0000000..f5e92a6 --- /dev/null +++ b/static/js/typings/msg/ha.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ha locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/he.d.ts b/static/js/typings/msg/he.d.ts new file mode 100644 index 0000000..deb61f9 --- /dev/null +++ b/static/js/typings/msg/he.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly he locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/hi.d.ts b/static/js/typings/msg/hi.d.ts new file mode 100644 index 0000000..5abcff5 --- /dev/null +++ b/static/js/typings/msg/hi.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hi locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/hrx.d.ts b/static/js/typings/msg/hrx.d.ts new file mode 100644 index 0000000..7859161 --- /dev/null +++ b/static/js/typings/msg/hrx.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hrx locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/hu.d.ts b/static/js/typings/msg/hu.d.ts new file mode 100644 index 0000000..3f87f84 --- /dev/null +++ b/static/js/typings/msg/hu.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hu locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/hy.d.ts b/static/js/typings/msg/hy.d.ts new file mode 100644 index 0000000..ee726e2 --- /dev/null +++ b/static/js/typings/msg/hy.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly hy locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ia.d.ts b/static/js/typings/msg/ia.d.ts new file mode 100644 index 0000000..b0324c9 --- /dev/null +++ b/static/js/typings/msg/ia.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ia locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/id.d.ts b/static/js/typings/msg/id.d.ts new file mode 100644 index 0000000..ddb57b7 --- /dev/null +++ b/static/js/typings/msg/id.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly id locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ig.d.ts b/static/js/typings/msg/ig.d.ts new file mode 100644 index 0000000..90e5c7b --- /dev/null +++ b/static/js/typings/msg/ig.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ig locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/is.d.ts b/static/js/typings/msg/is.d.ts new file mode 100644 index 0000000..88bfa07 --- /dev/null +++ b/static/js/typings/msg/is.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly is locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/it.d.ts b/static/js/typings/msg/it.d.ts new file mode 100644 index 0000000..0bff1ff --- /dev/null +++ b/static/js/typings/msg/it.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly it locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ja.d.ts b/static/js/typings/msg/ja.d.ts new file mode 100644 index 0000000..ed76fdf --- /dev/null +++ b/static/js/typings/msg/ja.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ja locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/kab.d.ts b/static/js/typings/msg/kab.d.ts new file mode 100644 index 0000000..98747fa --- /dev/null +++ b/static/js/typings/msg/kab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly kab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/kn.d.ts b/static/js/typings/msg/kn.d.ts new file mode 100644 index 0000000..9ac70f3 --- /dev/null +++ b/static/js/typings/msg/kn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly kn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ko.d.ts b/static/js/typings/msg/ko.d.ts new file mode 100644 index 0000000..344002e --- /dev/null +++ b/static/js/typings/msg/ko.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ko locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/lb.d.ts b/static/js/typings/msg/lb.d.ts new file mode 100644 index 0000000..0eee88e --- /dev/null +++ b/static/js/typings/msg/lb.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lb locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/lki.d.ts b/static/js/typings/msg/lki.d.ts new file mode 100644 index 0000000..9559de1 --- /dev/null +++ b/static/js/typings/msg/lki.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lki locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/lo.d.ts b/static/js/typings/msg/lo.d.ts new file mode 100644 index 0000000..5a9071c --- /dev/null +++ b/static/js/typings/msg/lo.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lo locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/lrc.d.ts b/static/js/typings/msg/lrc.d.ts new file mode 100644 index 0000000..044134a --- /dev/null +++ b/static/js/typings/msg/lrc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lrc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/lt.d.ts b/static/js/typings/msg/lt.d.ts new file mode 100644 index 0000000..9cc7516 --- /dev/null +++ b/static/js/typings/msg/lt.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lt locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/lv.d.ts b/static/js/typings/msg/lv.d.ts new file mode 100644 index 0000000..88b41c7 --- /dev/null +++ b/static/js/typings/msg/lv.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly lv locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/mk.d.ts b/static/js/typings/msg/mk.d.ts new file mode 100644 index 0000000..951b027 --- /dev/null +++ b/static/js/typings/msg/mk.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly mk locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/mnw.d.ts b/static/js/typings/msg/mnw.d.ts new file mode 100644 index 0000000..962b8c5 --- /dev/null +++ b/static/js/typings/msg/mnw.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly mnw locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ms.d.ts b/static/js/typings/msg/ms.d.ts new file mode 100644 index 0000000..f154c4e --- /dev/null +++ b/static/js/typings/msg/ms.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ms locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/msg.d.ts b/static/js/typings/msg/msg.d.ts new file mode 100644 index 0000000..65d7808 --- /dev/null +++ b/static/js/typings/msg/msg.d.ts @@ -0,0 +1,444 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly Messages. + * @author samelh@google.com (Sam El-Husseini) + */ + + +declare namespace Blockly.Msg { + let ADD_COMMENT : string ; + let CANNOT_DELETE_VARIABLE_PROCEDURE : string ; + let CHANGE_VALUE_TITLE : string ; + let CLEAN_UP : string ; + let COLLAPSED_WARNINGS_WARNING : string ; + let COLLAPSE_ALL : string ; + let COLLAPSE_BLOCK : string ; + let COLOUR_BLEND_COLOUR1 : string ; + let COLOUR_BLEND_COLOUR2 : string ; + let COLOUR_BLEND_HELPURL : string ; + let COLOUR_BLEND_RATIO : string ; + let COLOUR_BLEND_TITLE : string ; + let COLOUR_BLEND_TOOLTIP : string ; + let COLOUR_HUE : string ; + let COLOUR_PICKER_HELPURL : string ; + let COLOUR_PICKER_TOOLTIP : string ; + let COLOUR_RANDOM_HELPURL : string ; + let COLOUR_RANDOM_TITLE : string ; + let COLOUR_RANDOM_TOOLTIP : string ; + let COLOUR_RGB_BLUE : string ; + let COLOUR_RGB_GREEN : string ; + let COLOUR_RGB_HELPURL : string ; + let COLOUR_RGB_RED : string ; + let COLOUR_RGB_TITLE : string ; + let COLOUR_RGB_TOOLTIP : string ; + let CONTROLS_FLOW_STATEMENTS_HELPURL : string ; + let CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK : string ; + let CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE : string ; + let CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK : string ; + let CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE : string ; + let CONTROLS_FLOW_STATEMENTS_WARNING : string ; + let CONTROLS_FOREACH_HELPURL : string ; + let CONTROLS_FOREACH_INPUT_DO : string ; + let CONTROLS_FOREACH_TITLE : string ; + let CONTROLS_FOREACH_TOOLTIP : string ; + let CONTROLS_FOR_HELPURL : string ; + let CONTROLS_FOR_INPUT_DO : string ; + let CONTROLS_FOR_TITLE : string ; + let CONTROLS_FOR_TOOLTIP : string ; + let CONTROLS_IF_ELSEIF_TITLE_ELSEIF : string ; + let CONTROLS_IF_ELSEIF_TOOLTIP : string ; + let CONTROLS_IF_ELSE_TITLE_ELSE : string ; + let CONTROLS_IF_ELSE_TOOLTIP : string ; + let CONTROLS_IF_HELPURL : string ; + let CONTROLS_IF_IF_TITLE_IF : string ; + let CONTROLS_IF_IF_TOOLTIP : string ; + let CONTROLS_IF_MSG_ELSE : string ; + let CONTROLS_IF_MSG_ELSEIF : string ; + let CONTROLS_IF_MSG_IF : string ; + let CONTROLS_IF_MSG_THEN : string ; + let CONTROLS_IF_TOOLTIP_1 : string ; + let CONTROLS_IF_TOOLTIP_2 : string ; + let CONTROLS_IF_TOOLTIP_3 : string ; + let CONTROLS_IF_TOOLTIP_4 : string ; + let CONTROLS_REPEAT_HELPURL : string ; + let CONTROLS_REPEAT_INPUT_DO : string ; + let CONTROLS_REPEAT_TITLE : string ; + let CONTROLS_REPEAT_TOOLTIP : string ; + let CONTROLS_WHILEUNTIL_HELPURL : string ; + let CONTROLS_WHILEUNTIL_INPUT_DO : string ; + let CONTROLS_WHILEUNTIL_OPERATOR_UNTIL : string ; + let CONTROLS_WHILEUNTIL_OPERATOR_WHILE : string ; + let CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL : string ; + let CONTROLS_WHILEUNTIL_TOOLTIP_WHILE : string ; + let DELETE_ALL_BLOCKS : string ; + let DELETE_BLOCK : string ; + let DELETE_VARIABLE : string ; + let DELETE_VARIABLE_CONFIRMATION : string ; + let DELETE_X_BLOCKS : string ; + let DISABLE_BLOCK : string ; + let DUPLICATE_BLOCK : string ; + let DUPLICATE_COMMENT : string ; + let ENABLE_BLOCK : string ; + let EXPAND_ALL : string ; + let EXPAND_BLOCK : string ; + let EXTERNAL_INPUTS : string ; + let HELP : string ; + let INLINE_INPUTS : string ; + let IOS_CANCEL : string ; + let IOS_ERROR : string ; + let IOS_OK : string ; + let IOS_PROCEDURES_ADD_INPUT : string ; + let IOS_PROCEDURES_ALLOW_STATEMENTS : string ; + let IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR : string ; + let IOS_PROCEDURES_INPUTS : string ; + let IOS_VARIABLES_ADD_BUTTON : string ; + let IOS_VARIABLES_ADD_VARIABLE : string ; + let IOS_VARIABLES_DELETE_BUTTON : string ; + let IOS_VARIABLES_EMPTY_NAME_ERROR : string ; + let IOS_VARIABLES_RENAME_BUTTON : string ; + let IOS_VARIABLES_VARIABLE_NAME : string ; + let LISTS_CREATE_EMPTY_HELPURL : string ; + let LISTS_CREATE_EMPTY_TITLE : string ; + let LISTS_CREATE_EMPTY_TOOLTIP : string ; + let LISTS_CREATE_WITH_CONTAINER_TITLE_ADD : string ; + let LISTS_CREATE_WITH_CONTAINER_TOOLTIP : string ; + let LISTS_CREATE_WITH_HELPURL : string ; + let LISTS_CREATE_WITH_INPUT_WITH : string ; + let LISTS_CREATE_WITH_ITEM_TITLE : string ; + let LISTS_CREATE_WITH_ITEM_TOOLTIP : string ; + let LISTS_CREATE_WITH_TOOLTIP : string ; + let LISTS_GET_INDEX_FIRST : string ; + let LISTS_GET_INDEX_FROM_END : string ; + let LISTS_GET_INDEX_FROM_START : string ; + let LISTS_GET_INDEX_GET : string ; + let LISTS_GET_INDEX_GET_REMOVE : string ; + let LISTS_GET_INDEX_HELPURL : string ; + let LISTS_GET_INDEX_INPUT_IN_LIST : string ; + let LISTS_GET_INDEX_LAST : string ; + let LISTS_GET_INDEX_RANDOM : string ; + let LISTS_GET_INDEX_REMOVE : string ; + let LISTS_GET_INDEX_TAIL : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_FIRST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_FROM : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_LAST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_RANDOM : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST : string ; + let LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST : string ; + let LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM : string ; + let LISTS_GET_SUBLIST_END_FROM_END : string ; + let LISTS_GET_SUBLIST_END_FROM_START : string ; + let LISTS_GET_SUBLIST_END_LAST : string ; + let LISTS_GET_SUBLIST_HELPURL : string ; + let LISTS_GET_SUBLIST_INPUT_IN_LIST : string ; + let LISTS_GET_SUBLIST_START_FIRST : string ; + let LISTS_GET_SUBLIST_START_FROM_END : string ; + let LISTS_GET_SUBLIST_START_FROM_START : string ; + let LISTS_GET_SUBLIST_TAIL : string ; + let LISTS_GET_SUBLIST_TOOLTIP : string ; + let LISTS_HUE : string ; + let LISTS_INDEX_FROM_END_TOOLTIP : string ; + let LISTS_INDEX_FROM_START_TOOLTIP : string ; + let LISTS_INDEX_OF_FIRST : string ; + let LISTS_INDEX_OF_HELPURL : string ; + let LISTS_INDEX_OF_INPUT_IN_LIST : string ; + let LISTS_INDEX_OF_LAST : string ; + let LISTS_INDEX_OF_TOOLTIP : string ; + let LISTS_INLIST : string ; + let LISTS_ISEMPTY_HELPURL : string ; + let LISTS_ISEMPTY_TITLE : string ; + let LISTS_ISEMPTY_TOOLTIP : string ; + let LISTS_LENGTH_HELPURL : string ; + let LISTS_LENGTH_TITLE : string ; + let LISTS_LENGTH_TOOLTIP : string ; + let LISTS_REPEAT_HELPURL : string ; + let LISTS_REPEAT_TITLE : string ; + let LISTS_REPEAT_TOOLTIP : string ; + let LISTS_REVERSE_HELPURL : string ; + let LISTS_REVERSE_MESSAGE0 : string ; + let LISTS_REVERSE_TOOLTIP : string ; + let LISTS_SET_INDEX_HELPURL : string ; + let LISTS_SET_INDEX_INPUT_IN_LIST : string ; + let LISTS_SET_INDEX_INPUT_TO : string ; + let LISTS_SET_INDEX_INSERT : string ; + let LISTS_SET_INDEX_SET : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_FROM : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_LAST : string ; + let LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_FIRST : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_FROM : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_LAST : string ; + let LISTS_SET_INDEX_TOOLTIP_SET_RANDOM : string ; + let LISTS_SORT_HELPURL : string ; + let LISTS_SORT_ORDER_ASCENDING : string ; + let LISTS_SORT_ORDER_DESCENDING : string ; + let LISTS_SORT_TITLE : string ; + let LISTS_SORT_TOOLTIP : string ; + let LISTS_SORT_TYPE_IGNORECASE : string ; + let LISTS_SORT_TYPE_NUMERIC : string ; + let LISTS_SORT_TYPE_TEXT : string ; + let LISTS_SPLIT_HELPURL : string ; + let LISTS_SPLIT_LIST_FROM_TEXT : string ; + let LISTS_SPLIT_TEXT_FROM_LIST : string ; + let LISTS_SPLIT_TOOLTIP_JOIN : string ; + let LISTS_SPLIT_TOOLTIP_SPLIT : string ; + let LISTS_SPLIT_WITH_DELIMITER : string ; + let LOGIC_BOOLEAN_FALSE : string ; + let LOGIC_BOOLEAN_HELPURL : string ; + let LOGIC_BOOLEAN_TOOLTIP : string ; + let LOGIC_BOOLEAN_TRUE : string ; + let LOGIC_COMPARE_HELPURL : string ; + let LOGIC_COMPARE_TOOLTIP_EQ : string ; + let LOGIC_COMPARE_TOOLTIP_GT : string ; + let LOGIC_COMPARE_TOOLTIP_GTE : string ; + let LOGIC_COMPARE_TOOLTIP_LT : string ; + let LOGIC_COMPARE_TOOLTIP_LTE : string ; + let LOGIC_COMPARE_TOOLTIP_NEQ : string ; + let LOGIC_HUE : string ; + let LOGIC_NEGATE_HELPURL : string ; + let LOGIC_NEGATE_TITLE : string ; + let LOGIC_NEGATE_TOOLTIP : string ; + let LOGIC_NULL : string ; + let LOGIC_NULL_HELPURL : string ; + let LOGIC_NULL_TOOLTIP : string ; + let LOGIC_OPERATION_AND : string ; + let LOGIC_OPERATION_HELPURL : string ; + let LOGIC_OPERATION_OR : string ; + let LOGIC_OPERATION_TOOLTIP_AND : string ; + let LOGIC_OPERATION_TOOLTIP_OR : string ; + let LOGIC_TERNARY_CONDITION : string ; + let LOGIC_TERNARY_HELPURL : string ; + let LOGIC_TERNARY_IF_FALSE : string ; + let LOGIC_TERNARY_IF_TRUE : string ; + let LOGIC_TERNARY_TOOLTIP : string ; + let LOOPS_HUE : string ; + let MATH_ADDITION_SYMBOL : string ; + let MATH_ARITHMETIC_HELPURL : string ; + let MATH_ARITHMETIC_TOOLTIP_ADD : string ; + let MATH_ARITHMETIC_TOOLTIP_DIVIDE : string ; + let MATH_ARITHMETIC_TOOLTIP_MINUS : string ; + let MATH_ARITHMETIC_TOOLTIP_MULTIPLY : string ; + let MATH_ARITHMETIC_TOOLTIP_POWER : string ; + let MATH_ATAN2_HELPURL : string ; + let MATH_ATAN2_TITLE : string ; + let MATH_ATAN2_TOOLTIP : string ; + let MATH_CHANGE_HELPURL : string ; + let MATH_CHANGE_TITLE : string ; + let MATH_CHANGE_TITLE_ITEM : string ; + let MATH_CHANGE_TOOLTIP : string ; + let MATH_CONSTANT_HELPURL : string ; + let MATH_CONSTANT_TOOLTIP : string ; + let MATH_CONSTRAIN_HELPURL : string ; + let MATH_CONSTRAIN_TITLE : string ; + let MATH_CONSTRAIN_TOOLTIP : string ; + let MATH_DIVISION_SYMBOL : string ; + let MATH_HUE : string ; + let MATH_IS_DIVISIBLE_BY : string ; + let MATH_IS_EVEN : string ; + let MATH_IS_NEGATIVE : string ; + let MATH_IS_ODD : string ; + let MATH_IS_POSITIVE : string ; + let MATH_IS_PRIME : string ; + let MATH_IS_TOOLTIP : string ; + let MATH_IS_WHOLE : string ; + let MATH_MODULO_HELPURL : string ; + let MATH_MODULO_TITLE : string ; + let MATH_MODULO_TOOLTIP : string ; + let MATH_MULTIPLICATION_SYMBOL : string ; + let MATH_NUMBER_HELPURL : string ; + let MATH_NUMBER_TOOLTIP : string ; + let MATH_ONLIST_HELPURL : string ; + let MATH_ONLIST_OPERATOR_AVERAGE : string ; + let MATH_ONLIST_OPERATOR_MAX : string ; + let MATH_ONLIST_OPERATOR_MEDIAN : string ; + let MATH_ONLIST_OPERATOR_MIN : string ; + let MATH_ONLIST_OPERATOR_MODE : string ; + let MATH_ONLIST_OPERATOR_RANDOM : string ; + let MATH_ONLIST_OPERATOR_STD_DEV : string ; + let MATH_ONLIST_OPERATOR_SUM : string ; + let MATH_ONLIST_TOOLTIP_AVERAGE : string ; + let MATH_ONLIST_TOOLTIP_MAX : string ; + let MATH_ONLIST_TOOLTIP_MEDIAN : string ; + let MATH_ONLIST_TOOLTIP_MIN : string ; + let MATH_ONLIST_TOOLTIP_MODE : string ; + let MATH_ONLIST_TOOLTIP_RANDOM : string ; + let MATH_ONLIST_TOOLTIP_STD_DEV : string ; + let MATH_ONLIST_TOOLTIP_SUM : string ; + let MATH_POWER_SYMBOL : string ; + let MATH_RANDOM_FLOAT_HELPURL : string ; + let MATH_RANDOM_FLOAT_TITLE_RANDOM : string ; + let MATH_RANDOM_FLOAT_TOOLTIP : string ; + let MATH_RANDOM_INT_HELPURL : string ; + let MATH_RANDOM_INT_TITLE : string ; + let MATH_RANDOM_INT_TOOLTIP : string ; + let MATH_ROUND_HELPURL : string ; + let MATH_ROUND_OPERATOR_ROUND : string ; + let MATH_ROUND_OPERATOR_ROUNDDOWN : string ; + let MATH_ROUND_OPERATOR_ROUNDUP : string ; + let MATH_ROUND_TOOLTIP : string ; + let MATH_SINGLE_HELPURL : string ; + let MATH_SINGLE_OP_ABSOLUTE : string ; + let MATH_SINGLE_OP_ROOT : string ; + let MATH_SINGLE_TOOLTIP_ABS : string ; + let MATH_SINGLE_TOOLTIP_EXP : string ; + let MATH_SINGLE_TOOLTIP_LN : string ; + let MATH_SINGLE_TOOLTIP_LOG10 : string ; + let MATH_SINGLE_TOOLTIP_NEG : string ; + let MATH_SINGLE_TOOLTIP_POW10 : string ; + let MATH_SINGLE_TOOLTIP_ROOT : string ; + let MATH_SUBTRACTION_SYMBOL : string ; + let MATH_TRIG_ACOS : string ; + let MATH_TRIG_ASIN : string ; + let MATH_TRIG_ATAN : string ; + let MATH_TRIG_COS : string ; + let MATH_TRIG_HELPURL : string ; + let MATH_TRIG_SIN : string ; + let MATH_TRIG_TAN : string ; + let MATH_TRIG_TOOLTIP_ACOS : string ; + let MATH_TRIG_TOOLTIP_ASIN : string ; + let MATH_TRIG_TOOLTIP_ATAN : string ; + let MATH_TRIG_TOOLTIP_COS : string ; + let MATH_TRIG_TOOLTIP_SIN : string ; + let MATH_TRIG_TOOLTIP_TAN : string ; + let NEW_COLOUR_VARIABLE : string ; + let NEW_NUMBER_VARIABLE : string ; + let NEW_STRING_VARIABLE : string ; + let NEW_VARIABLE : string ; + let NEW_VARIABLE_TITLE : string ; + let NEW_VARIABLE_TYPE_TITLE : string ; + let ORDINAL_NUMBER_SUFFIX : string ; + let PROCEDURES_ALLOW_STATEMENTS : string ; + let PROCEDURES_BEFORE_PARAMS : string ; + let PROCEDURES_CALLNORETURN_HELPURL : string ; + let PROCEDURES_CALLNORETURN_TOOLTIP : string ; + let PROCEDURES_CALLRETURN_HELPURL : string ; + let PROCEDURES_CALLRETURN_TOOLTIP : string ; + let PROCEDURES_CALL_BEFORE_PARAMS : string ; + let PROCEDURES_CREATE_DO : string ; + let PROCEDURES_DEFNORETURN_COMMENT : string ; + let PROCEDURES_DEFNORETURN_DO : string ; + let PROCEDURES_DEFNORETURN_HELPURL : string ; + let PROCEDURES_DEFNORETURN_PROCEDURE : string ; + let PROCEDURES_DEFNORETURN_TITLE : string ; + let PROCEDURES_DEFNORETURN_TOOLTIP : string ; + let PROCEDURES_DEFRETURN_COMMENT : string ; + let PROCEDURES_DEFRETURN_DO : string ; + let PROCEDURES_DEFRETURN_HELPURL : string ; + let PROCEDURES_DEFRETURN_PROCEDURE : string ; + let PROCEDURES_DEFRETURN_RETURN : string ; + let PROCEDURES_DEFRETURN_TITLE : string ; + let PROCEDURES_DEFRETURN_TOOLTIP : string ; + let PROCEDURES_DEF_DUPLICATE_WARNING : string ; + let PROCEDURES_HIGHLIGHT_DEF : string ; + let PROCEDURES_HUE : string ; + let PROCEDURES_IFRETURN_HELPURL : string ; + let PROCEDURES_IFRETURN_TOOLTIP : string ; + let PROCEDURES_IFRETURN_WARNING : string ; + let PROCEDURES_MUTATORARG_TITLE : string ; + let PROCEDURES_MUTATORARG_TOOLTIP : string ; + let PROCEDURES_MUTATORCONTAINER_TITLE : string ; + let PROCEDURES_MUTATORCONTAINER_TOOLTIP : string ; + let REDO : string ; + let REMOVE_COMMENT : string ; + let RENAME_VARIABLE : string ; + let RENAME_VARIABLE_TITLE : string ; + let TEXTS_HUE : string ; + let TEXT_APPEND_HELPURL : string ; + let TEXT_APPEND_TITLE : string ; + let TEXT_APPEND_TOOLTIP : string ; + let TEXT_APPEND_VARIABLE : string ; + let TEXT_CHANGECASE_HELPURL : string ; + let TEXT_CHANGECASE_OPERATOR_LOWERCASE : string ; + let TEXT_CHANGECASE_OPERATOR_TITLECASE : string ; + let TEXT_CHANGECASE_OPERATOR_UPPERCASE : string ; + let TEXT_CHANGECASE_TOOLTIP : string ; + let TEXT_CHARAT_FIRST : string ; + let TEXT_CHARAT_FROM_END : string ; + let TEXT_CHARAT_FROM_START : string ; + let TEXT_CHARAT_HELPURL : string ; + let TEXT_CHARAT_LAST : string ; + let TEXT_CHARAT_RANDOM : string ; + let TEXT_CHARAT_TAIL : string ; + let TEXT_CHARAT_TITLE : string ; + let TEXT_CHARAT_TOOLTIP : string ; + let TEXT_COUNT_HELPURL : string ; + let TEXT_COUNT_MESSAGE0 : string ; + let TEXT_COUNT_TOOLTIP : string ; + let TEXT_CREATE_JOIN_ITEM_TITLE_ITEM : string ; + let TEXT_CREATE_JOIN_ITEM_TOOLTIP : string ; + let TEXT_CREATE_JOIN_TITLE_JOIN : string ; + let TEXT_CREATE_JOIN_TOOLTIP : string ; + let TEXT_GET_SUBSTRING_END_FROM_END : string ; + let TEXT_GET_SUBSTRING_END_FROM_START : string ; + let TEXT_GET_SUBSTRING_END_LAST : string ; + let TEXT_GET_SUBSTRING_HELPURL : string ; + let TEXT_GET_SUBSTRING_INPUT_IN_TEXT : string ; + let TEXT_GET_SUBSTRING_START_FIRST : string ; + let TEXT_GET_SUBSTRING_START_FROM_END : string ; + let TEXT_GET_SUBSTRING_START_FROM_START : string ; + let TEXT_GET_SUBSTRING_TAIL : string ; + let TEXT_GET_SUBSTRING_TOOLTIP : string ; + let TEXT_INDEXOF_HELPURL : string ; + let TEXT_INDEXOF_OPERATOR_FIRST : string ; + let TEXT_INDEXOF_OPERATOR_LAST : string ; + let TEXT_INDEXOF_TITLE : string ; + let TEXT_INDEXOF_TOOLTIP : string ; + let TEXT_ISEMPTY_HELPURL : string ; + let TEXT_ISEMPTY_TITLE : string ; + let TEXT_ISEMPTY_TOOLTIP : string ; + let TEXT_JOIN_HELPURL : string ; + let TEXT_JOIN_TITLE_CREATEWITH : string ; + let TEXT_JOIN_TOOLTIP : string ; + let TEXT_LENGTH_HELPURL : string ; + let TEXT_LENGTH_TITLE : string ; + let TEXT_LENGTH_TOOLTIP : string ; + let TEXT_PRINT_HELPURL : string ; + let TEXT_PRINT_TITLE : string ; + let TEXT_PRINT_TOOLTIP : string ; + let TEXT_PROMPT_HELPURL : string ; + let TEXT_PROMPT_TOOLTIP_NUMBER : string ; + let TEXT_PROMPT_TOOLTIP_TEXT : string ; + let TEXT_PROMPT_TYPE_NUMBER : string ; + let TEXT_PROMPT_TYPE_TEXT : string ; + let TEXT_REPLACE_HELPURL : string ; + let TEXT_REPLACE_MESSAGE0 : string ; + let TEXT_REPLACE_TOOLTIP : string ; + let TEXT_REVERSE_HELPURL : string ; + let TEXT_REVERSE_MESSAGE0 : string ; + let TEXT_REVERSE_TOOLTIP : string ; + let TEXT_TEXT_HELPURL : string ; + let TEXT_TEXT_TOOLTIP : string ; + let TEXT_TRIM_HELPURL : string ; + let TEXT_TRIM_OPERATOR_BOTH : string ; + let TEXT_TRIM_OPERATOR_LEFT : string ; + let TEXT_TRIM_OPERATOR_RIGHT : string ; + let TEXT_TRIM_TOOLTIP : string ; + let TODAY : string ; + let UNDO : string ; + let UNNAMED_KEY : string ; + let VARIABLES_DEFAULT_NAME : string ; + let VARIABLES_DYNAMIC_HUE : string ; + let VARIABLES_GET_CREATE_SET : string ; + let VARIABLES_GET_HELPURL : string ; + let VARIABLES_GET_TOOLTIP : string ; + let VARIABLES_HUE : string ; + let VARIABLES_SET : string ; + let VARIABLES_SET_CREATE_GET : string ; + let VARIABLES_SET_HELPURL : string ; + let VARIABLES_SET_TOOLTIP : string ; + let VARIABLE_ALREADY_EXISTS : string ; + let VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE : string ; + let WORKSPACE_ARIA_LABEL : string ; + let WORKSPACE_COMMENT_DEFAULT_TEXT : string ; +} + diff --git a/static/js/typings/msg/nb.d.ts b/static/js/typings/msg/nb.d.ts new file mode 100644 index 0000000..42aaa1b --- /dev/null +++ b/static/js/typings/msg/nb.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly nb locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/nl.d.ts b/static/js/typings/msg/nl.d.ts new file mode 100644 index 0000000..5d383fb --- /dev/null +++ b/static/js/typings/msg/nl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly nl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/oc.d.ts b/static/js/typings/msg/oc.d.ts new file mode 100644 index 0000000..f8eabb7 --- /dev/null +++ b/static/js/typings/msg/oc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly oc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/pl.d.ts b/static/js/typings/msg/pl.d.ts new file mode 100644 index 0000000..957f382 --- /dev/null +++ b/static/js/typings/msg/pl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/pms.d.ts b/static/js/typings/msg/pms.d.ts new file mode 100644 index 0000000..35df33e --- /dev/null +++ b/static/js/typings/msg/pms.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pms locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/pt-br.d.ts b/static/js/typings/msg/pt-br.d.ts new file mode 100644 index 0000000..065d639 --- /dev/null +++ b/static/js/typings/msg/pt-br.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pt-br locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/pt.d.ts b/static/js/typings/msg/pt.d.ts new file mode 100644 index 0000000..f89879c --- /dev/null +++ b/static/js/typings/msg/pt.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly pt locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/qqq.d.ts b/static/js/typings/msg/qqq.d.ts new file mode 100644 index 0000000..4c58a60 --- /dev/null +++ b/static/js/typings/msg/qqq.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly qqq locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ro.d.ts b/static/js/typings/msg/ro.d.ts new file mode 100644 index 0000000..f2183fa --- /dev/null +++ b/static/js/typings/msg/ro.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ro locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ru.d.ts b/static/js/typings/msg/ru.d.ts new file mode 100644 index 0000000..95ffc83 --- /dev/null +++ b/static/js/typings/msg/ru.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ru locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sc.d.ts b/static/js/typings/msg/sc.d.ts new file mode 100644 index 0000000..2d5afcb --- /dev/null +++ b/static/js/typings/msg/sc.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sc locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sd.d.ts b/static/js/typings/msg/sd.d.ts new file mode 100644 index 0000000..cafc978 --- /dev/null +++ b/static/js/typings/msg/sd.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sd locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/shn.d.ts b/static/js/typings/msg/shn.d.ts new file mode 100644 index 0000000..07a5313 --- /dev/null +++ b/static/js/typings/msg/shn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly shn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sk.d.ts b/static/js/typings/msg/sk.d.ts new file mode 100644 index 0000000..3c26e48 --- /dev/null +++ b/static/js/typings/msg/sk.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sk locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/skr-arab.d.ts b/static/js/typings/msg/skr-arab.d.ts new file mode 100644 index 0000000..4ddb30f --- /dev/null +++ b/static/js/typings/msg/skr-arab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly skr-arab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sl.d.ts b/static/js/typings/msg/sl.d.ts new file mode 100644 index 0000000..51f1f56 --- /dev/null +++ b/static/js/typings/msg/sl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sq.d.ts b/static/js/typings/msg/sq.d.ts new file mode 100644 index 0000000..e7997e2 --- /dev/null +++ b/static/js/typings/msg/sq.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sq locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sr-latn.d.ts b/static/js/typings/msg/sr-latn.d.ts new file mode 100644 index 0000000..f9bf064 --- /dev/null +++ b/static/js/typings/msg/sr-latn.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sr-latn locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sr.d.ts b/static/js/typings/msg/sr.d.ts new file mode 100644 index 0000000..7d6ea16 --- /dev/null +++ b/static/js/typings/msg/sr.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sr locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/sv.d.ts b/static/js/typings/msg/sv.d.ts new file mode 100644 index 0000000..11018f2 --- /dev/null +++ b/static/js/typings/msg/sv.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly sv locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/synonyms.d.ts b/static/js/typings/msg/synonyms.d.ts new file mode 100644 index 0000000..93e2197 --- /dev/null +++ b/static/js/typings/msg/synonyms.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly synonyms locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ta.d.ts b/static/js/typings/msg/ta.d.ts new file mode 100644 index 0000000..d74bd3c --- /dev/null +++ b/static/js/typings/msg/ta.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ta locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/tcy.d.ts b/static/js/typings/msg/tcy.d.ts new file mode 100644 index 0000000..6427835 --- /dev/null +++ b/static/js/typings/msg/tcy.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tcy locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/te.d.ts b/static/js/typings/msg/te.d.ts new file mode 100644 index 0000000..c7acfb0 --- /dev/null +++ b/static/js/typings/msg/te.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly te locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/th.d.ts b/static/js/typings/msg/th.d.ts new file mode 100644 index 0000000..bf77eae --- /dev/null +++ b/static/js/typings/msg/th.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly th locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/tl.d.ts b/static/js/typings/msg/tl.d.ts new file mode 100644 index 0000000..0d51a38 --- /dev/null +++ b/static/js/typings/msg/tl.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tl locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/tlh.d.ts b/static/js/typings/msg/tlh.d.ts new file mode 100644 index 0000000..5eb07eb --- /dev/null +++ b/static/js/typings/msg/tlh.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tlh locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/tr.d.ts b/static/js/typings/msg/tr.d.ts new file mode 100644 index 0000000..2b1a29a --- /dev/null +++ b/static/js/typings/msg/tr.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly tr locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ug-arab.d.ts b/static/js/typings/msg/ug-arab.d.ts new file mode 100644 index 0000000..f9445a5 --- /dev/null +++ b/static/js/typings/msg/ug-arab.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ug-arab locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/uk.d.ts b/static/js/typings/msg/uk.d.ts new file mode 100644 index 0000000..1250e6c --- /dev/null +++ b/static/js/typings/msg/uk.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly uk locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/ur.d.ts b/static/js/typings/msg/ur.d.ts new file mode 100644 index 0000000..b944aad --- /dev/null +++ b/static/js/typings/msg/ur.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly ur locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/vi.d.ts b/static/js/typings/msg/vi.d.ts new file mode 100644 index 0000000..86a0e7d --- /dev/null +++ b/static/js/typings/msg/vi.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly vi locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/xmf.d.ts b/static/js/typings/msg/xmf.d.ts new file mode 100644 index 0000000..e230058 --- /dev/null +++ b/static/js/typings/msg/xmf.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly xmf locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/yo.d.ts b/static/js/typings/msg/yo.d.ts new file mode 100644 index 0000000..29120ab --- /dev/null +++ b/static/js/typings/msg/yo.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly yo locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/zgh.d.ts b/static/js/typings/msg/zgh.d.ts new file mode 100644 index 0000000..be1d163 --- /dev/null +++ b/static/js/typings/msg/zgh.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly zgh locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/zh-hans.d.ts b/static/js/typings/msg/zh-hans.d.ts new file mode 100644 index 0000000..938f553 --- /dev/null +++ b/static/js/typings/msg/zh-hans.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly zh-hans locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/msg/zh-hant.d.ts b/static/js/typings/msg/zh-hant.d.ts new file mode 100644 index 0000000..f2917aa --- /dev/null +++ b/static/js/typings/msg/zh-hant.d.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly zh-hant locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/php.d.ts b/static/js/typings/php.d.ts new file mode 100644 index 0000000..75f2ef6 --- /dev/null +++ b/static/js/typings/php.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the PHP generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/typings/python.d.ts b/static/js/typings/python.d.ts new file mode 100644 index 0000000..ba32814 --- /dev/null +++ b/static/js/typings/python.d.ts @@ -0,0 +1,15 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Python generator. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import * as Blockly from './core'; +export = Blockly.Generator; diff --git a/static/js/typings/templates/blockly-header.template b/static/js/typings/templates/blockly-header.template new file mode 100644 index 0000000..15bcf14 --- /dev/null +++ b/static/js/typings/templates/blockly-header.template @@ -0,0 +1,12 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for Blockly. + * @author samelh@google.com (Sam El-Husseini) + */ + +export = Blockly; \ No newline at end of file diff --git a/static/js/typings/templates/blockly-interfaces.template b/static/js/typings/templates/blockly-interfaces.template new file mode 100644 index 0000000..e2880f9 --- /dev/null +++ b/static/js/typings/templates/blockly-interfaces.template @@ -0,0 +1,83 @@ + +declare module Blockly { + + interface BlocklyOptions { + toolbox?: HTMLElement | string; + readOnly?: boolean; + trashcan?: boolean; + maxInstances?: {[type: string]: number;}; + 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; + pinch?: boolean; + }; + renderer?: string; + parentWorkspace?: Blockly.WorkspaceSvg; + } + + interface BlocklyThemeOptions { + base?: string; + blockStyles?: {[blocks: string]: Blockly.Theme.BlockStyle;}; + categoryStyles?: {[category: string]: Blockly.Theme.CategoryStyle;}; + componentStyles?: {[component: string]: any;}; + fontStyle?: Blockly.Theme.FontStyle; + startHats?: boolean; + } + + /** + * 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.utils { + interface Metrics { + viewHeight: number; + viewWidth: number; + contentHeight: number; + contentWidth: number; + viewTop: number; + viewLeft: number; + contentTop: number; + contentLeft: number; + absoluteTop: number; + absoluteLeft: number; + svgHeight?: number; + svgWidth?: number; + toolboxWidth?: number; + toolboxHeight?: number; + flyoutWidth?: number; + flyoutHeight?: number; + toolboxPosition?: number; + } +} diff --git a/static/js/typings/templates/msg.template b/static/js/typings/templates/msg.template new file mode 100644 index 0000000..7377e25 --- /dev/null +++ b/static/js/typings/templates/msg.template @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Type definitions for the Blockly <%= locale %> locale. + * @author samelh@google.com (Sam El-Husseini) + */ + +/// + +import BlocklyMsg = Blockly.Msg; +export = BlocklyMsg; + diff --git a/static/js/typings/tsconfig.json b/static/js/typings/tsconfig.json new file mode 100644 index 0000000..7647424 --- /dev/null +++ b/static/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 diff --git a/static/media/1x1.gif b/static/media/1x1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3085511236caea65b69ad30a68979c9b95f4a425 GIT binary patch literal 43 qcmZ?wbhEHbWMp7uXkY+=|Ns9h{$$}~01D`U_#hbuCMF+725SJojRy(< literal 0 HcmV?d00001 diff --git a/static/media/click.mp3 b/static/media/click.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4534b0ddca7424a441a5992f78d7defb7ea01834 GIT binary patch literal 2304 zcmeZtF=l1}0!F_O&k!RZLl%ew@(T(w^U@W3GE)@t(|}Y#QesZ7LU2iDa&}0hYY5S_413-^&w3C0*Djhb23xn^V5J7*a`8)ASWpJ=BH$)Wu~SmB<7_k z6s6{7Rsh*al?v|p`RO^S3Z8k%djEe z|8W7JU6wwMzOKf4mKH^fXJM`pX;9&~;>5tv0CLC9h9lfCiIGA>B1ot=-=`$KfxBg% z!2xvxQN{%u1ZVItq(kKX|Nq&bz`W(yxy6|b2}}%!60c^lW>9qJNYT78cK7X1G`=?E8tc&Ve+j=v1Tvih0*@(UOg z)*t^hr9ta#q~@}-;m&2rD@0cDT)bT*!L`fq5ld(5;h8Pk2Y6UQCK#ON^K*&Q;bhss z9BrK3;2d=3SdT^1nUz-!lTNNk@Mmq?@6Ud%@A{J`(*oW^&e)mc81_B)Si14_drS7G zzq-2c_uuE{Khk^7tTS$rj-Ikr)v)XCym_1Z3znXKSJt+4_U@f=e}9{n-@o_q*!$1_ zEB<}`ef{>-}am~&Ni$6GlPLakVQmBho5g+#P@|YVu44#{>+Kski1s6Sk9!K zfj8soyG^C-EUk(PA#6;{Q6^WIn`c~D`^7+Hh82hGUKz=t+05gThWnaIbh@zJJ~KkT2if{=by{ zTQ@IoW{I(Pu>SSez~uDu?f?G|PglO@n5t)*8uVuWesE08RaG}_le~O;$&!upuPt3# z8=v`Re&nesyE{%Tj?H`UbN#;vFNOjJhOlWaokA)e6P3DTmN+f&5Mr6SvEXOSJm;zB zK{3S7d@XXazRmOo4h9AjU^KF=ZEbV+q!+WU9HsZvvK=+^CR?=u0PulcRlXv+U&QSpI=?S zCH&&rkF9I7s}8nGoo8jOQ&`u;r3EVh^^8^xAfUf1KrvLqe1L&*2{3~xKx1eCLtxZu H^bi05jng?> literal 0 HcmV?d00001 diff --git a/static/media/click.ogg b/static/media/click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e8ae42a6106dadbb6861981a696b7f8b8f64c9ae GIT binary patch literal 4865 zcmai13s_S}7QRu01OrA07;JQJkQ8nJB?w5^vgIL#1X3gS4T_I;7qX~&LkdY!roq9>%9EDy)D25XYk`Pxlv((8**}U z#o1|alvoJoq=LU(L2_mm9Gfpr$-seG>w~#rfncfM67Ukt;WA^nfwB3?l1y>FC>IQc zMzh&r?{Z@UV{>GZ6j1=YH9tQ$V9lCs+qSLF6-skt*+S{+97)<5Gr1<$tZ#FsShzVS z75tg>ZI+_?V0MmBoGKOx;pA)~ED>di-v_i{I~<;qla?uhnb|3;F^kM*A|au17zhh? zK#zj;MPt=G2qHkx78k^}HkFB}70qtj8x#>JrS~dtP?YOQDV21?uN~|obbufWsK^ah z)jGpWA7P}CT&pBa4Dq}E$6>3An0pM|UUfK=9WdBSh^3Q|5Q0U;mm%#95+KTK77P^uGokQ9MCKXd&>8ZzahK@t zJYwv9$Jd6%a@joa$dcjqkyK}B2>85OY zs&IPhz~*J8e+1TVnFE2Ok(+W-A*iJHtBT(Z!I=a6Yv$w;`wx+?9&(B7a$!$+T>H)^ z`l-*jeOQbSJJum-+(CBTQ55T!blq2UohOR|R`d6)D*0?0pyt%zTtz4-&eDsl~#rhAKv$f)QL&fp3irKO%xAJ;% zxl((fC3CQIzW4vO-!dm$;sP4ToG^*YYngM2P7Vdx)aAi`YPKoAo5T93;sexmRj|$F_D#%({#bDASwJxmR74-3 zUm;0Gm{*(DkI->P6ax%bb?pQb@vJAUMX2p|DGyYw6U?h^3Q}ankv6-OavfL%S%Kf; z=CNuAOb`)*1bB`$Qlj9DAT!mRLHa{7hs8LqiXCBKSI7tHmPd*Sh?*Qbg7lN+!@&<# z#bd#45CmVsfM1B4k1z}(xI*`GT}EqtB8k*U`>;`>Xv&^FRp)cf$2W${8?xt3a(QH3F_|s=jcu zF)OLzl_)mRB+8FB)#DqJ&x_%S61cpC0#U+qUc9j|5^!VLw;Xu99^S2IS-kqf`}w@2 zc+suryadNxiBl!_e<-|9LM2a4$^bXnC`vvjn|2c`#px|4v`ROvR-^67(st?+TjsPa z+QF_gZD+?|*Qt}8ne%|#c|zOeq1Aev?CN--^_cHDq3zWTcAakQJUQR<&Eh_f`QBV@ zXXnYTCn&d9H*d(B@AcZ*jtsS*eB7()?aiL=%^U8?BDZQEe@Yv=e0s3!oB7@~XJwQa zp6sq7=|McOBWv@vqlwQ;y0ZTIneN3P5HRsC#%K=t0$BD@_8VZ#@YMb7WdAC4niA|( zt83JrobSqZ@9UTkiQyF{)rqFpB_%A&o?cg#ICY>!`?!}j^eIq8|H6<%{@9D0bjJ@c zj&$i37p4q6$Bky(G331nc<_U)^%Nf0e-K~;gJQ#eFsPa0zM#k-16fjLiLnHl9?mCl z9>Z;1x+O*WE=x~VY+$8R6gOxFm|MjhP}SP8wjzoNj#aaI11qChVdP|-X}=-(2i)e! z5_>8p_~{zM4Swa)6oU6`n{b4QQ=df{K-6qgn{5b7-A0ULdBzO`Ah%8gM`+sYVwsw5 zAWGfl7|Ejd5EHZMMlx8@W|zoB48+(hPlIxm0S2P3qRLG=9yTa|sKdoIES9dWhBK_H zMMV`?v6x6t4J!)lip4rp!r^DqjVey2FW40jRl~~kH1HFnx@83ZV$-g4-EkS|Is;Hn zRg)rFXSy9TvgtF+Sz;ZkT%&hPtOCkoGkn{P=_n&HE6}KvvUJ89oCAQ7l67%Xx#OE( zEf=JF8jJ!Rs+@MFt_CQdxy`R+C?*6zR1K#RtVqnf&|aSo7)s9m?wQ-tOy3`F@HCpG*v^l>Od!G8h+ zXk_{p5CE(U{7{xozcHheqBaUTe5U}2yJwUcEWpUPb^(IESY!pAUie0spDPJR^AVbi zD1w0-E9s>~K?QwQ6^cdl4WPzpC!wVW_{gI5M`bpInXiiU2J`D{HT&ASP=X);J|LqNeAZzpheM;P>(Qg* z2A|~#WLr_yMov1=5`a~oy@9H_861JAjr{$dAmv!#RZ!_$$^ldKHw7K^wh0c%Pf|(; zNFaU&*m{O1(rpw}b_4%|6T&Fi?`z~QhVEtOLPZg$^GfU5KDs=9&lGD4D7HgP-bOD5 z91x2p6fKnXEPyH$BNRCZgLzC|{o5EJVAc#R0H|5>JjI3(6ST0+U<_FSK;~wmsDQ$m z3pf)P<#wQyQvk{4F@+t_VJhzw92AkjH7LUbRTG7ypzbnFrkK~FwIG1#Li7|~HRsYg z=$z?u|MJ2OTL)NB5gvl_Zl=#8#sOHblGjJdt0e@%>ZP0tM)(;~gp-~$si3Qgv7C%K zm7p>v`bY|k-q)dsW4RsLJ0a=lE*J*4Ulye}(Z z|4`ZVZ%wcniLe7ykR&P;Xa?3ye`rmfS;o8fNIphV@Yd>1J*zERk$4~57Gpga z<=6cB);VnYXJ`C7J-0We)Xha7T8y`ysj?3xx%%H^I3gFj%U+UniJ@KJCqCS5y>rni zlFjm)`(_I{MUkWvtD~$=xYzDuC9nF6h4|+M%XODn%|A6R!(={t4+r&aqtvTDTR6wt z(E0g6;iC!CUn5Q=F;lNCeU$BW|GOmSroE}z?jKvqe=MMt#x1$K^JVRVO9UB`AAH+?lzm%p z1{*OoyDC~2yvA{|wBY%m$HfoEr(eFDn~YrWN#O44%&c#(*VYUW8=}3SZR50+b&>qM zxcCR>eP4+5OETUHu=zUuse4@FjUC3L8u14ODJ0uU>gIE|zX`wiY2M#!by-+9-^KoO zeJ}QBQO_Ma+Ub;B>A9{pn|5Hj_BxTTyL(j`e$?g0&p8<2ox_Kd!;juM{mwD$hBLOe zpWo-*oe_@yVnOE*4^^(d)lrW|-?kAh+P0$SyGn*^ho|&;Rtx^% p7k4FIZ@TV#xbK&J-v%`HU5P#@S^9X{;VrAfeySU))r708{sTaExM%T7p^9ndf_EzHQ$3of#W9Y}f@)fC>4I3RdDtcslIgiiG%1X;f4SFXnB`9;I9I~b- zrOyo-my?z}N3M(>n_!iz#^ofOdL$jp?qnQ1dpf|4>)g67Yd zo3=>Kr!NkQ&CEjjXKl#}$p10a$V5G(8wK{$@Ms5jfg zCMe65Y!=5R8M|9{nFh1f@H+X0fT(NEuDtzh(?&i5>(uCyEx*a`2A+3pL=ew zJ;KpB)FYwl-`5+95B~h*a_z&Jrol5SE z-;;|EuE1x(hOgb1e_IE^OgtylbCY zHRnb2i_FR}+fJr>1^K76a(Sj2^0oKv2kc&&AKhjx@rw0f?kicf>yL)OnlGz^8~eG2 zQcp{r+coQU!8lQOvE6HY^eW1E5Br+j-A}tOu*9=pwSzXlrnKh2oXHq(EVX{` zcEdcJUE&>G>m1WvLjRr&R92fzrWfo4&eEMm1o@yqaN){Q6##71+Ch)r6M;odo>7B(Sh^KSdF7}Ad zC2b)MCt@-N;5Na;dwi+x(!SMKidoQuzF^tP0OM^X(ojRjpk3dr4bn=qX?!3ag9&6a z`HGAow_yN0!3G=wV<8;Ma2<9*1J;Ws@mTmtyBB#z+R~rNDDnXeMn$yZEA(W2vp$il zq7$j3UmH|qq;Z7eqE;Bj!?Z{>MV+OodNMAj;YzOYnsSUaLO=0X>#Ca7f%*;ngT7

    ~Kv18<{tYx#Fqpj22d0W|!J;axGqUq#0ju4-7Dk3onMvxkUB#{h-^Wq$Law|@T zTjT~s$)xQh1`32P|6H%s-{y2? z_zgDUY5W{1L_!tr!|j-cFGYb^B7T)S4#5+$lYUEIkaO@co)BZjFmXa;;#?R{@<|!k z(I2OaFmY7WVH%l7f1?Ewy@#=zn8%m$5HVJs*ll`@g|nrkBYN_y+6HZr?khsTm-b+N z*<17=grh|aF{vBq}uRHE|4vv3C@q1S-IW zz(q7lE@gZ=Cb}_ivVOk6sB0&$=iZvUr zfOK}x;4sv%U1YD&w0yNptx*O+O++NDtP^aEmRb@jykc?xh#&UBn$6MB?Z+%IF1{jzh&xewMElNAM{;Cb@Ja zEh4Ao+3&`AScG9P3;MuKoPb@i6~2v+Fb^JsfwUuCNqbTXn_(hkLjlZ%1{{jdM3tC= ze_{x%g6pscJfJH^i4s0Zyos&gZ@5Sn(oMAdpWP6KE5t&HxVu;igdUalOJp`wix>Pj zZ!J7A7p(Lxmd9RWA=E^CAqH2AY2u=oj5o0Z^acwY#HkpI^YNHO=R`OG=OG?;V7SaQ z0XJedh#)QKWLifCla=s`#6^in!fo(18A6xQN%RcaC)L5hyYpz?z@1_cY#|HiT56;n zNEdihYSS9whR<;`G(j1hg++i86#=M=R=5z$a0nDbAF_d5AU}~j(vo~6kytEOjF;s>G4Z4zHB$AZF3aG{5cv2*Z@#2m+j76}YMADvgCpiU6aiB=%akA#s_&S+J|EBxt zJ#ts}KTq7}ErdUwgIL;zxv|;wJ<=cIFkd3MS(M0H9MD}>w+-SkSS;lmc@L2&QJh4- zV1KbT>L_(u27`{*l-j0l8I!zL`qj!jRP^c36+(IVK>r?eQJwlY>C*&l3joqSuO5a^DRfLOl;fn$#^QEG!CUx+Z zRJ@xaTTBtXL{BkND%pGJC(%VncX^|PlJ})r4#knU8Vj)sBVj9?gY^>WQJ5r(`A%NV zFNj(UBtbO4X?WAt=1SWwJGURPZ?&Ja?{Q30?c!af$}P?N8y`RKjUL%FY+jdf>6iFU-b(BWZMZ8II+)C%5-x*G>roK}NdiRF$dR#`+p!ce|n z>#eEUSG>Dq9-;9p$?&#PqI{-g84~GAJf`?QN+xa9Gse_&oB3VU_Wg@wn2J z-NPsPZZ*o4=z6J+=SSc-!&LJR)&*{Zt-a*?KLFFT66az^f@81q4J}zT5sOk`++zwf zX@;{TR9sS{oZTGZjv!}ywO(%vomif7z<5r+WzMo}vI2cYF2BN0i&6|GGwE1%i*060 zs0TTXlSHFlqlIZ)&DYlGcX% literal 0 HcmV?d00001 diff --git a/static/media/colab_favicon.ico b/static/media/colab_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..771a4697875f25d1c6faa7ac314b55f81f49fb56 GIT binary patch literal 73070 zcmeI52bfjWwa4#B$EYCo21bp;(i1(m{b4rZEMk@Av=hIs0T&ep9s}LXHbJ)x@4&Yx&&`?Ig#+t12R8K zxKwygs1WLfT%u+rrcziYj1rC)b`!P`a+%FJnKpPP3>3~0o)V~!yArKaVy6mM3I_<- z3;FsXfwqZ1$h?QJk8q3dp#UGdGEqm&6YdkR75WIaTuZ=;&FYlL59E$*jUBg2$hGoa zNy><@9oGnBgr5pq3Y(Rj<9#eV5cU<2JGRv3K;`;K%7Y^X^gbSIHrZo*uZRBH{zLdc zpnbJD5%%IDVT3S9*eq-VeJ8S~-F~d_qEIJn&V+sNnQ)pwe%K`QJ>TVFS8cBqXe;Gu z0|#pK7u(=K!SZTTQ3UUM@ZAg%-V~gFPJi>{;{bIaZJsj(+fL}}I-u`Bm$w$q7M2Qm zO3ne=ymtt@HMMljvOsBf<^3T2e^AJm_hLdCgnc+cI9RZ}>?&n}mtO4I{e)MAJcZ)` zIza!%sX~|VBP*TgDs}zQ!Ym^t3Ie@R|DuHoFomLLGcWe7gVS$jRj^hAz0ro&Ip~Le(@APn#wzGvibvy^q zfxinK+BVetoa|}e&lK|1c^sfG`L{xc)dSwUcGC7`Ay1vpfw@Y;Aws+BfcFmiCT45iaY<>Et7|WEW+~EMe;=6>b_Z#Y&uD)kWIWu3#Q|@t~T1onY zkkvB4dmj0ITj5zDPr1v1kCe0ng{HOxSuCtr*J4WRTFhFFnB$s8-M~G$K+Q@> zgVMCVp~X}vooi~E&DWL9W=Uz2Sy9nsimRJVxsF%Yx0re*youVn{RqFnP=P#~kqU6X z&`)?=$SNVbO3CuGwJl~^Nwc|oVUzjYyNzbQNeyQ3YYk@aR~yVXUuiIVde}?bZ|N8~ zY-)qKaCVa!v#i;?TiR^(1fA$8BJJh1&F1sfjb_@H_2!-#wdRZ`D$NgWEj0(;u*PEl z5o^qT*RL_(`PUkAfc_t(;|JYXYJPEVxf%9ywHZIB&V0P0!K_@{Y;`BgY5!c$8zh95 zKlgh0jkd~>*`alk)2z}KbK93qW~k)de?qxTeHxb4jt;>f+U=?}e*P?+X&6 zm(KSQzH!lN-M89odug#b`i?Sl-K*8+`Pu8uS1L2IM9Nv_UqW{wZ5?Q7X>qdOUiTLX z8IjE|^%~%+{Ce6ujW%x=I5{KpY(UTJBVG96v<7qb`;F$^uNzHW7T8JJ*Qoq{;@x#- z=;M{kMmpQjLb6y`q1+qtIhV87n|emE;rYzZ1{9lqiM`M?F*IkBZai(&pjT_ z)ixuWk9vIU@@89R_Zu%+|DTt?vmx_%&yXH;(>r!mx$?*N8f{qW$0CSDAUzgE|bI@N}PUO?$4H?m_;8gm;8cv|jrA z(#mFY!kdkz8)ZBBJ)XSU>zLk0eS*$i_DPfZxS}Oxd$CsK{5X}zKUaRFoTgkyKCv=u zuYKOfv(ba=U#l^T)`T{0=pXp0VDob-1%bO(TiSb}=I1Pv-44&Uf3cnOdWyP(9(;Fl zgS8K85?C_iv@c7V%wPX^t=Z%164OiNa(l@*mFM>HYzp-7rMY!s?L_94q~sUWb*|he z?@trbBHBSyi<`}lr#F~h%JbHiOHoGcUN)#a*j8o1Ssyf-uhbTcCE9PVd|GFQ++Jqu zW0wb0kyCqLLt1wIXNkG?rD{{Ewq=@xuRbL^K-W3>|4#qYDs*af^`lFgb0*Kn)hFq| z&J!EV%d6V*utt7`n`9kf^GzewK4q$v{!YY9C0`2{@ z@;?5WTj#61m(7(^c|NA>*+Tp0eAKpGP^NbLl@qEgZz*s6JkQ1dTPlqw-dAqkUq%xz zWtyui4-it3|IxaxBGo5XDeqkPPQBS?TyD#r@?g-*4Q8JFO^&{no$}{rC41T29ckZX zqF3lBIAT6XrTfWCr0`D9?!-pJyl5Me*M^3FV{cou-ktf%i2z7o;p39~E z+vRh@MuG4>o~N>)$6ZyX&&9<#pYLOJ27NtT?b7#`r>p~0^x3-$@x<@y{XshazL1m} zRo~M##xChCee5-&+!Tz-Q5{gdfAow-L%Rf8ulni=wNLOl;*aQlXO-#O1$6+OIO+a! z+h$2BuvR|~amh9+1Kcrf@%JP(F5u$0IqS{tY9mGMC6%F82cF6?9gys|lU?%6idLJC z{C~gt8v6O`D_vuCK)&3*UfVl1zvbdS^}v?m`&nwQmZjD%7%9tTMK>yN4cB-cXeb52-JzZdn4$v+re5E=S|G+W{ zm$92|>Hziy?87gGgjA`v^Vwt9TD^vet6HShniV-)IcBQMzbd zfGx1omBnV#=jvohO!N&~f1pzU?c4f5+g}N-jMASVy6??e>l00AFS~Le-MT<|(B@0Y z0e^8%_2=|`LH#;{t*be&a~tK|0GkuP^L3v!MaK%zM(vr*M)k^pz9H%Yc!JNcr~LT% z@*U{k*{H0{a@oT3PgLLXvT_+_iRlrYj@kg;f9CIvNPL?n`N$7_#HiBL{Gv_=QmqTb zck1b*M#C<`V;nly}|TGj_5;x>^aA? zmUuSb+bZ|>(b$26_qbo8VzTU?*9sr^r`0r}#r6haz99I_v z*aJ?6^#7moV1*eWzCZopdh?0;o#{7RtA5XF)i?NS>A#t*viZ)UT64j3Rc7zP5?g;F zv$%C=$m7VLaVB%VN@&7=CYBr|*eZanFj&A(97yzwFqXxAcgpE@hbfXwh0UNf)B z%$7XE^wpQCx|^sz#uHU0P*+6dEBT)^v(b(fu2gZjS)jfM#*n-@J*#Q&t|i3;92w&(4Ucjm^9NxR>H_hYaXZJTJw9c1b2i2~m~!Q_Tfb?nOmJMa7TLUlnm`G~f?qQv}ZOr@D$oH%o(^IhvSzGKXL>kQ)sDOW=C*YR0f#w?7` zxPb)pjLtE(3;ARFO%Vd=ftl;f)@oyBQeUB$TdA%*b3%>zI!^y<;LFoEfp6!7@)q;8 z>Rv}9vH7VR{PGO(zpu)yOWvrnV|(4Rv$bWc*OV{nZQY#>9iZKD>|N!Fd_tcp?FS3U zA3bxSzi4i5fE!Konpn3CN#0U0(=s30vh`!$a78zVe9lFqUbKp4E}` zw){SfAge z`=mr;m*Wufzd}I%SI0ST57EbWopgvX2Vr%9@A<6=B9L1tlw`i#V?KH!y@aiSgh75I<;s5yn1 z+5zW3yEf4rlCAYk4+ni0bKQ2iDxCb$ne8;E3Ex3y&{)ki3oU=;{h#{A3w1{NdFQ># zyP5a{sDF>StISZ32hac=9~*GaJgIt{d1+zlfAp4i<9ka}9-kJJj8Mn#)fk`9@|VBw zZ1q1fAH6e)IiaC_?vg!u5E(F6Ie>Q3@o@p?Y#&8G*>CBV`&^IS(igQnd4F`!>q8&M zexk2G6Zu~%A982YyUIKGg~QeX$bV1uI}?u}fOggKi2>)#^_rKA-#4uM54pKC(Yu3Q zoAGg`Oww-4ME+N+U$V1_{vqavhwXQ<@|XR-QvH(ww7ZVK8gS0~k1~<}p^`swFFKl# zKel^l`K#?eLSs)ln}{7kyogNX&wTX+`F}Tk7xc>50@R+@9wf|8QfaY`KK zdW4q0>_6r&cQ(=Y@&k=03)=>u{3ri2$1Q-i)A2z2f5InqW=HuT!rK4%9~mdn8N^)F zOyqxo`ujSYUi+-h`hbvQm@*i-VS_PdJAk&-@dpCVS>G{ZQ$oLA>Avd4z&@y;*JkDT z^Z0*Mj)&3#<^SKl-Dt{_4yVpaQUf1CUtrk0@AQS3HO$isAjW>M)?8d-+)pO{U&h4# z*P|77EM(jlwBy0oHMXp`#*K%Pzw~C;ml_N{$F%wRXVYc+!KJ(G~ zpifw>6Ue_X=mO#y5^o^PyWKtLz&}+7WEjUND2ai`i4*xdjStVH|Mxh}6=IBWM-!zE z@y5coy&doI-A!K*_yMo!HOT)0A+Vr(T!ojQMqA z|FL_S`yHwcAi3N7RCes7`2)n3O*Ahpka=mG_(J~vUyUx$sN6?3_zMqHEaC*dHx%P| z0r?Xb3R@tMu;1xN%tR-NtI$*PC-!)<*4C-`=(A0$)X#mX{C32hbVNJw8^n5W@(i<; z4(zSiL6ep=M&rl0=VxonoQ0EKR(t=VaQ=3Go+Pg^b|gWZabmo%ei!lw*9n1xvzenp zyknm0e^1K)bzh$=OH8->YixULH?^(r(41c4xo3+$)VvSogEGIH_~6X-he~Ds{6up02ZTNbJ1hki4d@#b-NJV|NnJBRaR0;N*Xt z{u3J@kcf@Qc(gD!X{+q3+vGv!^wU0jS7Y?)uMbQ3=tafRqy%LQ@qq02ZJm$NWx#yL^V}5w`4T69E z@1EK(;Y1KIhUnCXD$MVa^hcI6<&P!5kpGC`v$g8=L~*6hm0l5-6nbc}>;U}1 zdY{w3jJA3XcE$G;SD3X7-cfoPa~`j5z;48k#5YXP9Mv;qlQJi@JA4UBkB*}Q>C^?p z9bt|gYmg+MIXXw1&o6)G0AHBk9(#(pDgUGKyo~D&l)I-Jw#>gTe!fq{ch+?vZVP2N zYk(X&MeQN+c*hqT>~R}QJdr;6&h4OkCP|kd{DJ?4KhSqRTmPwBwvsMTCY-Ce=GSTL z(M_s1j*nTl_lU<2&X4_v9~pdr3;; z?BA1c@%K5=+b#PZPSZAUF0jr;X_dy5;?uW2fozxg>F_0mYq1%w)p%a#cl<(jC3Zz7 z^-8DcPE1_@?};n+tonFUY=c}P0mh93ujA;z4nj(GfUYxNDh>*5&0g5~_oi>_br=uD zx1H3!@Q>%fUf(ZX9MBZ>sl(D8FD;%9^j5s$U9L*2Pi3t{HbiJs_Pc_>9oKf0khCJv zHI|44`@?5zyF^~X-$eg_qZw*XTECHa+Nm;)C+9@RWLFNjugcswr8b=yRICGI%YJR0 z*xPJ5E*u~f3n>vT%~^`C#(cS4FHdRz`}^}r`*fw9^#gM~?NR-duHriwskUXJwTxnf zhePNbA#UDxO5mOEt?ffXT11_C@>{a2$V<7JpOmg6`tU#0zE>F8vwua%;$=ROUe4(+;xdEY67cir~d2F?rBxj@3-N`DKnGjfKH z;vISW6qQf-fP%cE_-OB0*le~{tWfKt(|w(;$4UeKivQM{ro_DsL92AnK7tc*!Y$W% zI78biA#I{>f3AGpXUfk_Oy^9-;AO;r@s9ckT^uDJeM!P@k=D<|M?}0Q)}r1zwqMC# zmbCYOrJESn*r$~D_^(6K2;Ijx|Acb)pX6ErTk%C9G!fI6bvKBg#@f6cS{}$o-c$be zKdVef7t<^=O_kaSj2}EsY2PxN{YEM14SiaST_2`?geB_#3YF_yrM5sD7w6G0;-vp| zA3AV~kZ@dp&L^cc%6E^cPB>M4Aml0Qd($^&RUdescuP6Y+>OiC=YnnT#)2hHWWWWC z%OQ?9wk_o_;{k2Dz4v8QJ~>^`v#4+IQ&Cnica^@v4CL;m4VSd;X zLRP3kWf*=JV)@hNB2IHRctAf%y86KNUjGW?wD(Y6r~mB%`TFTM4iis2(MMt%(Em)| z^ZrUZ{gK46c4;vMBPmvu?+D})RhVNr9$%wTzdU2LXUguP&K<3JSNAA>&%YJJg}CncIv8WYG5Yd|?S(B& zo@{Sk-By%vW2poplwvZGaFY+LVv;41xAT z!ZG4HpQqg50R4Bz3TfB*@sxt+w6xeYBK|}FGqwfwj6Ag;2Wa75D@4cl#FJ^d$MigO z3BT~2LVBJ@-H@jaqw)2>3gB2IWc&+{-)+bKexa*qSp=syt>$};Rpp6h|R0!xKF z^c8Lr z)B?*>Cv)I6y`QnW8Ob%(n|Y51#)>^9Y9q$yrC6I6Js|E4KMDYl2PVL3%&$W<2?)LY_K~1B>;llZ65y4T)vZGRhtq+h^gmw?hzadTEA;F$g}7t*QPd8Ek$<4xWcI=gF5N!Vm)w!Y*5Dyoaca*1a9C$^yk(auR?9m6M*P)O8pCe$mceGg}kp&Oh`gs>iii3c_&g`Rn;YA9h6AE!NWjp89z`ZFY)(|Ck1Y~@BW%)nJ_S8sj>##)L;>4i zQzq*8cZ73=?SwAXu1h4#u;;`BXB#lz5WAOo$JN57L{0h_^7}u8fr9ov??n+2{9EbXR;Lf6!JS77g);=uapWx&l$Rzb8B> z94%}kIuqq?2|I#BVmN_D}l1g`s}nt_Ide-6?T&Q#9MTM_A+JbH-(=I z*9((`H-%4x)k3B^LB3`_-50`J!c^fAfwE|@FhH<#t+Y*&>ip^U;sCrC$ZzNb?FeLZ zl7LTbxNxIDe+o9`6T)-C1cCmwi2`kou>$As7H$@<6Rs4H^`QcF5ao~k47Nf(pSPD# zv-Dg~PROcD=O`;uc5 zBXzBtlmUmPj)U%%1*Fdw(LFm``Po8(6#vHJtte2zY- z&FAQYlI^$oTzzno{ccO!d`=|UenC;&>yz#mw!J>m(fcv4?{d2x&99;u4#n&zm3Qp* zOWQuLAZC9feT&i8ZZZ44V)Q?Df1~^nlb^PU*&i5_A7l52#N_AL{b5PUgP8Iowmi{( z8-}R-Y4gDS! z`rSg$MpwnAVW&^5wgLT@3Zcf`Ahdj&pce_^D640uJu6Q-Q~h^AuQn|rcJr8V4oZJrQShzjkfUmd4WFUY|vai;*eDG;=H5L}|ECM>MWg{fw2_6k-&fm5h4v==7giq-g#J66ssHQU z%Za1Lnq%X&rWk8Y6)Iljt%^6r`ll-uPYdUTpBm&f{cKgE8T-L{bMxdHyI#=fnYHGv z#SLby;vB{hI%)HTw!EJ<(}#kkul0P^)cBU-74~qkJ-v8mtldS7yqlD!5^o*O*svaqW5~zV%aB$BcDsI5*(3Vsqt$DnBnMAK(G)#z}%%pf!4r zysyGU9@3fz#Q!6Hp+C+W|Gi^BRGhc_70Ya=$7)Q^OSP`6*6ZMXq=EOvrUzbZDc+EV z`qm(TtMp3BNl?tOv&6$*T7RwgRcp)^k0=d#*Di`Fce2(GWj(=PDkdH=cZpegi*&)Q zbHX}&y)P@V{AL~IlOL!s|M_5rIbg&Zvn4$6(#94(ydYVKP>QRC^Mt0Eixj`ktpTd* zdMORRm{eyzR4lgEyE)g);L~Vs)xiO;^qE?bzhx4#HX{wpLpx@u}*ZM z(%{y#BOR=v`pyztl~8BB3h#eCy28rL>Wr=#HI?rC__RPV-iSl$-p{&YtWg_8e8+zO zTGK{9A9;Hnmy?JYh*fZ_LvXcTJlu@kG)5a%{LUkGl)J_xybr?u6*G8p8we90hlm~ z`&duit$Brx>~?jD89(3ZNSntJ6OeNGG{uH=?`KOME!7%|vBa7re}7KvY3Z4+eAq{6 z`BG(#2;cKip>ENdCYxW84cGO!q1@~|uFm{R@nUC7-oy@lUpjV~V&5LCbx~Pk*{*qs z4hY0r{k76iq_~^N0)1eeP1d9ArM%fk<%3pa495w_gE!eVyd!Pe5f9ygYo zg0Xe>xx}?Z)&muTmDv9-cKXG0n#>;*M?1;`(jh)r2{a#CZSE%1{y{t@PVGk5d+C6Ol-0zC z^l1n-t+j=;Wt`MF!4h#uiKTnK);MMD3ep1aSsR4spabZHi+fF6e%2l(uKB*Ivym6P zCvGn5uA(c{={{Pj{|5-J{$+cVK%EpNo?j|GVhw9zauR#DTvBWEr0CT$R;5#{6Y+`4 z2hz7#@vTW)3~}UgJ;T1+X9K~Di-iOwS)fDqu&QCmbehC8YFTQ&?c+Rv0Gt%@BE1wvm^m*HWQKZh4`guoaPX zN%!Gn#ZSj`@UP(m#xI6%d5Bt}@>X;+_$lO;upWx2pQ3xPpThetc=0n~jIct0?-WbL z0(?0|urk-9EotBKL)&eI8-+DO5LM~K!$MSN^`HCu3)EFA=~AM}y2?F+^6gronKG4i zYN!ubTglnitF*@F8w=~rwE6XBX<3si-yhOFeS||>v<&r2D(4T=I!Ap}-w;!tIP0U- z78vvXdh`8TN=<*&vD;j-+S;4guv*udwif)jd8VE{@b(H*FlN1N+x3{rpwtjB(Xwxy;wKsw=TKcn)>nr8Dcy zs>&u)to0+Y`+3HJdfxov#^Tjg&C3oSS!%Xb`{PZe!x8I$lLppLW<796D=V9ATKJw< z=G8TqR5vgA(Z9>=w@vcd#;l>RyXs=>@h|l(M=R9!*k85=?VZ;@SBs>@6kV)!O}oqf zIc99NnWcEt#A+r+H|77E^4crXNA$HwA*^yp?GQ5mMw zme6r@o&4g@Lp+0Y%opP21KvrVyjCE;*nH<@L;GLH$P1KZ*9eqfON3>@JHjo(AwoC7 c-4R literal 0 HcmV?d00001 diff --git a/static/media/copy.png b/static/media/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..9924b823937f92827fe10a4c366ab93bd7168db0 GIT binary patch literal 8116 zcmeI1c{tQx8}Pp~V+@9|Hrd8fmi%mqn8u!UNVbG1)2ggfc3DRH6^S&alth>oDMYqx z-!^J0A!Mn1%TFZBP#F7r^gPdXJ%7A^zt{W6)xh z1VJKHduulcLW8epNPr)F{EqHg1Rs21JE?mFz+arekreP-kZ$iC20?hq^?wwUlPe7h zWx{Q|!reoUg-0DcbrgzYv9Qyrf!gZMu`xK`xf2dR zozD4pr|R-YbVk~&?mtH(s;~p%LQA9>(e%nAXgV5|c1aQXYxBu)Bm5U)hJ+w$$oK2! zi9!!$CTn=q{Cdc@Yq}pMr;?&KL)WcXfoAL9|&_Bme?FPXj%g)F@ zqe{&C^zB?5Gf0W&YGDL1lJG2Qfh8Il<_6oy((;>;t2(ul?K-Be7;8%lhU1^s8zySc`ZsXjyoE zF57@~3B88pZ5{STr9ah##-2NJ|Is}WTa7h?d<9I*$&UJ3ppY{PG2JK^DjK;bJ1qCn zP%esuG=h@GLsd8iZk^u2)~^MB2D(Qnh?A_D zE!+Ua0a+YX`tZ*NXm)r3POsfq!!|T=Sjg;~FHGK*wglbNtwH5qAShE0_g}5>ZZGYy zyz>&M?t=tEq1^>$VsK~5rIhc%B|@iBKG?_}sODQuoodx#8LqEHgTir?%V2`V0tGn; zjP1m(^O%q5HCYnd`3t(;Knq$GkKP|HMwR`r0xQGX9hQsVtQa}x(qXxzHOckaJ>EEe0^>NV z=r$+dB`nVuv_Z~}nb*CO^U=v%64VhP8*i%^HAIWERNX8Tq?lvR%`*8tl!Ti08h#qjwJ2yz^{reO;F0LVE z#wAp33iU;tRH#XWsGYuVi%gzZN|0sA{Jm-hu4_GL-6IT9J_n|O=Kw|>wGn+|OFmZd z8!y~bQjOZ#J}wfMJ0lnNTd@A;qokR=3>9iD@ie4}R#07i@p+iHGdoL#+UYWZjZ5cA zMtL6IOt-kJ4@wv$#|7)?-+~Qk)5RGhwoJC=K;F#$%uz`m`!K2ebZeNt$0XktYR;Vq z*8600>posd_pf#|N9WE)JKSZJ;_Y_mdC9ebW#3lQTK8fVYS<|#*nA^BZr*(p)s65b zNiN0w`un54y({7NOjfH92NzZ7JX%ST)4<-@@e5cj)4I=Z&4cBS-nUJWtVcPkLVb8z zb@<2P=-{}&e(C5@H5IDE_dVa7$0|unzqd)62F$KFQakDK8_80=MwC}tp9sE0(oQD3 zM;jZmdDUp?WUJBX>sTsNf|AFRT&f+?;~2IwRf;j%@iyGvyzjR*Ht}zv-tW_Z`$xqN zQz#TT$O}@TZm&m?^(il|9Z(=yFxkr9whI?%zg1UV4{sJR#UUFYs@p^ewk?C8cWwdx z+M(QX6qTt`g-mHQAN@GlJ_-$0K=#aibWCv2<1kt{-AJT z7S@EADiPxWNYkj;=JnZ*^{OHF!S`_q675fyz|u6r)@QprP%Q`7C)R>)N8uS@Z>lyj zZvUt7d+8{&8QddV34f|Y?Qqfu4}!U_3w&7I2x)-)^~BMTZ%RY>*9^d@{auNUZz9230##Dt^U#Fy}@r$oljdc7osO zC$36)8Ly1+`bkwT$>F3+d;@xG!5BuZ zVl#J&aRnBK@zXLQ8vSa>dALSHv7jzxhPv-%CA90_A_FszMxv5FLg$A<=iMd@p+T$; z)MULP*C~7*OWWCvlfTuNB3aZ@29IdG7dsxS1xemFLoBq=2k^^!bc42f z18YwxA8JGO@cF-n|BP-JB8q6kuMH}U9 zT+L)sY81#Dqs{5T^sCAhe`b{)qs$FK$hkh$m&cGm*f?nl=Px6HhtJ*@?M-P+YDVpb zJ?B+SE1g)H=&5Ho{(2hfn#(LovxdZtM9PjInewN8Rlt}z)NSIr(63(ghSc`N!w&B- zs{+xYM>P*na~{?+K5PjU=}OpE;yMwwcV(e!k+Gp)l1HZR0@q$LU4xs?_*s-}(1PBo zJmq;Q)QtWY7h|&EIM#L<_J9ZIPCZf{gD!tP5+=*>(h+&)xd}O#3I}&s$|4&Wf_;W| zr%i|7(3-__tvb06*+IH-zTsjb`Bh1NXf%0jck1Mfx4% zWvXn&K+cVjFiSuuPHlYhSeHd_GHEt;DS z)EP4&kegg)`qNt&EO5tggfx{iZhtCK*TTnTMfJiCFO+ZE)RLnFYXwC>hg>9d>V=|q z9Y5{~eMjZPS&Y< z*xo7XkPX~+@W-9djexO89hQ5}kI8Ya&G9F^;?^|#Vto00x9OMOUL|UE2Ph1Gt-S(w zum;W#oK+he+=u)PJ9Su6T$cKcSib^i+iou(mL98>kJc=ITq2nD+u+~MFvWawNj85n z;Mp0Q_e1vzG{~7V+T){&ksl9hbMU#>HRwcoA-nF3KSZ%d5T;%Zcu}FKc%ZM zhIJ|9p?ZS$^&<^;f2Lk99Icbv-j!to|Me{q4kMZ4GDhR}syGc?W;xXqeq_~UoIW14 z#`;$yBeAvTH-FY9&u|Ob2g!`;d_1{nN#pv3(U^4+q3gA8YEfQafNvJ6&OH@pSEd&x zvoX?~CpT!2$Ml-VbJt>P+gyz@FQx=g*^z?}O+s4dLCKI-{9cY7lC z*7haIHLIHw(Sf@9%Eia-N;J>CjU4~*X4h}^*d{H=eU9)g@m{6OTH0KQr+v;R6GZbx znPsKS-PvuDE2(+9c$gJ`gQqxFJ4B?lCfu=f!(2tzh&L0{jhp)3X#HEp{DOzxNiXMqXviR`94Rw6j0Tn-`f*}daF)ba zy4PI(05exOzNk*UEpm~AWIdL&kjp{tiWg=cE_LRxoB zx_m49L+|cMObGre1m|_d&){kWoL8B)r=eOE$_oJ>lxCsTy+my(260unC&9w;z8(JO z%b8JV%ny&H#e_5T9@9ag75=9UzB&5DP9o#=XS}Z*X{Vch>7AgUz4~|yH0Zn^zzkh= z*8Jk8Vuc%wl0vJC<&NRdY}w!Fa`$kCIDi+W;vH3Ga#dyZV+<_qRF&c@=9v4^6W66D zV9hSjRcoB|*F_LY<+z_ldC8J2Rssv4b(DFwACT4dyK@mma}l1T;{{OH>cZRefGPua zPyDo<_*qH;Zq|1KSHWKFY6<~_b88iN)*1?h!T#^F(uZ4kCh21o_+RzP5-BX|7qZV z8u)*w0quQ?BpSZQ1}A+U+(2E0-5scE*3*_ z*v=-~4%d4or_%K4dTiOD3Oe5U9^`y&BZ($_1KiT>&*UBMUkV&J@*QJ@d2=Srq+1&n zqPd4>y8a1PJJgWM4&}V3{wI)sL}!gm%2gd@)jn3gHdU+z`9ac=779%lnHyCa;tGNA z)8kLJXIdqneL2hgaR)c(HS^r7s)urpTgpC9NaYThfh45|J>wC`sxiAN@-d;Q1k|#I z$jxP+M|CsG)G+bJNRi;+CFzr45iL@y2^uzvd{)NxD&5Ml6SDpN)eukpj=8fRwmRq8 zpziI_WZH3DDw|?mw%^Kkpc>oM^85R!rvBQEG3sy2tuK;jE@?$g};`m(|MdXQI8y)}3N?)fy~gl*9kGuBFNa zGPM1ZIDn|{yroFAv;80UN8AFA+>8PXq^*12wlH8vn9J*WBe-*}eplo|}*M0OjFy6Bs9jLBmqL9VJnwU1kJXZ2= zZ~uQ22XMePT5qc^*xF3; zlj+*NC@+k!A`m?Swc4ErEGBtx=^s%#DR0>wzzO6l365E!G#F}jpO^YRuh8zKy+Uvm z$k1?wXj33LeZNYVTLJP?JWD`ycA8k^!YFk38m_?bsjDVGW0a- z!8CV%khc%`xQ!D(JGwoftJlIi^ooV1C!~N*kRlxt_Q8avf&4h-E(%{{b@6KeCsxyA zxadXA(8(5AT3OzA3%ApA*dB>y!*u=KQzr;}3ig(QNrI%(t^r7KJ+m&WSh(uBrVw>9 z9QtuR$hodn;d5pysdY|YgeiLpJssFld)V~o%`5lAHKuW|*HN5m{z0i2WsItkTu1SJ zb)5SdkHhg0a%L2&EEguH86H@=-1RU9zMJ&9DEaM9$Dbt<{g-%GO$Me%8sDB}=iIbi z?$;mqYJ2Sdm-$q4mt*=p7`wS`lFWd|%<4SPe&JX$-LNg5YXgD@E* z7os5bc?Fs$I34)b_nhcju|}Et>aFWPYb8T*_Es~2aPW&V?J!bngt@9)A`vw&k%+vF z_$1m;@yq+NL9k{LF2&FNJ7w}tdZ?6r^FN`f=Fw_0Ka<=~=0n9czqaJh$6w@C9brxn z*5^r|kd3^X{ys26)(>?x(!_|lSSiK(YdWx%eOSBPr!{P|(>rsqM6n3HkmpNuH~j8f z4=3Vl4BEz{L)gWXOhZ4xxayOra%YgPEygdQ*Rpxr3rik}M_YmdEcp^Ix%kbat20iM zNB8e$vUe`hAfCBt+_BEu?Ci+JJc^-9 zQ^_WgXa1??_ZH=|F`>8P4(xF=ug2|0>m2c_A?8!s#sZ#oRTngzsaEH1=Bz?i)mLZU zO{V#;Hk_+)q2@F$z)xXUxI;gY5HI3wRX4v@IjVHQh=qoZ`Z1a>5cH1DqdZX`QRe)m zcZ0^Kw;l~+cC%La*%yiEv?LN^1YPf<6F=o#_hN0+Oyij)Be)(!8w9JrpfnA2i^0Gv z?7Q_h-53g~ghI+=-VVgSGA9nu`3c|9)~x2dBlf_~=ikF1oUnJZX(B8yjf&lWBZh}h zA^SMmC@N>tm9r5adVx^*L@R~Ro{Zb#{HB=#Qc@ns9?lilAKAjwLJ-SePKVvlvzh9> zUtn3SN#}w8)-E(uj-zj1IPmMT3d4gHPnb*rh*YDFefC5X<#jiDSMgK+`_sI&Z1y$O7=??k@vRXd2Y%M z=W2XzRSa?e3@yvoykHqyty0VdEmJdrsbXh~Er7Cw9?%)XQSB|Uqk8-=$xDKq?BrcCW)$z^6gcxHIKwp5gST)JYMk6h}B@#D+e z2$r08WIJ~W_5>AVEy#KP5R&L_rmjWp2q_vrGNxue#>%eGpL9TMST%eq8lAV{X0YB^ zL?3!T?#e0MmqssxsCs6o28HM?l$3L?eW0QhonZ@KS(3GzPzfU|=@$^(s|5}9VafPt zr}gY-q#jq1F#w8r4cM)Dc8stjoJI{Fv8Cm*!Pb(b8cb-5<7$pX8T9tcDdaHAlVA0O zn;&jfiU)F+!{2Wg^0lA)h&H3H{@f{58ir0T_Xv`w zrh8%H7&B+rHazuaUBlA0U2<(wmPQYa=WQd1%5ciVGwQ;)`0sC)JoLcw@sy=u@i&b)5BIk~R zG0y+80cjrcN8iOnVf`=XUBS{QM07JI*Sc@ls{u@Bc@SEsU|crV?8~4hMhp5-BTp75 zC(R67QYW6|&InHHLN$E;myf+fiv=ojYWNRe8iac(h8b*e1q^t=wTLO7YUw3+e)5LK zrcDrOnkrX_qxtujzcLR6v&R>}E=#Q0z|RX(*%@BY*sKY1n>E0P!{E?M-_BXN`5C$# z_)t%*m93TF>Ev;@yAT=GTIjuRFAnP`PC6{?nI1Z9$2n&0gGsY;bC~sVstalstW~TH sJ@%l`q##kB{^4!D`OEY3tXFHeRMfP*MY$#lys$%5o88u>J85VB58juND*ylh literal 0 HcmV?d00001 diff --git a/static/media/delete.mp3 b/static/media/delete.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..442bd9c1f4c9cee39ca9cc776c7cd594c90f2795 GIT binary patch literal 3123 zcmeHJXH*m07M>&!dX=iEktT2fsh48B1PId6#Ly%{0to>Gg7l^YAtC|_JX+`=MMRMz z%|=4KfCcqIM5>~Qpi&e;ROW`Ku5}mx?vMBDy>G33W`Ad9&EEU$Z_XTRv@Q(b0CEUt zjnm;cq8u|14hsnK_YI^Vf`~!nV4SN3mNU!EF&!;!Z5$eF{&#xRLYqT*Id&|R9OOd` zG(Tc*&tbkC+rlwwSg;q_7~vBd8f1LnKtx1@W)LZa8WukCkYH%o-gs`WQe7$`+4l$5~2qp*kMsj@5D1;@IO7SNntOLC?!LRAvKcf9@ zv<~#9a;ON$-~b@t52$T}<95)t;p%n_ZwI&yoLEM7ruG)Pnns4fkO#lAk)SE^SeXF; zZ7UCz7B9tLH~v?yKN=(v=Ao(A3&8&P?V5oB77DOCAk1_{K7L_V>G{%k=1@Xx3l8dO zEQ;Xh5RJBl0zvil(`Yg2v9WKO`FktsM0UE{FSY4QEWT_XQxf{Lu#@iE>PKaz6z^1S#Kk6E| zG-kc6w!8meF>Y{bCCjCuXMue~ilz2C!X4IBS^mk%roZYV3EJ%*WEKJ4CXdY$UQ4Z)#EROyxblolH`S9mE z2QJKK*G*4-eWTyn(ffXymH0Jo*N+cx#lj%oWXLh=832^!1zpK5Gt?{Zu6~>g=Qj~g z;kv01&+284q4hmg6M7n=LU-_69`#Y6$IHWWue=~!%*zSP3s;u%z(unHZ6oA6>5wpA z0tUusc++ve)J0)^ot6*o<=*A4(6PhKg-GAljOBMKHQ4gC4?a(i7x@ucDN0>VX$46b zs_@PuxW{RY&!YHs-HH!6&(>VsY>jx?(Z1VQ#7!ci>cbIby!@Yaoay>{p&^lq}H#A~FK*Wpum_g(k9vo6T>j89*1Bax3k zbT?{hF?OPO2hY7UaB)<*`XH)mlCdl$c?$Zt#HhLHK)t*(Z)~hqV@I<0$hhCi6GisK zQqs=-E2aO0K*XV4AY z!)OJaCpY7M?urlK8Q0=@t2Y=qzcT^2a?j1DdZgooQGn>Jm3&*B3!-+(yl*41&FJb8 z%B8%lrQDQp^lfz);i~u6+0hrQ!-U4_E0AzUwT{P@C(xp^>g7$30wuI5Qm zHXns9?$9qO{c4Bl;se?U9=>zj5DZg2HdRcIS8=3SR_2nB?){D;FR_fg79G`}9cu4GN#xS_ z*Spjxg7uKy;zd=iJ1eai0tw$HESr@aaK;1VibBOdNH)79IuxFx*KgTjnc=sowdyWO zdL--2d_Pskq{g}N^Uu2^dq0TCWobt zdDo-+Bj7i)?x%kFm6xe+bkX}ZV63vAeH)8yy)9Sn`RKCQbD{H7^;pMaDv&aNv z+Z91w$7vqa(F7jXR5tS9Y%^%s3Iy|29127mmMeD7muocCUcW=X!}xolGP$F6HYPB4VL7_aI(MCd}qs6aUj^1?Gh@W3yLA@0ZwTW z)*=GR(#7yAd~pe<;oqly+u}=$xo>X5oPm`PV=M0;7|ng5ziXP)deG<5Gq{P zV8SlyRFD}Ba3lEn<>S3fCj@-K^~4@gX;D=``xW47B?H~p0+@o}Hz+)QUzwNroMxnk z)lGVO8nn%?1O%Cir7lCA5P6!OmOHWbu%2aEd}63QJr{mofy&9TTS;2wVmyFx{B`Eh m)Y*Qf`iFe0Ly8GZ08$|b00;okqjC1dfB267KmOlbfxiHkb?GSp literal 0 HcmV?d00001 diff --git a/static/media/delete.ogg b/static/media/delete.ogg new file mode 100644 index 0000000000000000000000000000000000000000..67f84ac19a05075a52de49829b3a2bc17af9e29c GIT binary patch literal 5731 zcmai12~<UMQkbya=Ux7sx%#2s1z zeSLnbQ<2iDyGCVU8(<01Y(^MI!h<=~eVuXuCMB-GTqP_2dL%0)9N*9zRD^ix|2aBlfNoisNpYyS00CJUftSg$j*} zi?K2>IdI^>mY5(;bbM40XG=6Y#AKN?VMIr>{H4M{AHwAL2XHvi>^No+iV__Z790kM zfT$o8n;98)5YUW6s9n*~ArVXzDJpOaOm5jKw4J>N3{nK@aV{uf(m)O!f)Eh2UmvZU z7feF)d1Xe23VBWvN@$u<$jcBS1G8|VKRXmY2$(DjB^klF6%(ZJK4J*ckjpM5hV8bj zMk!>vJte|#&20*ds%oiXMfIT#6jyu8K_Fx{PP%F8R7uA;p_`5b-H+PrPTlGf_Dal! z(&H=5I#DSuW^XFmDGe*C`i~auUBLX` z%_g)H1K9vy-ig(|6RYn?)xX0wR*-tQ69O@{p&AR>_+1?Q9nSZl?TT~g;Ow5$nCI8pWzRWwla;Vx0R=v8TrdhyWB3|g__)tbU$X#^wsv|fN%qPx!sOV11x zar#I~Mf_#zkZQ3)ea#>k)0!+%7HI{5d0~S^3N>S1V6FE+(Zq$T>VV4N6&to*r7g?* z3X7V3C4D!E&%la|2gR(ba6dqO3MzSb7cLq5Cwy!`+yX|CqO-?QiClSxx^9(j-iEkS z%6X-@PITplZ0=5SP0AjsmLWgxxYTkK1f?RRDE_mPLU|d*mARRiZlg=RWS>kB=mdk7WC=P5&pb z{>mH(Bu%O`CwYu4+?|q?-FEQh0RNdevFdkDYj>U2cW&0F3>x449q;-9e^1TP4Nq~` z@VloGKcvZYx9}SxFo)>O;RNPb8`Jl4qIcWZgjr6T@sap%GDngkdPMFEr(D^;GpE#u z``nVdk(8_NoxAB!K}beX&6#s=YRXssBXdGCs|z!$Ph?J>;2LEVgk=;7u9io1H%zzx z&-Pd5>|*PK1~SKyt^ZBt+`wtugKTOxrhHho(fS^6Xq@BPZvy~9H*%DmrRRtn6+28N z3{$amn)QFr7{DFIQ-<)svH1|B1wk7@kW&$v>>Rr&YcECIguYxEQNHXpGPN3Eu0&j| z7nfseXniG@*rD{{Db+~B!6hZzU@I53`c~Cm(kn|vaO}xKZV;4&>%`qgvinF~r4D^K z_*q^j(U6}vNJ3)^kmhKED%HRjB^86Du1X%#IrD6#YG6h^SOh76cU9Ryjt0y|9fBB2 z)RpKo9<>iWkwfjqz0#(ViPa_UeMCi_)NY*o*%SntukGH4zN4MmYx}AsWx&=5f>1YL z;I%Wt2RT9rL+ELYet#a`S>3={&9PsdIif}x$;aQt6WnO@9yR(fjs8%RLT@vms8J}h zG`gB2U4uSUK%uur_T!mjH2Pyr`fwZbq2>>s1@YtN6mRe;2Hg0Of<%9Dq+j7zQ51El zC=2>X8^JA(?nY;N)9Bs_Oz(NRr#R6WaNQ|m8gzOaeQYk0UXb`Kj_&8l9Gj2{NrcwIMo{9~Tq3r}E2 zr2m0)zVm6#k=uT$U+e|~1{a9^(b`wRvP)6x!IumO``L#^AUOn38&Buf}1uRE#kj=%^}aR}-Zs*;A2*X8Uc z3$=NB$l!yhe22 zCrc#|VK!MA)JKBzTOP$*5nOvWrOYJSmlZZ;;l1b>c zT(S$;6`6c7jp`GD6PHjU2w+!0R4zFJEAsJmX^ltttdj1kzSV;jUM~X54fsfB^2Jt7 zRupbx9XYICqP#|^>B|Mm-C2Yxakzxx8)+>r;*jgb_o>-{5g2)Wxai2Qe_GB6$BM*^ zdWmw(#r#~LeByym7Lhl|0HSiKSzv{4#MP>TaKI>{o@||Xz=b@i$y4K?#OHLktqYnO7%d59v=zf!dDLj zzD07B?J!z_eYQsE)IDSjIt@W48Sp{9y;2+0a}fhPFKw`)<#S}e5<>}>j*6q1VN_CG z$c8n^z@zo?01A9zuTOY=%czZFeVW+J*#JNxxc+vb&t?dE3pVstdX5-CISP;svI6KO zh9DTd#Mjz*a58GADq}+-=M%4nja@& z@Te;x2onP;q9(T>&hgWw;LKbB9g>`xWTHYDZzo!W;^k6-I$%-_TM771=pkY7eBPn} zG$IHI2mmXQk3G3w=*4Q#<%=10gb@JZ)`=n(88BFPuR_oxIR&UmX1$|@Arg+k2T6@c zLIF2s;nLL^nYhUkdquRc5Y#wTNJ;4dezKDKBMUIVrwA~JliHH5gv0&2F!`GTH;Df* zq6XAiDjwi(EkdqWT&~J@s!BftBfb{th0CAc)a-v(@BfYRWz_@7ecM4czpPY%mK4@| z?6O3!TV*V<5dp3;$c{p=V|ks_boA@WR1lsrdot0;0H6eo2JitH&GR9j;ZUg<1Ac+z z=(z7g#sb+227EC!9B8pp{TYsUQr?W2rfRjUlWim!Sm!HMu;Gx5rKjEyXf0hSmWfGm=sU zfPyan^XA)Pew_GLlnx z<7@qjZoLTnvs*HILOaP&k`e^Pj)qU8#hoZ&Nos*}Y7QI0*rGzsB<{M%bkY(chj}=@ zx;vHix`dJC=6W`ejO(c5d611xA0K4bwI=j}%PvY0GDYZ`C)>c(k)1$Msw^5RZMrdl z+bb*kQq^pw(#kujoWU>|2$9;UbozvslB${@xtw7IdF|cbsgR_Uo!xSB)oZgGa(<8E zQK=|d-4jBXdQMV`TGYYkt6i_$gj+fCm6z}4FlYk=<*r8Q=@k*V%BR-kAWo~~s^+Qj z0DK|nDJ*FXl%y|r;>3wyZbion8GVPK)XLj0WeuckNvEi|d{vQ^($c%T>_L@fw&dv~HI5XBh^yWBcWoiLfIa%=r^ zMtlX?5`SnuEBy^|;8NX((LLF5;R}{0pV{XH^G3$MpSXmCf?$oi&fH|KP}pW8`{Qc4 zKhBaKmG_R8-8A>WTp~XuGZ{3k?x|h{;qU%1NJ-1zb^S^!EqiW@j7{480+_18@$Z+8 zJ$@X$-6}sUoP7CRXTlE)Ew9%oRX1G9d;gqgc(-tNH&+P?(rTO=jXr*6h0AvZUf;KU z3GTzs-{trJ`*42RcW(T;&!s;`E*;b^{@!OpxU%Nj^9nnlW`g!^Erlvsn?>?_YU(Ga zT|HR%eXpPQGE-3k#5ziLcS*(7kHe2p2R;X1IC{?F{IjLGCHE@jMw2r)m&ShowDfA` z!g@O!?P-mhad);|_<`^IT~5jwn|CiZ973eyVII|iinxMJr~Yvi z3iI1ku@<7uG;Fm&466?IxD>)hnr4b?-(Q&Br*lrL=l2cAYhq`Zf;WE@-*ic6fFfWA z;Hpq|$|r2Hi*eSLi6IxyH=Gu=^Hx9k&YHxTKHl{2ExAzXug8V6mMV7_KOd71l54b0 z+N`x3ckiTJH&J7K-<*lxSYKP@sdu*8F^yh#aDCdHp@_sxh;kjz55v2zh(^AKr5U$cjWPrn9VL<_N63e zLT`BwArth|^Zmou^xorHnjF<#o_kN@Kh2H77Zjcygp9xZaAT$`h){=jl)te`bCGQx z>sIrU9Qx(M==|)b7T(~ovys;jN)>W(F#l&RR=Fwa$vNU%dMeP0p6s@vu7CoUZUaK~ z%~+WaBUgHIw>>QQf_Y>gc5DUhOT#Yf&Z5oP&8N}kHhO~bd5v{?N)Z9h1Bf~GSGQ-lb|*aYS|sWn=WgpR+|J*m zLA;Bw5k$>x8|RwBA>Qg9*)=A0E6Znw?b<&lCodU~CH^w{pzFD-!Gn>hsN0dT@`vaP zC(YHCtZQaBQ9?Xe-@$InIinOsvJRDv+q*TE)?b?YZI8vX>fHui$JlEhZs~Yvv5>Ma z$Ho4|wZrh*=zg8=s8HNYgX7yhL8Qh+JDHvA7eS`tX4180(lPl%OKaZ8`!41jM7!)z zs)e#vH?FW>Rh8iIc;D)7!FB5<;!j21#ls=^GEew#6``wK_s4opB6}aUB|26q?LU0P z_q8k(r_m^r5M+K;4d1}JXQNPCz_7-0F)n7KUX*#thF=Jrvx0SY`ARwp@wW%J9x!{G z_@JCD2OWhs+Rm6Bc5^BVRy(fsc1Ll~k&Lj@tZf!PqJ0a!T0bkJJpB->6@Pm7qw-!A z|C5BAG)46DlMq$N+SlXe#G5}Hyxt{uUz+CwLJ=arw{@GUiq;MoPsRVVd@jnKJDb6N zJNC{!%Itixz-0Fyi%tJj#)YfU`$$#-1uyocuBTLo{Bg0$<5d3%wyK}{qo_r!>P*?%2`8@z*%I5vsfd(Ix~S`4B4u7p z_2+r)Y&=Zxk4wLa+d;UzP(6R#z3%8E)djT*1LZEK^FyCTC-D$Zr_pAcv2KdVmo}R> z!zTOMCJ62cUoH<#e{}c=uZg++gvy;U9-ZjOhqDd|?VosUhwxgBhUc6xTyGYZg(9C~ z-d`-562E+s{(8vL>Bu9iGMi(6eBb0bfTbPdTz?C{?f7P!ucGnl9+{uMI6WTV{rou; vR`?Wo(2Qg0ZT{g!$8~yn$d@jH=kr;w_lFKSxWQO2W1GLb6Jt_4yA%39fAVYV literal 0 HcmV?d00001 diff --git a/static/media/delete.wav b/static/media/delete.wav new file mode 100644 index 0000000000000000000000000000000000000000..18debcf96d6f76e36f295feb6de2f09dffaec1f5 GIT binary patch literal 9164 zcmXAu2Yip$_s7qDzDa}-Dr%Jc>{XkXr6@AY+M`sB5G#loTWQP)MXjn$P^v{yVr#9^ z+N<`agpf$`eeU_c_5bRtvcAuK?mg#oKA+Dyw@pN7=+WXL9UFFN(r3`{BDqAw@L%H} zMW%N$;z%xO9?`a4BEOGl8QLnMWy2QlKhr2?#GoMq`$hLHGNi|l$QX%e*ruI7zi&G{ za!6EX zIe74Z?*FaCzkMTzb?-53*x;Dqk-dww7~H#GpMHGPBf58yn8-o>M)Q5o*dk$r2lpKq zStKI5S4DQ#s7+%(-d448l`0~=dkpW9Tuh{>Jk==s!uFI);v+-#qW&OvYgSyeKvfpSiNzigSQ0M7e{Yr*QV;L-YOb2tp95aXHv^Lgknr@%!TS*lw z*QBk~kf}0K{wJSGQPbP`)A4ckn_f;a&l}G`pPQZ!JTuJ;ov7BXaED|jW{mcJ@~P**n7iD4&>l^4i4v4E2rl+2d*CRFKE&wH@8Z-binV_pG<4+t8NL4jQ9DQpp54 zo6Iz+Wwtw)ozNTz2U%T3Qn1dkHtS zq?s*YE9*^ZWq#H{BdMr~uGkYc!8WuN?R`5{HW`o8*IDH>acYo@w7d(Tdn7ADmkH_OaX zGt%sl-V$W0nY8Yr9bfWARQ!Qq@nrFERaK5T4(96GTd}AyCj+%?6kk= z6Md$;^m83AwVjd1N2}Q{^tfD?cbceob*}hJG3}>6Ykx8)a+UXfVID}PmN2!PeUgnc z6_9Z02)=JvuidGiXq5Jpn>tvtkc}{1poOKB+yEJQrJMP{SeU0Uft3kR|m-$TU z6T_ieU2;oR>7?E4HG4pxNupfUe7x(n{I2nuF1<`ka~7QKkqIC#FFPA;3YqJ=&34jo zlW0z`pCOt_L`txuS$f8PrDvo#NZux;rMW)U?J`cfa;ioWDq%882ieV3X*E+@M91)s zmHM{~6xYV+J&88|>O?zC|BwZ;fxo?w2y;YcOI~RpIb}2TAEG<;kk*zeri}cif9ra( z^&7FQDAOf7Yd*J++$y$<+$CdKar(`=G0WazepI47Mz&jO#e zeg)pSPs1}x_(f>e)C(yGeRg~h?OQqRSw^(~S6N%AefLS`K2I;tK0V|4!E8?}oH|pp zd1~98Qp0zK^FQL6!&6u;xy^K-xo>8g+S=AT-u+E-m<;>MK9GabTKC!#`i{6pNqf`P z6ftq2X_F>M4>Q%glBJph45hdS>?~cZr|cR%4wto&6=tDnAiH(Bd?!_;EN7es&&`#7 zri$4BgKX05ve=Y0t#q;twta1V-jH2x>r3;k$8l!rY5OaYnr|cB!aB}uGds1s_F

  • byd!2eCa;2SN@P6|j{ouc39DL8n)mgA(AWS*wl45GVAr)vfIR$9pc?M5}O&^(~N zfh;A;or!ZS{MQ7wZKH=|s);w{q_+N}&1D5RD0h}U-As$X)#MC~r;skk$>Br#f6exRbd+r@BI7dUahejtyfj@e=6NM-SuH!@2GX$8He4YZRTWVeFF zSlJ|H%r%LXHs&vK5p23^FHN(TZA<i-D;w@mL2>c)157QM<~Q@C?1L8Ob@lE*3w6MPC~%mcN!)q*~uK)E#u{H z>Zcb^{YeD`$T=OWS*e*F)Yo;Md2MU!J@P)AoGj&;cI;^@NZAiA9_TdPt|RaZvFOJW zbl|w2QGY&>$lv|&MPubSPO7DFR{ans^2n|M^_B`Mp`oC$l-6a(=QO{345~)3&M)$p zgvdQT0#;J&c+Dz@rJ(r-U0AD2bq^eSjoqhlo_#t~e9UcjwTRDzkuQ-`c(>f>Y-4$( z)pU(smSN_hG?PUA*DkT4HpJG|1F-Wt&Cqr1`&ShFA$56F%dx^jy=7n8u~b|;YGprJ zZOI9mngPT!D{g4H#!&|$=stJ?{T|68KVgGgOB*rfCVOnIcWo$poTtOll5U(n8C(Q{ z+a6%*y-Ft8idqw0ze!I1C40rGfR!*#R;h^+9OT^RsqW=+5ijM3?rj9ajqm~w;g#H= zZ7)vp0_a<)|C5vYJr!RJp4@Jm5Sw0lAI0lMh0cThuBjt&8cY>mKoe6mCo%aQwI7DB z8Ni#KQXvyzvLqX;pGhP>_H+3PO!Q{Oi=1I7?Eg2s+d>|qABV~Ra4=dOHoOE<)^omv zI)a=;aLUnAjrPThTm6Kf5_|B3z$hmGe`0|hv5 z3^h{sKXy3CnI@3kDY_QS^p^^-W<2?iB3cWnivY=Be`R<_brALv2IvPDU4WzS^0}Qv zdlI@4MEsZ0sf;0G6^Z?3*z_A%c9mAql3G?<;n?P&bT3h?nQ-MaIJ&sZB@&4`AAi^Z zHtSAQ{vq#??7k_r9}CN`CwBKZOPD^ihrwQ^twU`jNFzB*2AkmER>3usi1i4W$f{4# zv-#{~2`uK-H^lERd&(Bm_nG=vM~k2NgF2`qgQ$$o)LC&!lP}~`IA$$)JB~^ngnRJRzo`34TD zLpGYDJrh8Db25?0ySGr!xlo=}ct5zWN0@y{8Ls%u{*lDSMu$ z=j>g&gz0Lv8YqjR=Iij}E8>8P$cN-FT&_?zd-ONiPfgt;DnWRga8%}JG_NW=Fw>h~ z%K3%*TrdeXTUz7vl1^KnzD|t!)9g26G|t^*Q&n`jx4$=+Gu`*O`P%+qbD_A~^s>{z zGtkVEv-UeT%%+3fCmKed*2tE1*Vu<>#}Y6!7%nR%bETY_fO5ArkM&zB<~e#C0|VrN zb6??CLS&7UGP&eOs;IDBu!*)c`ASDyHpzXMHcGz(vE5*!^YjNt@MJ&J8*Zi2qv^4C z@U@xDu$$aW>*1VBLBTNdt;u5?F<^Bu?rW%IGjo{-r0P`8ZE*r!aDg{KhFIc>)KnT5HlQ*B8d z{N9&?ybodh12Ezqay$?&86bsCLGxa#eTn=?J!*qF$sF|Mt}P;taV6MnHKXWF`_XZJ z3a(30y@$xdVcbYwyi881iWc7E`IWHQGrGwHobMGPw*b%jf{JNJ?G}KYtC5TQptm;f zjis)8;9uX^C~7#C3V225_B-|V3D^&(hMyAW#pLA#vGJAiOgoanP$0RBLziY!eYNRJ zr=f1OiDgMN{x9mbJzgl9xUYvh>dPZoVvl_ULN3@boa|p}X%3n+*tWPyM!UP< zmv-ZN66p8W!1*ECl`6lCcfKff&G)cYR`lVj&R~-D2aI>!Ueo+$qy&(q1S+;L9dSE+ z%tjoxrKY=rfl_#g>+~FZ;n63W#@ZeMf!FZiMg>*1G1@a`!P zUlZSRgSo~IdfPyFpoYrq1$@ghs*Yj`TB`~&)YVB!6! zXDvBm^P!4mrLhLs(Y6X6WjMXi2BstH!Xz8^%uLymdDREq}m4Kjm|T->W4mb7Cz~u z@>C33-V4o5(rnAE}3+U|DX$w7Khr)&5v$G_on7Jib zgYa5;%_q#-8p2VN>3oezCpZ16y~BK_s+_j(+!=NvRa?Z~VD_{K^gXxDsMOA8x)bf` z;*@4qx6S;|Ow`@3x&g3wJ3Z@8f)`ez%ke1fNNocLOr|CxaL%J70F~I!wDbu~JHY05 zqueRXj*GH#d3djr*T24-gZr4T^rUCcLX8LG^aJ2%MN10dUPjAH z+f7@UerBr9v@O^{s13JmI7jJ6jL+>B@k#A;J$8WNG z+B@I&V>YnYFh?-zoSE@duA{J{KeZb=_~W&^Z6{9XZnvjS$z z1a&vy;M%zAn!47V;+Dn3Ez&|%@PM1pU~4_$MoltRFmkjGA@K zIP`L;*@iP~Nv~9z&xYXEpV{h~kKWzaUb16!G~Rl?4WXwUKv#Ye9bjsw88*9}2BU*POpNJ~$FjxB?t@)y8(CZ6Oy;7RQ&l(L%T();;8AWj^yOs{ahO zZ*M=dLr|Jv(;Dn`r2Ah(C${CiZ$`hTagH&X(-yKR_8tBqQn#YdAxv_7wlzbY?oL4yrq?;gY5NymegpR>b2)8My=dp-FnZx+ zWAGw7@GA#k{&ecSIXZQS9_W$`Wy)X36X!fM<(aRinNym@7I7PU_j+4{fM8|`+27AN z#Mk(nV|vFust4jo7?T^ek3cMIZhvmw^eZgO`U(t zBOKEh9QjckxkrxKNp>fluOGjgq}7?0ZY1wv`Z@O;8$il_CL)JXkz35@SL4t9sie>7 z4uXuYv|#2Qhl^V0F82Oli{p}}+8#DVMw(O!z#lYo=6Q}fFPT9WWG1l-%qHpg(i|m9 z(98B~cZfULR*{iTYy4QK47KZ+-G+I5oL1asv~w&Kjly^DM*D{9WYf@DWu7>P%v_Y~FB$5b)l+VL`PM9v)wZX5+RbzmnY3JU^Vl?2 zsb_wbFPW+yq`&G6zll@abhp{v^)?I)uSPfG$>n<7%3S)mA@KHG3394>R&sMOgjd=K(Y;nLce0bC;9y zAr5OCRh2~d(_Z4W3s`>%oBU1pKZEJ^D{V`>(m~@bdW=JE6L!DRv^UeuR!_9&oE)Yy z#-XN1xLX>8#}1VXrk_*P$!Ct@FDs&*SLKXd?md@r(3`AXL1Ra)Z6DbEFve?rB0FK| ztf>DdPB}B0-ZCCcZKu;+&TO!j1UdzsmSz-n*2Vlzzxy@n6pjaS;f55AK%JMEf2lm! z7pMF{o|{c(f@X&y9>FjfoHD^Kb>mR6_xxWsP72yS>9 zp{l==$#Gi3cE%?k!#k(RBPYyxNSC+=Y}F&n=}h?M;@I;TW0LI?ZyYy+HQ=$~@J5dR zX8r}xl(9_g{)b|{;r1|)c&%qjc7jM`Fkk!*=UJ0USbkV*6P^Asy5pKQ*?Yx)VdA9= z{@dTFZ+h9S?rrWAv*8q1aI3oDGtB?0|FkSu{GxqhOtAghdo#U%+P=4*)Ub?J>f_nzyVtL--(8=9o@tK1 zr>@!Tje7Uf+mv@p^i!XY{eJS?*DKy5nT2gpIcVlPYvrVka9g^oaRIlTvi|4%Lyeo- z=j|KsN$0X>0v>3ytjBwF@Z5CTn?8EbUFS}*nQ-V`Rr>|J58B1nEvts)6kL3(4w?16YQE=pF8XzCTQWN zy(6A#p2Pt< zLwY%_q2vu5?z8g2#wU@v8{}`0`tu($D(z z_O!`d=l#&*>mTUzJabp(0R0vgy_UO)8E@m zQ_Mb1wBx<+xIGJUm)dbA$tmG<#3_|9xjkb|2dU}IaF)qo@0yHl?tYlFpDp8ty8U&P z>Fg8eyUBA_1HE;;HZwUrN5&vG5%*g~AG(FCzkFeGJHtH#oEqfErAN<7$HCnoY`fLx zwBH2ZV4p%hA2^Y2hm0i|MVPyEC z{mNwF7PcoH?Kr%aKet9-FvnbDb90kh-i*Z~*5&?W1-DFlZ6Q|a%XHG^etQ@`Yyth- zCH;#Ia-;oOe_`7HObR%?ogTP@OS+JIpJ*z-4Nui}DsqnyV=mBp1j%b|4N6E!4YYgQ zDcsvk<}S4zJR6Kog^Rz9&m5Y0*3I$X)U<|t!@d1BywU^i49l4?(?*Ws-8<`MTbQ~T zi(0%gskp;oOkzebkqTt(W9&JPd1-Q)bhti=X~uFpL3i7ywlV!yb?M9$rLfsezq!;t zgzHR1&Xi(+2WfY1I) R6c)kuZMgU8%=~+f{2#xTwtoNs literal 0 HcmV?d00001 diff --git a/static/media/disconnect.mp3 b/static/media/disconnect.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8cfaff6c06253a8b9bbe50dc0d5d05c4a25b6fb5 GIT binary patch literal 1586 zcmeZtF=l1}0w$Lb&k!RZLl%ew@(T(w^U@W3GE)@t(|}Y#QesZ7LU2iDa&}0hYY5S_413-^&w3C0*Djhb23xn^V5J7*a`8)ASWpJ=BH$)Wu~SmB<7_k z6s6{7Rsh*al?v|p`RO^S3Z8k%dPufLL`2Zb*8jgJ9D#TfiS*1%%Lj7#ftZPbf#nH9 z1F7IY$pC1VrH`YptFfM?MG@m!m}^8DR9FR^7#JEr?kM%Ux(OyRQfNp73G>`{+H$;s zxkPL2cI_uj3JklBc57@rmotr*p}~Z$azZxO{Z_Yd)K#$9}OR$+G?)epB%pW=1n=9LA9novfgAxAg&B5r3P5q7BqM|4 zJq4D7AL>8#cC<1JHasZM5n^`|XH`Cur-!_&v-`oU`xo3Bym%oMJl(@(rk zz5iKR$jfjc^J0afDaZf+KUaCe<-_}O-YGLgP8~^pYOepj{wS>@uLhL2WnW(a5)@E z;qYN#V4nZ`IVdr%T=9Upo1sI1`QigNhF35D#NOXq7r)0EB=yf3vo1*}J(-=+!+T*82Y~&8rv|a9m(8N=ka|z1Y&Q=V_j-ypvF)=>Ol7 zj&L(y^XzB(bG(6rfx!fnR0DrytVsHHc}i8-zc?)r;_ghVv{s;m3N-HP@+J()|YZPUw6 zn|9ZhUuJ*Q)NgIkxc0T_d*!`?(45zdVWj|ks@h9nmi z%S)9qm8`fNbA{=F@Q4NCr1+^mv3csb-{sYrRKuq0QWCzs`-*~Pi2QdT5?9s1IJ z==PG5{6ZNjD9%~u;^tHui`$awf>2-w+$7XmHPt9V5E_EK7KC{p$rE5EU3#yVk8dU8&-?e~lrL#vY_9vP49 zh1BJcBxd-IZ;wU8hI;^Wj z39OuIp-2^|iEKYi7o4GAKEu3nEhzcR&=lXuYa8N4Vxa_zI&)WrY_>u@TTz+TQj>AM zGVOd##?6|{r#0D(+Gq7|m3N+!)uB4-g0!vSH_u@mfiHJ_!tYqBsqI;UUOSub@|cd~naH!J^Ckp_lu;98(Y%m_n8|xxVY4YF=8i>|fWIJ!2ds25dQ6#vCmR ziYJ0bm7yLE3y&e-(-X#mgxPCe*dxNA*+s zCs+91`Uh>@^yAk*s23j(9_ns6?(ksYWWXHw5*t5eZ96ulS4|4M^d@I-pU-g*OZPO4 z1uPi6Z2{RZPd=^p=)ScZ)}~GA=T8pNp;xav9y~B4cJg}$i|*eVCO_ccgBA539ajud zGokmtxrWcLP|2~M!zTv(mVJ|9Yu%4lYTc!DRu}8Y>hia|kF;^eFyrb&+HH7u^-dxn z*i^pXp*e~m8kz&e&l?AnohUXo9pH?IygLzbIh1UAMkb>c`$lM6ytshk&`3b>p@I2# zRK5HJg=xT^zSg88aLnY4C~zv8+ZgK};0Ti17Uej00;1wY$NhKE)fKC*y-=_I4>QGw z4fR??m}o<^L@e1=QIz(!`u4e+%$w>vvz2#d4`r>a{W-9Hj2r}lM&pP{owR{FYN*~3 zM|C>*dE}JQM-MYE9S%zD4-!s?Uip%j{DgPSH$H_Y6!~Rd^HX26tGi>h6s$Ym4GDHIT+PQ=#*PkM%EkygtX6+h5Q&3vdul63z2hy z%iIFd)E_E*;?yzv8W^-Ze&ve}K#&WKUWtx#B!vi@AtGmpFo`(&mm>zKGd$sS9vJp0 zf&?JQ8gR0Pc0kz}R~)^Y!krItYv;SSf5_0Bpl$HtFApqlj17)H-^3sBdUBTt@!OhI zeTcnDi!Q&|^{U{(W(pj8u1E@kRB^|+A2O7af=g{%C%M#C-55XEbYxn9g*7uaVC*iR zoH;}1wBV9a$4ETTYV^sex4@n60_@P31iX$$5504b*JAEc=}L zPKaDDFX%XF)`ytQ-R8j}bFU?%yg?(G@xKYgmVa1p4zC(Zq#W^?GN{+@5m zp^Jkj&BK=Q{=VbArxpjlST+*6I9zJ(?LF21DM=l+EZWKzhr{3K!Y+56dOX}cJY2ju zTsARS#OyRb{xj$D#lG?WFBXT_pH;I`Bdi%;(lx^Vg50knR$C75L){!%PMomo>H$WZrjSfjhg#L-Fe!JI{Fr1 z!-d3#?|4i*YweP%%`S*LYk@AJaja-Ljd+Y2#awrmY6os*>UQDI> z_#R9*O?b4McH)Y5ot;pe>AE5P3^n@W@-W?WdO^4CMtZ}F99qPJF?UixHJv31z-pn* z=pBcfjPyi2EOi2a+&LYa&~5Y)3AzV>mC5Lzh;s+&8O2;X6IK{~G6a~7E-DJM>DSm$ zV0DQU?vU}IMF*^oRX5?dS`_kf}S`yF#nONF!Gxl={=;3MEFCf-WvKk6;7S1rASN_Rn|rxA!OLb))A8eIZZji z=TPG&_`%)Eq&N(dOvF;y1Cx9Vv)cI-w#h${6J||SU>Il-26=}gY~6+RRu|9ZX;fq@ zM6nHpbH_cv#HgNP80k5*KobM}Vxs4OZ5b->I8H#$WNZkg*@<(o8X7KOn;Aok4R(#6!I(| zwxmPu{V8ndQ^z^NMjAbk7)B?^<>%9+6a0rv9-NF!jW@?;sP>Md_`x>dUp2vph870| z$oJZ-p)u*ENdkdCLSYOum6HS=;fWv|NU|w?DY>fshuh%HT!QQ)&rF=}(XQKu*-%{* z0pdWVZlxF4&YDURbm^a>0FA=P3L3!5mc9kISa&OWSth%*Cvp}*JTR|U;6PAZ8A6bc z-8_)KrLV+q3}#R{yj+J8RVbLTfm=(L9^ft*woou@3*4E&<@k;9U&DhJ!LP;HI-jL{xw7`ztS7~aohei#!r+o{~4`BmJFbv=W z5v@zdkEsZP!!|XON5_qHJPdeyuuXQN0Hj1wOlNP9qHe|}U?zL|!7vCp96qHDk+lR& zvEG#SaE;Rh#3v)C2LdQv0b5suVFPw)!vNSHP6)g7V5B{L8FII{6sbz+E2}+feD~tD zyAEHoAlZ&{Sev{U5a5e85-qH)IG~Ee2ulNQaE@sje;lJlEjXbCfLd_Q)9s9NK#S52 zW7sMHS%{;@h91?Kz&XIE@qtuM2b`T_IvuB~7|+1#y7C{fsOj zz{;4>aZPj)p?GMJHl!rC=HT3s9$hLPa(Mr=vS*-T0`9^n1qr9IHoO_*LT8MDAdM@A zwDnz>;=bzYdfz9))5~*Iqneg4MQEBaufuh_y?lJlZ+1wdklnAoHs(>~b?DI9gUcR9 zTyV?$SdD5>S5}?Xh2B_I?OXi%C(D!1e?X0jH+eg+?k>n`1Zi511_tW+TJN`BYNQ=r z(d2W)R|oJ#kh?BbFCkSyZgq8adD_mAxuro{b2Y{f@4K=cWU`@9oL3cBN8fR^ckOfD z^bzuEPm1|>w_|Q@ksEjs-21DtM9a4bw(lQ$T^5vpsgAwh$FP0t|NZ&Yx3dg=Q~&Yn zAJV=b)&A*9)ZZKS*yVrF=6&{$>m@zWSvjBG{`^Ul@w@NlT+MCQ{&bV^hr2tr{ZT$- zSggN2;y3yIn$b~* zgNLCjQ~p{Ichf39wd%K1kN#Tqj|ZNc_CGQ$_ga3M+4TDSjg^T-Pu*T?{o>qrZ{M0< jxIK41^keCb2kVdh=ifJXu}>c?xOZB5^2z7YcaZ-Bex2=H literal 0 HcmV?d00001 diff --git a/static/media/disconnect.wav b/static/media/disconnect.wav new file mode 100644 index 0000000000000000000000000000000000000000..af5c25447cad1a7ebd705e0f28ffbc4ebec01f49 GIT binary patch literal 1492 zcmcgse@v8R9Djbiciaz^Ls1l@Ugwr2@*^}OGz~%I%0mZ-QkeuC2WQ9K0Y~UYx-47F z)a7)e;WE=P*TBL;@<+^7&eSBAzbaP~Jp?=m9rug(eV^y)IZjqvTYvVv`@Y}L_vh#P zJbT`^z?hr+qY8laS?g9>tKFgj008-u(+0r%#SkE10G3jBX{^8l;|l`D!a0onTPVYT zjz`0Yj0@sb5eq%430ME^iCE#-BZ5a!g$cYvq&iah&z=$Xi8(0Go0ux%n|SX7C&5lI z1!S^vdX^j{_sLm0#1i2gv|}`Hbic39e>I>4+5-Cmoq=NAm z757*5CG~X=Y#yd*dUkOB!04bbG7y*ptMvU-d*g)o z!*Q2mzS1Uuxxu#{T=!<*Upp*}PL;ag*HIUB8G1$YxZt2Kj_vVx_!yUOFg$qe#jha@$x#a7rNLuL`C~edGzGQDJ zRU_KN(#R1xLssM#vWV>l80F&%Ay;)rwO>^ul%Ym;TuGPC1qb|zeybk^)zT&6ga?G} z>K=86Y5~5=?kESO7sfV>d8I<~1^7;|YT9($^qIP)QOogcW|eP;wgiiUheJv7Myfz2 zJXE(tiBV(18JJAZNlQb?!SrBaXpS_j#DjTwi>h6HQr)HM#t!%{GtdTdo}8k+Y(6YU zX554K;?2kaJK3xBfif(o$g=mx9@%UCg$$znP}Z?ij~6^7tvkbrhpLYI>LN{doRHqqlu1AVXr?L-a~hdzSS z;Z}aT%h)j*P0x{5a)s2;Z4AR^^d(mC+c*Q|gH&o)n&ci?Anmjn%tLwjV?2ts!y(p5 zLqtn2(W@*LO0X66pbtfY)IQ>;>Iy84W0v%08u@{7HWWJJIJ@E1bYyKDmz_ zrFY3`VxX7lT}Hqle2=pip__04KZ|~5;S9O-8tEoU)K9->UEmm8Z7ejO;vcRtKX;8W zKg;wO$7`J~m(5WruC`f3rLVva|Ct>L3Rp@h>D3z?1D=EvU`uz-ruBU_Q~#t$;m4y9XNPM z`LN27qpIo}np)aAa9ut9Q>P6Kjf_o9&CD$<&mxdk);6{%yYm+uoGxB+c5!p}xZ>&M zef65JpFjF~;EiBRNGLWe92XH86^$pv#@&fe`bYBJl(h7WKQixSW#`<_FDNW}SX}am zSV}5;{G`01^69gx=PzE8t83~g|EzClY-*;qw7za@@96C6ruDq-?du<)5560EKg<{% z8~?zZnx6UiX?E^2YkpyIiOu1D`MUgVWp$0W{(Xc0V^aW8fc?64kGric&72~}*puJ$ zFZu3o`TD^7g6!i0ptIBkO5Uq&qd_Tq+a;1aNFFdpy_Tsh6;ke`xm#q>24!fa=hWMv z;sYgb><^oDAnG3Q2=kPx2EWMM)1P1Ue=F$c?f#O)7r0*`>hL06UH3k1`pl7y-5_97byA&w?8ty(3VB#xcUv4<G zd7n?N;G$LNMdS|^8jLH}6#pekfQfYknEh}J^FI7BbgFXAt=2=FOYlnEy!1@p8=$yg zR{QL5;E9J`O}aIDmjNZpgzEy{n7+yMrqqV@*=O=Wwom1=mlstzgvGBiZh@V_b{J4} zZZwdMV&=%ls?@oj*TEgB19ih)J-Mv&0U%)o;?<;KH*X?*<$-TW7%s+uuhh_DAjc~5 z0iM>pO%z=Fl5DvKMiaytE=SA0=1&`8>S!WvS{W?@(f-=5M7NprSep+hI+tLPuaQO^ zUj2g$Cd}uYswy*=kHjQJfE;ETS+VD zw!Z*lsx^*3KeDMQ1pLlcrIzu8sUT*|p-7kj-?*=qf##gW9_8_EM2$A6$#M)hG)_R@Ixf^Bi@#U(n+S47b@K{0hh+CDbS$de%e zKRKHo3=g<~B!W?u-lC(KCFW};>j#Oy)LczNV6<5FYM;<6`X1#o>v39G^wfXAPOJKtOIoNq-A0A9%`d3KldRq(wReD2D7AA_=05u>H4eJwp6dPrhl%SUz=G!0Q0*Xb^@ ztrCMLwn3R2>_0UdjQ`UDbJlCaQ1E$c}XXT`!M^Whra7N=v&4y(mb4Ol~PjW4}N(t!Kc`;P6h{o1OlAINg z#Km)J?S3Os@Qso1HXAZ59pU-lnp5(ncXXB)#Z1Lb14&d%QJoAp1#4nvIdIkkkVLm1 z!2R%xX$W2ZpbcN3vyA*4)5?tWX9W6odU=^x zTAb7xwbvGyoxd}UBu3B4+9o#yGo%=YEL1P{fCMl}6P}qFCg=lW#945Nst3DLz>jaS zDD1eZ)UGcIdTgs5x(fL9m#V*@_f&Y{p|6O?PVpB@SnfVzH`c37_#kSlBRpaCr#TMZ?hD?ABpF|<&1Jh~eaQm|#VHmy`V5qNy| zI#v1}`cLox0iO zL!%E^D^o2)sPrtNQu^|5?c-_pQTq+FF*Ti5QIe0LlLiZc@T0H%4CZlO9W1WYB-(JE zmwi&PbRnV}?|>N@dRcV%%y@rXGLE(KQi;SbkRnY=zb{gG)tllF9QGckdNc@5!j5Z| zZ1j}A+jy(`J{&u|tjB(P6m`5;kz2tIn^6tyJ>JeSESnRppf2r;@77&Uh$=efIf1!) zy%ua+HF7W+;U+o;pxIAzqRy}{gxZpjGIj7lWSy*sM9^s}sdX%BxGCWFP2NI7QC-eW zczq)-SG8lT>I0`+<6~9W^sJ|AwP1G)N957`>Sska>fA=pzPd|H4gpx$Rf&rab3V4c OSJr3kEUV1D?)(dC literal 0 HcmV?d00001 diff --git a/static/media/dropdown-arrow.svg b/static/media/dropdown-arrow.svg new file mode 100644 index 0000000..4e6ce19 --- /dev/null +++ b/static/media/dropdown-arrow.svg @@ -0,0 +1 @@ +dropdown-arrow \ No newline at end of file diff --git a/static/media/handclosed.cur b/static/media/handclosed.cur new file mode 100644 index 0000000000000000000000000000000000000000..4851755a1690d6631be7c32dcc7e001e6372aafb GIT binary patch literal 326 zcmb`>ArgZy5QX7CK}5#YAc(B&4cephDBOgraFhrH5{cWsZDtreZ06gynH32{0;NO} z9j^cn;3-8u5_G)Ae{U_GW-~k8u8*mL%Q9^6c6*bRZdjrJa+LmXTW#6QRhg67=(=WB LR`K-RGPP%aOVoiS literal 0 HcmV?d00001 diff --git a/static/media/handdelete.cur b/static/media/handdelete.cur new file mode 100644 index 0000000000000000000000000000000000000000..170320fc281ab02ded109f0310aa180b77e465f0 GIT binary patch literal 766 zcmeHFF%AMD5F9v?Yp*cIl58w|z?Bw6?qT>6zj9Bx!ot!YtV7NVgxDBcCk(s8u)7HX zurTm`K#vX&3+w@$NKXdRz;P$&Z5XzMF{K1mWu^!r$3MP#feGL$h{26T0d9<;Xe$zH zyVWAc`hK=AyHX$`lT`DlMSN-BYBYYUZ7#3struI#()e@6fAbs8EI*J})n~VIF{(3v TWO5|WGG}sm$GKO%-`24&Q~QG0 literal 0 HcmV?d00001 diff --git a/static/media/handopen.cur b/static/media/handopen.cur new file mode 100644 index 0000000000000000000000000000000000000000..da44588b2fa68ee115deb843e1ce6802e58b3e30 GIT binary patch literal 198 zcmaLQu?>Sj429wUKPx#1ZP1_K>z@;j|==^1poj532;bRa{vGxhX4Q_hXIe}@nrx202p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-17k@~NpgWidAYDCB{xzCg$v62`}%y(^E=vS&YW}R zIA_L8olku(cINkc=DV|JXP$Y^G}Nh61N!>ipY&rB1d5HUQ4bI2$I282@AHyK}XVm^?T%-*F?qH)ui3Sa`u+&-jj0bVL zwS>a{9u)_eXS=n3rrYGvYrCUE(?!=C$~~N7r6r**{=hU$!eUp0yVzo-WuZ2a!0TLJ z0iUql$|6C1B7u*(z5;rzBr@u8tsXTG{K)kcu-Hl>Lr)@s-@87KpE%k|B12ESfhpGY zG3;Xh#!4!JzSsi~$FRVUt)wF8i#@RJaGEUzd1)mTL0=-D;U})oL-+S+_w|0zlStr` zuFper(`8l?8F~^4yx#Q{p!sm*rv^cNB7rAkezxBq-L6+#StO{BKd_+bit8;vSCCa0 zY5GT9Vu3rc*z{6o|2R&>lEK-ZSYTb=cIDcOqqBV;b;c*)Kx_XC+mZ<^Xw>uEh1?M3 z(Pi%y>IrxU>dAU7-oha91Qs;wR(&KlOzns-a2^KHg2vO_aMcrkV8KAcup6&q*zG$i z$pr2XgO0I1COn2=!MOfm$0Ig(ombIs%8m!4J6% z9;ps|z-91Ab>Mw2gGZ_Z?{yhGQXP1Y%ixjfz`I=rk5mWV=`whvI`DRv!6Vgyx48@+ zsSdowW$;LKV9hmx)X#9u;NY423}@~tk-6(|=I(Tvn@ePFwwAg1aOR#kGWSdu`sKLo z*8VwelZU<B?g=~xQY`6?zK#qG8~eHcB(eheOiAAE zE)4(M`_JqL@;D1TB8wRqxP?KOkzv*x37{Z*iKnkC`y)ekTZU8^Ck)Z(J+#Hpl_C8`@E!djcq-Ly@x zBTzylkXvz~n63)P!qy8)8Rakc|JeFrpULw(GmRfFOaJ>g@m}$>%6o-+icyuvlA~g# z-8f+KK4L!G`48+3hav)4p7 zzhyRSJ2=bg?S!2ha%)7txbUp$$h`W}H23r#(QStdzbxEfJ7dT8@RqkLEi4oc2y@w8&^UpAiJqTb`*wXihmckC(N^~E_!2Ny5bExE#6ALuRd zy)(Du_(8FG)eqW3W)~e^y#L7IcQ=lf^Y5Ly=2L%Cq3Y=y=WjMq@3mx?nq_!+$Msi{ z_qVCPzL>Gs^~U+0L-RJ--s&>VTfKC@$v?X(HxCQ4NiLkf_T=)i&OWx7p;d1f*Kx8c~vxSdwa$T$Bo=7>o=IEp!bmb&ZTe3@xpU%&bf-v<(cb3=AX= gELw!3AvZrIGp!Q0hRnHAazG6Xp00i_>zopr0ACYJfB*mh literal 0 HcmV?d00001 diff --git a/static/media/quote1.png b/static/media/quote1.png new file mode 100644 index 0000000000000000000000000000000000000000..826583e0ad72dd1424a2ffe9e21a8b653b596058 GIT binary patch literal 738 zcmV<80v-K{P)hppyUq0&_`3K~zY` zwU*CIR8bVizi%)dr%W2FnSNk}mX$CPQd80l=@=9tO1LP9gf>Aze?W_ZAd3nT+6Pk9 zB8q4gJZRIxeo$192pP3d(M`3B=|$fbGxNOndG9^1MQ3#neBSq+d(J)QUf@5Or#j4F zE9wy-zzpWS-|kPDMh6-ZAix6Vys`~za&kJm|imv7ub-TtLCa_4e4I5=UIc=oR zMZp~HHelG>w3R-sf=NDc2!CO_CY#_mUAB7>EzoVZHQ_FSe#`~{NC3zSC#Rbm6>q&j z@5Sbta9Kce=vKUpKxc5ECM?@Y)`jaPksjiTxWXwc3)c%Gy#>t`;U6*3bhw@s=`#LQ zgx|zK7hC@;CdDkb013dG#HfHafZ=eN#h56ZuI2a!d?)%Hf#Ti4gV;lk^&D{=`uAKH z>As_!bMQrNY%+xcO4tP87l0Fr(gz&zW+I^^kw+i4SLqVeU+?i=+xKuriC~HwgdGn= z_h&iBtV2O@KjE8@OLZ0puFhMItm66JPiMSI>{r}(jwa$xtr%TGBJ>G;*cI`RvVMxs zLL&On7Or35l|6!X?J)HV@n-o}p+{V2`o01_tPF04@MVR5#+7#Pn08lp2(l%u8a;OK zp!ISz(Yv&yU9p3`nyiop<}_K~ng$MQvd`J#lr2W)iTQcM6h}31f?4O#I;+uB+-3%Q z`0*cPJNYsaZJP;O!<&(@=W~@+w3!zp^n`Il@%WNyddXfg_AZ&jjk(TlN%G=_dLieUI)}5eKVv-52W;%U3({kc=kzi09cD^L9+|y1X;sFF|f& UTm9BGZ2$lO07*qoM6N<$g0UG+&Hw-a literal 0 HcmV?d00001 diff --git a/static/media/regression_analysis.svg b/static/media/regression_analysis.svg new file mode 100644 index 0000000..7928635 --- /dev/null +++ b/static/media/regression_analysis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/media/sprites.png b/static/media/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..20aadb6c4c31f4a46f0a3316241788687c2fc444 GIT binary patch literal 2595 zcmZ{mc|6mPAICr2%r$G9Gq=d~t=uisVbfeWBNdTjj>;KwOlgg3o6w=$VTiUQqA*5Z zqeBNdlP~3NLYQlgzWe@uzkj}e{Qh{qpO4r3{dzs#|Guftj@EE-1#tiX;I=k+7Xf_) zby-wM&<|a|;wpep5Y7Py09EO*O<$-$s}XEm8~}i*1puUE0N@Koq-g-SWB>qM9{@1R z0sy&)yoTe41PidAoi!f#eKY-ivp|VO*tkatF7^LYAPb$`IKfQF7LPj-H#nOY93tH> z^E&<2Kvrjs^Dl@_DIESu)`EnM*Bvjyqg;;QL)~h5irx$z88=G~Q?ZS;dNuY=N~)rP z!{UdRCeJC3|^p@Y^MmSaw|O zqcgnH`mt=(`nwksF1OpdRwptSWL&g;<#Vt5VHL)|uKRA9#vdbF_=0_?$=A_m z@F%rT_!cE|G&D6rw}mnJ1_l_g{vf!~zq1Xc|EB$kXZY!_p79<2K9Yrd(OT{Mb{mHR zIvKG63$q6jt50+|q)^*;#+gBVShnFY)z5nDzRVi4ozb?LsVO@_w2}`s^Nsd45NuI& zhpaC93Xq=!P!5F+t|m_?X^7vZ!l;zS{DCNSO=s(#>vwURfgYrFL(a3IT>5^I1^Q*X z;)RoYq>tsN>gj(j@5Vm}xi@}SsB{RVwp&HMV7`=duNpIAN9DD77D=bx@cS4V-&vPO zs5T{9CdzxiGP{x8MkGN(d=iBWQ`V%DcFT)=J1o)t)H3Td!oc1LAK_<(d3rW6p80;H z#aIj?rO_f63gW^WOh=(%{(Ndk<7FM|l3yoxnrDV*OW1=m7B0}%cYUk@slC;DWXDJ- zbzq}6+noaUhkMwYaDbO3K#1{=500{dhi6mjFD;htRSp}2)l%ASo_Jf3u6|gk06e31F|)O_QAS*Z)CL|=mx)^$~0VZ>4RvI2=-oxLwg~Smc)R? ziic42uNohoj(`9tgiNDgQA$gb7jWL6o!tQebl792!%r&rX2iIfd zwjCA3av?iKJ}2lJ8aH!`0%DB+fVum7^Xn%nzYa~JUtU>O2ppA|Zv3&d&9bUmk59Wz zU5`&9r68bYF9iuIr-eb;&1xz9u|eaG%lNMHX%7WXx1|oiTEa z>5u=TY{rZ?nC7g%a>`NFGkxo57ecI%fnP_0QMi=h$usgg0U#K-lzo4ICX2@=XH+sc z?g*KF0<%eFSi+hfrgUltlJ2H-Z zNgsLbj_fx9j~L$hL?f1QThz~tgbFXL+ABGfgeeV!y6)b(&XBAjndVe&>reu7Pyf=x zBRL88M z)}J=R;=En-&;r8ZUsGq!E5bTZI30ysLn0@>FMiMaxg|*of^qCKqJSvJ z0d>D!A)AgP2XVYFBbH^}&?+aq&<1wvLZ5NZF6a6EL3a$E&MWZh;|@dmkt_PPY2swc z+FZ<9_A}S`S(YM7D3}&ZL*Y5Un?gWzqSNAI^s+V*l+rQuSk)OZIwLDY;!Y&bp^z16 zThcLSRSRV}#c|Rc5zKweZ=hGB3IQi{K@~RcKnG~SYLwuCuxQAB7^l~i#Xn5RuLq`; z3x`vtuuU4;q_@_T}uEHsg z*4`$9M+;xYYtcWMNO>;}oflgzXxnCsdQ{_X0K-Pe{Ar=B2@EJBsZNI*_oq#3H~VyO z1+Z!ok$uzv#fhVV&1M?SNP)52x%dd@WR24 zUs;*7RYd??6)qAX(T^L;oAxHFSVQ#WgHm$*kXwB_I_3T3&DJ&FrTvwioMQ7?w}NWCd{15EH?+j(m|Bqcpc;aWOw>o##G#~R~B zUK2Wj&~kbSK&DkUi_rUF{iq$AEzUzRN$hp^Ov$CFzCgWie8o9+7{CS_K5>u>-XXU?4pmmDU ztF($Uj}mD;7m=xN*ZW;doJicbKz@!Nb9mH-kEnvphMGQMR4LxYt-BP2MOr8}%g{!FKX!$g&pF<7_#5Ou0bt>ToPvvMIf;;DVHCXEYR{K)FG zEnpihSH8kHUn+U2iLU)o$`?z z?v&TgUglV~^_d5mvWG1PRPvjab=@BKopM~Yml!&Z@v1m=-&Bk&>c>i&w<7pjKM_7i z4O-r^YC0m*I}`em?^|CtlgnTzZ-0t#cSAfpe}nN7yeacKvaa!Lc^~0`!h$)k2vJas zVl6|mN7CebXQZr}Ji;q~o8Mu*J6`Z0{e|F3(u}q|9qsQM9biU?3=jY?GB7mVXMovf zWPHL9V`hXlGcny`U|?oou(O3u|5qS1-2Z%F{QnP}&sR_p1myp@;2Itn9qStz0K~?| g>YWb@jw1L*1n7lF2IbBjQV^H`TT4g$QwtyR-{S78%>V!Z literal 0 HcmV?d00001 diff --git a/static/media/sprites.svg b/static/media/sprites.svg new file mode 100644 index 0000000..3f09ef3 --- /dev/null +++ b/static/media/sprites.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/media/upload.png b/static/media/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb54bc004db5b329f564e36c3a94560c5c571de GIT binary patch literal 4984 zcmeHLeK^zW8^8B8Ok{`NbdY3`h!uqhm6}P?(TmB+q&U?nPKq?zR42VoZHLG*rK7q+ zN=qfISC%2wnU@%qLq(RMW%lxW)Va>}`~C6z@BDdoUAuOF@8@&h_vdpz-{<>0`yLGr zqKqH+{Wt&^Pxbfv0RTfL1_V9yGqm@m68+%gmr&Ob&?lL&`3Sl;i1Vk#BYe}?7q?_q z&R*o4x_epZ?vU8%-HDOAwm@QHqSMx$+vB4m}UKD2GTbsjLyI}%3i~bzW(nFTM+_vnpfvxfG3kEtmY**_gu95!RHeF~; zwecsfKCkO=v^DIl;USivsej&#)+vY9>D^pspIUvt#kEW^%&TZ>Z3yetj*wz%T8VCq z#1z@WQEgR`VjBHb*!G41`CF>=w=R9|z1<2fiTH89_n9soYQL<48UM&5_3c&+Ze108 zen67>%QH#N?tg0g9H<&sQ8_~vk=y&TFcgCYmj$1Bq^jJmAE}j$hT7ygA{l8!Egf|$ zSZH2igvO&4Wf}%YRpWO?wVCtEYdmX*36xkD3CuaFJsfkp${`)9^ch3@=24Tb9vU$z z5?J}m71WLMUaauqbPZQ1m^ts2LK6dMW=UH2P&M|Vl`d5;d$_8fWa{hL5&BszYx9X< zQ6NZI$ticy*7=k--DW7x3Xd5;=ygf!TBB|#E&zl90*N%U>!VKkr_b$ES(D^5eM8SnT5~um+7pVZjH6m2Q|laT!0}E4D`RU> z#R5?UwK8gmmY{JH6;&wG+1`Y>eHg5}C`gD3dZI42O357bI?Ejp>Mys#yPs=JC#Ht9 z)+sx;m#84BCWQdirS~i55;lQxu#$O5E93<41-1_Un8t5gH8or?*1jx_yz7a4&WloK+ z`#NCe4?-~KePv1Z7gV#!ZOgyaG@1dOM;3U0BLg^~{IL03_0uCI_XpNwe+`NA!+@RF z`Av(>TwQQ+@cJ6jNx*}+rcf(I8nX=`>nKfo5Giz#`-fy6XF!J zc^m|Z3bk*>?CH=sQLMan7)1tPP>diS5UER@t8K#%)3j^Ryap`>;moYzi211II6QIZ>0&&KrnjA!nM*$(5rmZWrfqHA09<4UK zZUYHk-50$|HNT@UPmJ|ktUR-s0)7yjMbkd-BjkC-?w{?_8hO`XC;1wn+FoEhfT(Y>dtoD_u-Hv1Uh{usdrwW>W&bgo?3NqH=)< z9Pc%4iwi>7AcO@@Xqz?MLqP5jJY0>D@NI6`uM^3mH|kh+UrfsL*Ev;&*%ogyKsz6UPE0$FW|E zl_4iAagGOoJ_~u#JU%pl!*hFA{gQwu|3)b`ij-I(o~U1q*~4j<)yNJ(gz`;5TwmzJJ8Fru_!a2uqScYkD6?mJ zRQ5?4vl-32I0(pwC<)@3l>zi!2r&;K%wuPF( z5Rr>`;F5cZ6r_Y}0v6&zABzl2T;PNJFyl=UD|S6XTSIdWjcJCKm9Z@}A4ewg8oxRD zuu`mixEFQQ4JXV-x|SiP6tV;q(rJbni(QT`r8}q3f+ZoKgLyJT8()W5aSv{$E8O}tFIFIdp`0E!nt=nn z6NKGfb4aw!zoO>4(n&x*0$0%=BSRE)kiF8bijUTidz_a3SO1ybpG0XWn zS#=SgrD`2I$pm=$g3mWdTC)hkp*j1=qV!>@l|{;TnfI^3-qwB}qia;Ts4)g-JA8$7 zZO>p&IL3;3SHZLw^>UMc8lthN$s|!PLzaHRn@~FgZu`pAOpYp<(-9>9<9;>n^Pqqv z3);nysRtU;i<+9C8{8dtTEVy+sxhcuzc6}yY z3)mIK$w}~OFi&!t)qj=hT{W6CU37_?d|9D6dH&L-NqDfx6Ljmi2Fu!gwi+_zmH@N- z0elyuq?fZ$UAtOIy}i6nr$={NvggMT6a_T}H3;r}j@ycnx}sgf}Mo9WyCV8rG( zK=A3&hDe3gs(+wo7Trf1^=FCsi!6LW7+LA6gkMKW({u>nej?|YyQc3o`U_?}*z#YP z{_j&*4^%A=abYrbiQ&zJX5Dqg3h8ow>Mvp2*V`qzisC8!-?OT@;T;UE5oTee7PlQJ~Tv=n_Rul(5X=WXp5)6QUw^`d!)(Y^U1bMCzvqT`7^O>D0w%F#W&xx4dO|;gr9JH+)+$J2=&x@RWCvz;f6(TePP_ zQBAy4bAJ`=ldU3+yjprq2Y63Y(xfWx`vtiDaTj_4&LlQXoZ|6iJy4&AF(QL1PtgTr z5cmFGp-3ZE)R5fzq@!oJ$-9qj$HAGQqxL&BqMOVpruI-122QRm6$zXO9ErO9;|CId zg9uo;40hw*r%ao8_JzUbGQ*^@ZnCCVt?(+ zDd!xZ(oKY(1U@5=ad~VCx2=t#O~2yoRr@BleQ^hmoAMZhEsHX`>f+l}+^KGgVX4+y zw4vv&H~ieTAyM(1Ccb;OOrf!(_VWhk1N~rsTl>-&m)b^BhijTYpWRvTK#^1dG4JELs-{eZ}GaDZ}Hkd=(4d;5D_G&P>a1=k7Gjlq6}`w zNQ1Ij8%`O|BB8enPNE1>QsZjGKl6PfFZmVomb2)LcE>@ z?(4UId`#WHQ!zMU?tBp5^~&g~d#jV literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..a44d9a4 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,725 @@ + + + + + + + + + BlocklyML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    ...  Python + + + +
    + +
    + +
    +
    +

    Upload

    + +
    + Drop file here or click to upload + +
    +
    +
    +
    + + + + + + +
    +
    +
    + +

    Download Code 💾

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

    Tool Tip 💡

    +

    How to upload layouts?

    +
    +
    +
    +
    +
    + Follow @chekoduadarsh +
    + Star +
    + Fork +
    + Download +
    +

    + 1. Click on upload button
    +
    + +
    + 2. Edit the Url to downloadable xml link / Or drop you xml to drop in zone
    + 3. Click on Upload button
    +
    + Pro Tip: You can use the default url to setup Pycaret Classifier on Iris + data
    +

    +
    + + + + + + + +
    +
    +
    + + +
    + +
    + + + + + + + + + + + + + + + + 10 + + + + + + + + 1 + + + + + 10 + + + + + 1 + + + + + + + + + 123 + + + + + 1 + + + + + 1 + + + + + + + 9 + + + + + + + 45 + + + + + + + + 0 + + + + + + + 3.1 + + + + + + + + 64 + + + + + 10 + + + + + + + 50 + + + + + 1 + + + + + 100 + + + + + + + 1 + + + + + 100 + + + + + + + + 1 + + + + + 1 + + + + + + + + + + + + + + + + abc + + + + + + + + + + + + + + {textVariable} + + + + + abc + + + + + + + {textVariable} + + + + + + + {textVariable} + + + + + + + abc + + + + + + + abc + + + + + + + abc + + + + + + + abc + + + + + + + + + + + + + 5 + + + + + + + + + {listVariable} + + + + + + + {listVariable} + + + + + + + {listVariable} + + + + + + + {listVariable} + + + + + + + , + + + + + + + + + + + + 100 + + + + + 50 + + + + + 0 + + + + + + + #ff0000 + + + + + #3333ff + + + + + 0.5 + + + + + + + + + + + Print + + + Input + + + + + + + + + + Read DataFrame + + + Select DataFrame Column + + + + Add Column to DataFrame + + + + Dataframe Drop Columns + + + Dataframe Sampling + + + DataFrame Filter + + + DataFrame Map + + + Train Test split + + + 0.2 + + + + + + + Generate Classification Report + + + Generate Regression Report + + + + + + + + iris + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + + + 5 + + + + + + + + + + + + + + + LogisticRegression + + + Naive Bayes + + + K-Nearest Neighbours + + + Decision Tree + + + Random Forest + + + Support Vector Machine + + + XGBoost + + + + + + + Linear Regression + + + XGBRegressor + + + + + + + + + + + \ No newline at end of file diff --git a/templates/reportViewer.html b/templates/reportViewer.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/tableviewer.html b/templates/tableviewer.html new file mode 100644 index 0000000..e69de29 diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..04071b7 --- /dev/null +++ b/vercel.json @@ -0,0 +1,15 @@ +{ + "version": 0, + "builds": [ + { + "src": "./app.py", + "use": "@vercel/python" + } + ], + "routes":[ + { + "src": "./(.*)", + "dest": "/" + } + ] +}